diff --git a/ChangeLog.md b/ChangeLog.md index 2b9da84626..547fff3a16 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -16,6 +16,12 @@ KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> +**2025-11-16 Alex O'Ree (alexoree AT apache DOT org)** + +* _3.0.0-git-09_ + +* [JSPWIKI-1198](https://issues.apache.org/jira/browse/JSPWIKI-1198) - Plugin API change that enables all plugins to be internationalized and visible in the auto complete suggestion/snippet menu + **2025-11-16 Alex O'Ree (alexoree AT apache DOT org)** diff --git a/jspwiki-api/src/main/java/org/apache/wiki/api/Release.java b/jspwiki-api/src/main/java/org/apache/wiki/api/Release.java index 1a0998d2a9..b549a4c5ac 100644 --- a/jspwiki-api/src/main/java/org/apache/wiki/api/Release.java +++ b/jspwiki-api/src/main/java/org/apache/wiki/api/Release.java @@ -69,7 +69,7 @@ public final class Release { *

* If the build identifier is empty, it is not added. */ - public static final String BUILD = "08"; + public static final String BUILD = "09"; /** * This is the generic version string you should use when printing out the version. It is of diff --git a/jspwiki-api/src/main/java/org/apache/wiki/api/plugin/Plugin.java b/jspwiki-api/src/main/java/org/apache/wiki/api/plugin/Plugin.java index 950496a41a..8e5bc47968 100644 --- a/jspwiki-api/src/main/java/org/apache/wiki/api/plugin/Plugin.java +++ b/jspwiki-api/src/main/java/org/apache/wiki/api/plugin/Plugin.java @@ -18,6 +18,7 @@ Licensed to the Apache Software Foundation (ASF) under one */ package org.apache.wiki.api.plugin; +import java.util.Locale; import org.apache.wiki.api.core.Context; import org.apache.wiki.api.exceptions.PluginException; @@ -48,5 +49,34 @@ public interface Plugin { * @throws PluginException In case anything goes wrong. */ String execute( Context context, Map< String, String > params ) throws PluginException; + + /** + * Provides the ability for a plugin to provide a suggestion or template + * for execution within a wiki page. Default returns just the FQCN of the + * plugin, which should enable it to fire off, however no parameters are + * provided in this case. Override it to provide example inputs to aid users + * with configuring your plugin. + * + * Example: com.company.Plugin inputParamter='test' + * + * @since 3.0.0 + * @return String + */ + default String getSnipExample() { + return this.getClass().getCanonicalName(); + } + /** + * Provides the ability for a plugin to provide it's display name that + * is visible via the [{}] autocomplete/suggestion mechanism within the + * editor.Example: Calls My Custom plugin + * + * + * @param locale + * @since 3.0.0 + * @return String + */ + default String getDisplayName(Locale locale) { + return this.getClass().getSimpleName(); + } } diff --git a/jspwiki-it-tests/jspwiki-test-plugin/pom.xml b/jspwiki-it-tests/jspwiki-test-plugin/pom.xml new file mode 100644 index 0000000000..339b15efa3 --- /dev/null +++ b/jspwiki-it-tests/jspwiki-test-plugin/pom.xml @@ -0,0 +1,18 @@ + + + 4.0.0 + + org.apache.jspwiki.it + jspwiki-it-tests + 3.0.0-SNAPSHOT + + jspwiki-test-plugin + jar + + + org.apache.jspwiki + jspwiki-main + ${project.version} + + + \ No newline at end of file diff --git a/jspwiki-it-tests/jspwiki-test-plugin/readme.txt b/jspwiki-it-tests/jspwiki-test-plugin/readme.txt new file mode 100644 index 0000000000..3997bd9f9b --- /dev/null +++ b/jspwiki-it-tests/jspwiki-test-plugin/readme.txt @@ -0,0 +1,22 @@ +This test plugin was created for testing the newer (v3.0.0) API +changes that provide plugin discovery and the ability to get +an example available in the UI. + +In case that's not clear, after installing this plugin, then +starting the server and editing a page, ctrl+space will show +a snippet (refered to as a "snip" in the code) that provides +a usage example in the browser. This helps to eliminate guess +work and provides a better user experience. + +To deploy this plugin: + mvn clean install +Then + copy target\*.jar $JSPWIKI_HOME +Where $JSPWIKI_HOME is something like + tomcat/webapps/jspwiki/WEB-INF/lib +Then start up the tomcat server/container that you're running. + +That should be it. Enjoy. + +Remember this is just a test plugin, meaning it's only to +demonstrate the proof of concept. It really doesn't do much. \ No newline at end of file diff --git a/jspwiki-it-tests/jspwiki-test-plugin/src/main/java/org/apache/jspwiki/jspwiki/test/plugin/JspwikiTestPlugin.java b/jspwiki-it-tests/jspwiki-test-plugin/src/main/java/org/apache/jspwiki/jspwiki/test/plugin/JspwikiTestPlugin.java new file mode 100644 index 0000000000..41b52edb92 --- /dev/null +++ b/jspwiki-it-tests/jspwiki-test-plugin/src/main/java/org/apache/jspwiki/jspwiki/test/plugin/JspwikiTestPlugin.java @@ -0,0 +1,36 @@ +/* + * Copyright 2025 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.jspwiki.jspwiki.test.plugin; + +import java.util.Map; +import org.apache.wiki.api.core.Context; +import org.apache.wiki.api.exceptions.PluginException; +import org.apache.wiki.api.plugin.Plugin; + +/** + * a simple hello world test plugin + * + */ +public class JspwikiTestPlugin implements Plugin { + + public JspwikiTestPlugin() { + } + + @Override + public String execute(Context context, Map params) throws PluginException { + return "

HelloWorld

"; + } +} diff --git a/jspwiki-it-tests/jspwiki-test-plugin/src/main/resources/META-INF/services/org.apache.wiki.api.plugin,Plugin b/jspwiki-it-tests/jspwiki-test-plugin/src/main/resources/META-INF/services/org.apache.wiki.api.plugin,Plugin new file mode 100644 index 0000000000..80a7487ea4 --- /dev/null +++ b/jspwiki-it-tests/jspwiki-test-plugin/src/main/resources/META-INF/services/org.apache.wiki.api.plugin,Plugin @@ -0,0 +1 @@ +org.apache.jspwiki.jspwiki.test.plugin.JspwikiTestPlugin diff --git a/jspwiki-it-tests/jspwiki-test-plugin/src/main/resources/ini/jspwiki_module.xml b/jspwiki-it-tests/jspwiki-test-plugin/src/main/resources/ini/jspwiki_module.xml new file mode 100644 index 0000000000..08e4f49d19 --- /dev/null +++ b/jspwiki-it-tests/jspwiki-test-plugin/src/main/resources/ini/jspwiki_module.xml @@ -0,0 +1,8 @@ + + + + Apache + 3.0.0 + JspwikiTestPlugin + + diff --git a/jspwiki-it-tests/pom.xml b/jspwiki-it-tests/pom.xml index 0b5c323ab7..60ba7a015f 100644 --- a/jspwiki-it-tests/pom.xml +++ b/jspwiki-it-tests/pom.xml @@ -38,6 +38,7 @@ jspwiki-it-test-custom-jdbc jspwiki-it-test-cma jspwiki-it-test-cma-jdbc + jspwiki-test-plugin diff --git a/jspwiki-main/src/main/java/org/apache/wiki/plugin/CurrentTimePlugin.java b/jspwiki-main/src/main/java/org/apache/wiki/plugin/CurrentTimePlugin.java index 7a8f6438cc..ae5c829264 100644 --- a/jspwiki-main/src/main/java/org/apache/wiki/plugin/CurrentTimePlugin.java +++ b/jspwiki-main/src/main/java/org/apache/wiki/plugin/CurrentTimePlugin.java @@ -27,44 +27,57 @@ Licensed to the Apache Software Foundation (ASF) under one import java.text.SimpleDateFormat; import java.util.Date; +import java.util.Locale; import java.util.Map; import java.util.ResourceBundle; /** - * Just displays the current date and time. - * The time format is exactly like in the java.text.SimpleDateFormat class. + * Just displays the current date and time. The time format is exactly like in + * the java.text.SimpleDateFormat class. * - *

Parameters :

- * NONE - * @since 1.7.8 - * @see java.text.SimpleDateFormat + *

+ * Parameters :

+ * NONE + * + * @since 1.7.8 + * @see java.text.SimpleDateFormat */ public class CurrentTimePlugin implements Plugin { - // private static Logger log = LogManager.getLogger( CurrentTimePlugin.class ); + @Override + public String getDisplayName(Locale locale) { + final ResourceBundle rb = ResourceBundle.getBundle(PluginManager.PLUGIN_RESOURCE_LOCATION, locale); + return rb.getString(this.getClass().getSimpleName()); + + } + + @Override + public String getSnipExample() { + return "CurrentTimePlugin format='yyyy mm-dd'"; + } /** - * {@inheritDoc} + * {@inheritDoc} */ @Override - public String execute( final Context context, final Map< String, String > params ) throws PluginException { - final String formatString = params.get( "format" ); + public String execute(final Context context, final Map< String, String> params) throws PluginException { + final String formatString = params.get("format"); try { final SimpleDateFormat fmt; - if( formatString != null ) { - fmt = new SimpleDateFormat( formatString ); + if (formatString != null) { + fmt = new SimpleDateFormat(formatString); } else { - fmt = Preferences.getDateFormat( context, TimeFormat.DATETIME ); + fmt = Preferences.getDateFormat(context, TimeFormat.DATETIME); } final Date d = new Date(); // Now. - return TextUtil.replaceEntities( fmt.format( d ) ); + return TextUtil.replaceEntities(fmt.format(d)); - } catch( final IllegalArgumentException e ) { - final ResourceBundle rb = Preferences.getBundle( context, Plugin.CORE_PLUGINS_RESOURCEBUNDLE ); - throw new PluginException( rb.getString( "currenttimeplugin.badformat" ) + e.getMessage() ); + } catch (final IllegalArgumentException e) { + final ResourceBundle rb = Preferences.getBundle(context, Plugin.CORE_PLUGINS_RESOURCEBUNDLE); + throw new PluginException(rb.getString("currenttimeplugin.badformat") + e.getMessage()); } } diff --git a/jspwiki-main/src/main/java/org/apache/wiki/plugin/DefaultPluginManager.java b/jspwiki-main/src/main/java/org/apache/wiki/plugin/DefaultPluginManager.java index 89e990d134..e7dfdb5a80 100644 --- a/jspwiki-main/src/main/java/org/apache/wiki/plugin/DefaultPluginManager.java +++ b/jspwiki-main/src/main/java/org/apache/wiki/plugin/DefaultPluginManager.java @@ -59,11 +59,13 @@ Licensed to the Apache Software Foundation (ASF) under one import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.NoSuchElementException; import java.util.Properties; import java.util.ResourceBundle; +import java.util.Set; import java.util.StringTokenizer; /** @@ -719,4 +721,20 @@ public Plugin newWikiPlugin( final String pluginName, final ResourceBundle rb ) return plugin; } + @Override + public List getDiscoveredPlugins() { + Collection pluginModules = modules(); + Set plugins = new HashSet<>(); + for(WikiModuleInfo plugin : pluginModules) { + try { + Plugin p = (Plugin) Class.forName(((WikiPluginInfo)plugin).getClassName()).getDeclaredConstructor().newInstance(); + plugins.add(p); + } catch (Throwable ex) { + LOG.error("failed to load class " + plugin.getName(), ex); + } + } + + return new ArrayList<>(plugins); + } + } diff --git a/jspwiki-main/src/main/java/org/apache/wiki/plugin/Denounce.java b/jspwiki-main/src/main/java/org/apache/wiki/plugin/Denounce.java index 97bf81142a..5e6fb6623c 100644 --- a/jspwiki-main/src/main/java/org/apache/wiki/plugin/Denounce.java +++ b/jspwiki-main/src/main/java/org/apache/wiki/plugin/Denounce.java @@ -40,8 +40,10 @@ Licensed to the Apache Software Foundation (ASF) under one import java.util.ArrayList; import java.util.Enumeration; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Properties; +import java.util.ResourceBundle; /** * Denounces a link by removing it from any search engine. @@ -119,6 +121,12 @@ public class Denounce implements Plugin { } } + @Override + public String getDisplayName(Locale locale) { + + final ResourceBundle rb = ResourceBundle.getBundle(PluginManager.PLUGIN_RESOURCE_LOCATION, locale); + return rb.getString(this.getClass().getSimpleName()); + } /** * {@inheritDoc} */ diff --git a/jspwiki-main/src/main/java/org/apache/wiki/plugin/Groups.java b/jspwiki-main/src/main/java/org/apache/wiki/plugin/Groups.java index 6c8a9f63c9..b9c56e5bfb 100644 --- a/jspwiki-main/src/main/java/org/apache/wiki/plugin/Groups.java +++ b/jspwiki-main/src/main/java/org/apache/wiki/plugin/Groups.java @@ -30,7 +30,9 @@ Licensed to the Apache Software Foundation (ASF) under one import java.security.Principal; import java.util.Arrays; import java.util.Comparator; +import java.util.Locale; import java.util.Map; +import java.util.ResourceBundle; /** *

Prints the groups managed by this wiki, separated by commas. @@ -45,6 +47,13 @@ public class Groups implements Plugin { private static final Comparator COMPARATOR = new PrincipalComparator(); + @Override + public String getDisplayName(Locale locale) { + + final ResourceBundle rb = ResourceBundle.getBundle(PluginManager.PLUGIN_RESOURCE_LOCATION, locale); + return rb.getString(this.getClass().getSimpleName()); + } + /** * {@inheritDoc} */ diff --git a/jspwiki-main/src/main/java/org/apache/wiki/plugin/IfPlugin.java b/jspwiki-main/src/main/java/org/apache/wiki/plugin/IfPlugin.java index c52c46ce06..4c8765c1cf 100644 --- a/jspwiki-main/src/main/java/org/apache/wiki/plugin/IfPlugin.java +++ b/jspwiki-main/src/main/java/org/apache/wiki/plugin/IfPlugin.java @@ -38,7 +38,10 @@ Licensed to the Apache Software Foundation (ASF) under one import org.apache.wiki.variables.VariableManager; import java.security.Principal; +import java.util.Locale; import java.util.Map; +import java.util.ResourceBundle; +import org.apache.wiki.i18n.InternationalizationManager; /** * The IfPlugin allows parts of a WikiPage to be executed conditionally, and is intended as a flexible way @@ -140,6 +143,16 @@ public class IfPlugin implements Plugin { /** The parameter name for checking whether a page/var exists. Value is {@value}. */ public static final String PARAM_EXISTS = "exists"; + @Override + public String getDisplayName(Locale locale) { + final ResourceBundle rb = ResourceBundle.getBundle(PluginManager.PLUGIN_RESOURCE_LOCATION, locale); + return rb.getString(this.getClass().getSimpleName()); + } + + @Override + public String getSnipExample() { + return "If name='{value}' page='pagename' exists='true' contains='regexp'\n\nbody\n"; + } /** * {@inheritDoc} */ diff --git a/jspwiki-main/src/main/java/org/apache/wiki/plugin/Image.java b/jspwiki-main/src/main/java/org/apache/wiki/plugin/Image.java index a47f81575f..e977928189 100644 --- a/jspwiki-main/src/main/java/org/apache/wiki/plugin/Image.java +++ b/jspwiki-main/src/main/java/org/apache/wiki/plugin/Image.java @@ -18,6 +18,7 @@ Licensed to the Apache Software Foundation (ASF) under one */ package org.apache.wiki.plugin; +import java.util.Locale; import org.apache.wiki.api.core.Attachment; import org.apache.wiki.api.core.Context; import org.apache.wiki.api.core.ContextEnum; @@ -30,6 +31,7 @@ Licensed to the Apache Software Foundation (ASF) under one import org.apache.wiki.util.TextUtil; import java.util.Map; +import java.util.ResourceBundle; /** @@ -89,6 +91,19 @@ public class Image implements Plugin { private static String getCleanParameter( final Map< String, String > params, final String paramId ) { return TextUtil.replaceEntities( params.get( paramId ) ); } + + @Override + public String getDisplayName(Locale locale) { + final ResourceBundle rb = ResourceBundle.getBundle(PluginManager.PLUGIN_RESOURCE_LOCATION, locale); + return rb.getString(this.getClass().getSimpleName()); + } + + @Override + public String getSnipExample() { + return "Image src='{image.jpg}'"; + } + + /** * {@inheritDoc} diff --git a/jspwiki-main/src/main/java/org/apache/wiki/plugin/IndexPlugin.java b/jspwiki-main/src/main/java/org/apache/wiki/plugin/IndexPlugin.java index dac3e762c6..e50f52ec77 100644 --- a/jspwiki-main/src/main/java/org/apache/wiki/plugin/IndexPlugin.java +++ b/jspwiki-main/src/main/java/org/apache/wiki/plugin/IndexPlugin.java @@ -35,7 +35,9 @@ Licensed to the Apache Software Foundation (ASF) under one import org.jdom2.output.XMLOutputter; import java.util.List; +import java.util.Locale; import java.util.Map; +import java.util.ResourceBundle; import java.util.Set; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -62,6 +64,12 @@ public class IndexPlugin extends AbstractReferralPlugin implements Plugin { private static final Logger LOG = LogManager.getLogger(IndexPlugin.class); private final Namespace xmlns_XHTML = Namespace.getNamespace("http://www.w3.org/1999/xhtml"); + + @Override + public String getDisplayName(Locale locale) { + final ResourceBundle rb = ResourceBundle.getBundle(PluginManager.PLUGIN_RESOURCE_LOCATION, locale); + return rb.getString(this.getClass().getSimpleName()); + } /** * {@inheritDoc} diff --git a/jspwiki-main/src/main/java/org/apache/wiki/plugin/InsertPage.java b/jspwiki-main/src/main/java/org/apache/wiki/plugin/InsertPage.java index 159abf0edb..11b93d7c75 100644 --- a/jspwiki-main/src/main/java/org/apache/wiki/plugin/InsertPage.java +++ b/jspwiki-main/src/main/java/org/apache/wiki/plugin/InsertPage.java @@ -35,6 +35,7 @@ Licensed to the Apache Software Foundation (ASF) under one import java.util.ArrayList; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Objects; import java.util.ResourceBundle; @@ -79,6 +80,17 @@ public class InsertPage implements Plugin { /** This attribute is stashed in the WikiContext to make sure that we don't have circular references. */ public static final String ATTR_RECURSE = "org.apache.wiki.plugin.InsertPage.recurseCheck"; + + @Override + public String getDisplayName(Locale locale) { + final ResourceBundle rb = ResourceBundle.getBundle(PluginManager.PLUGIN_RESOURCE_LOCATION, locale); + return rb.getString(this.getClass().getSimpleName()); + } + + @Override + public String getSnipExample() { + return "InsertPage page='{pagename}'"; + } /** * {@inheritDoc} */ diff --git a/jspwiki-main/src/main/java/org/apache/wiki/plugin/ListLocksPlugin.java b/jspwiki-main/src/main/java/org/apache/wiki/plugin/ListLocksPlugin.java index 501ea179ef..d24ae356b2 100644 --- a/jspwiki-main/src/main/java/org/apache/wiki/plugin/ListLocksPlugin.java +++ b/jspwiki-main/src/main/java/org/apache/wiki/plugin/ListLocksPlugin.java @@ -26,6 +26,7 @@ Licensed to the Apache Software Foundation (ASF) under one import org.apache.wiki.preferences.Preferences; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.ResourceBundle; @@ -38,6 +39,17 @@ Licensed to the Apache Software Foundation (ASF) under one */ public class ListLocksPlugin implements Plugin { + @Override + public String getDisplayName(Locale locale) { + final ResourceBundle rb = ResourceBundle.getBundle(PluginManager.PLUGIN_RESOURCE_LOCATION, locale); + return rb.getString(this.getClass().getSimpleName()); + } + + + @Override + public String getSnipExample() { + return "ListLocksPlugin"; + } /** * {@inheritDoc} */ diff --git a/jspwiki-main/src/main/java/org/apache/wiki/plugin/Note.java b/jspwiki-main/src/main/java/org/apache/wiki/plugin/Note.java index 587e33c177..62d6f62561 100644 --- a/jspwiki-main/src/main/java/org/apache/wiki/plugin/Note.java +++ b/jspwiki-main/src/main/java/org/apache/wiki/plugin/Note.java @@ -55,6 +55,10 @@ public class Note implements Plugin { /** The default name for the note. Value is {@value}. */ public static final String DEFAULT_NOTE_IMAGE = "note.png"; + @Override + public String getSnipExample() { + return "Note " + PROP_NOTE_IMAGE + "=note.png This text shows as tooltip"; + } /** * {@inheritDoc} */ diff --git a/jspwiki-main/src/main/java/org/apache/wiki/plugin/PageViewPlugin.java b/jspwiki-main/src/main/java/org/apache/wiki/plugin/PageViewPlugin.java index 850d7c210a..4778cbc30f 100644 --- a/jspwiki-main/src/main/java/org/apache/wiki/plugin/PageViewPlugin.java +++ b/jspwiki-main/src/main/java/org/apache/wiki/plugin/PageViewPlugin.java @@ -55,9 +55,11 @@ Licensed to the Apache Software Foundation (ASF) under one import java.util.Comparator; import java.util.HashSet; import java.util.Iterator; +import java.util.Locale; import java.util.Map; import java.util.Map.Entry; import java.util.Properties; +import java.util.ResourceBundle; import java.util.TreeMap; @@ -129,6 +131,12 @@ public class PageViewPlugin extends AbstractReferralPlugin implements Plugin, In /** Constant for storage interval in seconds. */ private static final int STORAGE_INTERVAL = 60; + @Override + public String getDisplayName(Locale locale) { + final ResourceBundle rb = ResourceBundle.getBundle(PluginManager.PLUGIN_RESOURCE_LOCATION, locale); + return rb.getString(this.getClass().getSimpleName()); + } + /** * Initialize the PageViewPlugin and its singleton. * diff --git a/jspwiki-main/src/main/java/org/apache/wiki/plugin/PluginManager.java b/jspwiki-main/src/main/java/org/apache/wiki/plugin/PluginManager.java index aa5f752fb1..552e4c97b9 100644 --- a/jspwiki-main/src/main/java/org/apache/wiki/plugin/PluginManager.java +++ b/jspwiki-main/src/main/java/org/apache/wiki/plugin/PluginManager.java @@ -25,6 +25,7 @@ Licensed to the Apache Software Foundation (ASF) under one import org.apache.wiki.modules.ModuleManager; import java.io.IOException; +import java.util.List; import java.util.Map; import java.util.ResourceBundle; @@ -129,4 +130,13 @@ public interface PluginManager extends ModuleManager { */ Plugin newWikiPlugin( String pluginName, ResourceBundle rb ) throws PluginException; + /** + * gets a list of plugins available via the java service provider discovery + * mechanism. Helpful for populating autocomplete capabilities. + * + * @since 3.0.0 + * @return list of plugin instances. + */ + List getDiscoveredPlugins(); + } diff --git a/jspwiki-main/src/main/java/org/apache/wiki/plugin/RecentChangesPlugin.java b/jspwiki-main/src/main/java/org/apache/wiki/plugin/RecentChangesPlugin.java index e6c77fae1e..ab0a1d80ad 100644 --- a/jspwiki-main/src/main/java/org/apache/wiki/plugin/RecentChangesPlugin.java +++ b/jspwiki-main/src/main/java/org/apache/wiki/plugin/RecentChangesPlugin.java @@ -45,7 +45,9 @@ Licensed to the Apache Software Foundation (ASF) under one import java.util.Collection; import java.util.Date; import java.util.GregorianCalendar; +import java.util.Locale; import java.util.Map; +import java.util.ResourceBundle; /** @@ -76,6 +78,13 @@ public class RecentChangesPlugin extends AbstractReferralPlugin implements Plugi public static final String DEFAULT_DATE_FORMAT ="dd.MM.yyyy"; + @Override + public String getDisplayName(Locale locale) { + final ResourceBundle rb = ResourceBundle.getBundle(PluginManager.PLUGIN_RESOURCE_LOCATION, locale); + return rb.getString(this.getClass().getSimpleName()); + } + + /** * {@inheritDoc} */ diff --git a/jspwiki-main/src/main/java/org/apache/wiki/plugin/ReferredPagesPlugin.java b/jspwiki-main/src/main/java/org/apache/wiki/plugin/ReferredPagesPlugin.java index adf0852e38..b922ac14bb 100644 --- a/jspwiki-main/src/main/java/org/apache/wiki/plugin/ReferredPagesPlugin.java +++ b/jspwiki-main/src/main/java/org/apache/wiki/plugin/ReferredPagesPlugin.java @@ -39,7 +39,9 @@ Licensed to the Apache Software Foundation (ASF) under one import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; +import java.util.Locale; import java.util.Map; +import java.util.ResourceBundle; /** @@ -97,6 +99,17 @@ public class ReferredPagesPlugin implements Plugin { /** The maximum depth. Value is {@value}. */ public static final int MAX_DEPTH = 8; + @Override + public String getDisplayName(Locale locale) { + final ResourceBundle rb = ResourceBundle.getBundle(PluginManager.PLUGIN_RESOURCE_LOCATION, locale); + return rb.getString(this.getClass().getSimpleName()); + } + + @Override + public String getSnipExample() { + return "ReferredPagesPlugin page='{pagename}' type='local|external|attachment' depth='1..8' include='regexp' exclude='regexp'"; + } + /** * {@inheritDoc} */ diff --git a/jspwiki-main/src/main/java/org/apache/wiki/plugin/ReferringPagesPlugin.java b/jspwiki-main/src/main/java/org/apache/wiki/plugin/ReferringPagesPlugin.java index 959582c3c5..e281450076 100644 --- a/jspwiki-main/src/main/java/org/apache/wiki/plugin/ReferringPagesPlugin.java +++ b/jspwiki-main/src/main/java/org/apache/wiki/plugin/ReferringPagesPlugin.java @@ -32,6 +32,7 @@ Licensed to the Apache Software Foundation (ASF) under one import java.text.MessageFormat; import java.util.Collection; +import java.util.Locale; import java.util.Map; import java.util.ResourceBundle; @@ -64,6 +65,17 @@ public class ReferringPagesPlugin extends AbstractReferralPlugin { /** Parameter name for choosing the page. Value is {@value}. */ public static final String PARAM_PAGE = "page"; + @Override + public String getDisplayName(Locale locale) { + final ResourceBundle rb = ResourceBundle.getBundle(PluginManager.PLUGIN_RESOURCE_LOCATION, locale); + return rb.getString(this.getClass().getSimpleName()); + } + + @Override + public String getSnipExample() { + return "ReferringPagesPlugin page='{pagename}' separator=',' include='regexp' exclude='regexp'"; + } + /** * {@inheritDoc} */ diff --git a/jspwiki-main/src/main/java/org/apache/wiki/plugin/ReferringUndefinedPagesPlugin.java b/jspwiki-main/src/main/java/org/apache/wiki/plugin/ReferringUndefinedPagesPlugin.java index 07323c0409..8c1b34ecff 100644 --- a/jspwiki-main/src/main/java/org/apache/wiki/plugin/ReferringUndefinedPagesPlugin.java +++ b/jspwiki-main/src/main/java/org/apache/wiki/plugin/ReferringUndefinedPagesPlugin.java @@ -27,6 +27,7 @@ Licensed to the Apache Software Foundation (ASF) under one import java.text.MessageFormat; import java.util.Collection; +import java.util.Locale; import java.util.Map; import java.util.Objects; import java.util.ResourceBundle; @@ -48,6 +49,12 @@ public class ReferringUndefinedPagesPlugin extends AbstractReferralPlugin { /** Parameter name for setting the text to show when the maximum items is overruled. Value is {@value}. */ public static final String PARAM_EXTRAS = "extras"; + @Override + public String getDisplayName(Locale locale) { + final ResourceBundle rb = ResourceBundle.getBundle(PluginManager.PLUGIN_RESOURCE_LOCATION, locale); + return rb.getString(this.getClass().getSimpleName()); + } + @Override public String execute( final Context context, final Map params) throws PluginException { final ResourceBundle rb = Preferences.getBundle(context, Plugin.CORE_PLUGINS_RESOURCEBUNDLE); diff --git a/jspwiki-main/src/main/java/org/apache/wiki/plugin/Search.java b/jspwiki-main/src/main/java/org/apache/wiki/plugin/Search.java index 2889e3e858..b341e5b4e9 100644 --- a/jspwiki-main/src/main/java/org/apache/wiki/plugin/Search.java +++ b/jspwiki-main/src/main/java/org/apache/wiki/plugin/Search.java @@ -37,7 +37,9 @@ Licensed to the Apache Software Foundation (ASF) under one import java.io.IOException; import java.util.Collection; import java.util.Iterator; +import java.util.Locale; import java.util.Map; +import java.util.ResourceBundle; /** * The "Search" plugin allows you to access the JSPWiki search routines and show the displays in an array on your page. @@ -67,6 +69,18 @@ public class Search implements Plugin { /** The parameter name for setting the how many results will be fetched. Value is {@value}. */ public static final String PARAM_MAX = "max"; + @Override + public String getDisplayName(Locale locale) { + final ResourceBundle rb = ResourceBundle.getBundle(PluginManager.PLUGIN_RESOURCE_LOCATION, locale); + return rb.getString(this.getClass().getSimpleName()); + } + + @Override + public String getSnipExample() { + return "Search query='{Janne}' max='10'"; + } + + /** * {@inheritDoc} */ diff --git a/jspwiki-main/src/main/java/org/apache/wiki/plugin/TableOfContents.java b/jspwiki-main/src/main/java/org/apache/wiki/plugin/TableOfContents.java index 394953fefc..b500e18b85 100644 --- a/jspwiki-main/src/main/java/org/apache/wiki/plugin/TableOfContents.java +++ b/jspwiki-main/src/main/java/org/apache/wiki/plugin/TableOfContents.java @@ -37,6 +37,7 @@ Licensed to the Apache Software Foundation (ASF) under one import org.apache.wiki.variables.VariableManager; import java.io.IOException; +import java.util.Locale; import java.util.Map; import java.util.ResourceBundle; @@ -70,7 +71,7 @@ public class TableOfContents implements Plugin, HeadingListener { private static final String VAR_ALREADY_PROCESSING = "__TableOfContents.processing"; - final StringBuffer m_buf = new StringBuffer(); + private final StringBuffer m_buf = new StringBuffer(); private boolean m_usingNumberedList; private String m_prefix = ""; private int m_starting; @@ -79,6 +80,19 @@ public class TableOfContents implements Plugin, HeadingListener { private int m_level3Index; private int m_lastLevel; + @Override + public String getDisplayName(Locale locale) { + final ResourceBundle rb = ResourceBundle.getBundle(PluginManager.PLUGIN_RESOURCE_LOCATION, locale); + return rb.getString(this.getClass().getSimpleName()); + } + + + + @Override + public String getSnipExample() { + return "TableOfContents"; + } + /** * {@inheritDoc} */ diff --git a/jspwiki-main/src/main/java/org/apache/wiki/plugin/UndefinedPagesPlugin.java b/jspwiki-main/src/main/java/org/apache/wiki/plugin/UndefinedPagesPlugin.java index 877cef1d93..68c4ca257a 100644 --- a/jspwiki-main/src/main/java/org/apache/wiki/plugin/UndefinedPagesPlugin.java +++ b/jspwiki-main/src/main/java/org/apache/wiki/plugin/UndefinedPagesPlugin.java @@ -23,7 +23,9 @@ Licensed to the Apache Software Foundation (ASF) under one import org.apache.wiki.references.ReferenceManager; import java.util.Collection; +import java.util.Locale; import java.util.Map; +import java.util.ResourceBundle; /** @@ -37,6 +39,12 @@ Licensed to the Apache Software Foundation (ASF) under one */ public class UndefinedPagesPlugin extends AbstractReferralPlugin { + @Override + public String getDisplayName(Locale locale) { + final ResourceBundle rb = ResourceBundle.getBundle(PluginManager.PLUGIN_RESOURCE_LOCATION, locale); + return rb.getString(this.getClass().getSimpleName()); + } + /** * {@inheritDoc} */ diff --git a/jspwiki-main/src/main/java/org/apache/wiki/plugin/UnusedPagesPlugin.java b/jspwiki-main/src/main/java/org/apache/wiki/plugin/UnusedPagesPlugin.java index c5d84a2309..5ccd96596a 100644 --- a/jspwiki-main/src/main/java/org/apache/wiki/plugin/UnusedPagesPlugin.java +++ b/jspwiki-main/src/main/java/org/apache/wiki/plugin/UnusedPagesPlugin.java @@ -24,7 +24,9 @@ Licensed to the Apache Software Foundation (ASF) under one import org.apache.wiki.util.TextUtil; import java.util.Collection; +import java.util.Locale; import java.util.Map; +import java.util.ResourceBundle; /** * Plugin for displaying pages that are not linked to in other pages. @@ -41,6 +43,12 @@ public class UnusedPagesPlugin extends AbstractReferralPlugin { /** If set to "true", attachments are excluded from display. Value is {@value}. */ public static final String PARAM_EXCLUDEATTS = "excludeattachments"; + @Override + public String getDisplayName(Locale locale) { + final ResourceBundle rb = ResourceBundle.getBundle(PluginManager.PLUGIN_RESOURCE_LOCATION, locale); + return rb.getString(this.getClass().getSimpleName()); + } + /** * {@inheritDoc} */ diff --git a/jspwiki-main/src/main/java/org/apache/wiki/plugin/WeblogArchivePlugin.java b/jspwiki-main/src/main/java/org/apache/wiki/plugin/WeblogArchivePlugin.java index 6dc16fd8aa..ea229cb122 100644 --- a/jspwiki-main/src/main/java/org/apache/wiki/plugin/WeblogArchivePlugin.java +++ b/jspwiki-main/src/main/java/org/apache/wiki/plugin/WeblogArchivePlugin.java @@ -32,7 +32,9 @@ Licensed to the Apache Software Foundation (ASF) under one import java.util.Comparator; import java.util.Date; import java.util.List; +import java.util.Locale; import java.util.Map; +import java.util.ResourceBundle; import java.util.SortedSet; import java.util.TreeSet; @@ -53,6 +55,12 @@ public class WeblogArchivePlugin implements Plugin { private SimpleDateFormat m_monthUrlFormat; + @Override + public String getDisplayName(Locale locale) { + final ResourceBundle rb = ResourceBundle.getBundle(PluginManager.PLUGIN_RESOURCE_LOCATION, locale); + return rb.getString(this.getClass().getSimpleName()); + } + /** * {@inheritDoc} */ diff --git a/jspwiki-main/src/main/java/org/apache/wiki/plugin/WeblogEntryPlugin.java b/jspwiki-main/src/main/java/org/apache/wiki/plugin/WeblogEntryPlugin.java index ab4b6bcde8..c26634a699 100644 --- a/jspwiki-main/src/main/java/org/apache/wiki/plugin/WeblogEntryPlugin.java +++ b/jspwiki-main/src/main/java/org/apache/wiki/plugin/WeblogEntryPlugin.java @@ -36,6 +36,7 @@ Licensed to the Apache Software Foundation (ASF) under one import java.text.SimpleDateFormat; import java.util.Collection; import java.util.Date; +import java.util.Locale; import java.util.Map; import java.util.ResourceBundle; @@ -70,6 +71,13 @@ public class WeblogEntryPlugin implements Plugin { * Parameter name for setting the page Value is {@value}. */ public static final String PARAM_BLOGNAME = "page"; + + + @Override + public String getDisplayName(Locale locale) { + final ResourceBundle rb = ResourceBundle.getBundle(PluginManager.PLUGIN_RESOURCE_LOCATION, locale); + return rb.getString(this.getClass().getSimpleName()); + } /** * Returns a new page name for entries. It goes through the list of all blog pages, and finds out the next in line. diff --git a/jspwiki-main/src/main/java/org/apache/wiki/plugin/WeblogPlugin.java b/jspwiki-main/src/main/java/org/apache/wiki/plugin/WeblogPlugin.java index 3104ddc6cb..c6f3743725 100644 --- a/jspwiki-main/src/main/java/org/apache/wiki/plugin/WeblogPlugin.java +++ b/jspwiki-main/src/main/java/org/apache/wiki/plugin/WeblogPlugin.java @@ -49,6 +49,7 @@ Licensed to the Apache Software Foundation (ASF) under one import java.util.Date; import java.util.Iterator; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.ResourceBundle; import java.util.Set; @@ -156,6 +157,20 @@ public static String makeEntryPage( final String pageName, final String date ) { return TextUtil.replaceString(DEFAULT_PAGEFORMAT,"%p",pageName)+date; } + @Override + public String getDisplayName(Locale locale) { + final ResourceBundle rb = ResourceBundle.getBundle(PluginManager.PLUGIN_RESOURCE_LOCATION, locale); + return rb.getString(this.getClass().getSimpleName()); + } + + @Override + public String getSnipExample() { + final SimpleDateFormat fmt = new SimpleDateFormat( DEFAULT_DATEFORMAT ); + String date = fmt.format(new Date(System.currentTimeMillis()-(30*24*60*60*1000L))); + return "WeblogPlugin page='{pagename}' startDate='" + date + "' days='30' maxEntries='30' allowComments='false'"; + } + + /** * {@inheritDoc} */ @@ -203,6 +218,11 @@ public String execute( final Context context, final Map< String, String > params if( (startDay = params.get(PARAM_STARTDATE)) == null ) { startDay = context.getHttpParameter( "weblog."+PARAM_STARTDATE ); } + if ("ddMMyy".equalsIgnoreCase(startDay)) { + //if using the default snippet, this value is clearly the default + //and is not valid + startDay = null; + } if( TextUtil.isPositive( params.get(PARAM_ALLOWCOMMENTS) ) ) { hasComments = true; diff --git a/jspwiki-main/src/main/java/org/apache/wiki/search/DefaultSearchManager.java b/jspwiki-main/src/main/java/org/apache/wiki/search/DefaultSearchManager.java index c31ae6fda1..396b8386e3 100644 --- a/jspwiki-main/src/main/java/org/apache/wiki/search/DefaultSearchManager.java +++ b/jspwiki-main/src/main/java/org/apache/wiki/search/DefaultSearchManager.java @@ -51,9 +51,15 @@ Licensed to the Apache Software Foundation (ASF) under one import java.util.HashMap; import java.util.Iterator; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Properties; import java.util.Set; +import org.apache.wiki.api.plugin.Plugin; +import org.apache.wiki.i18n.InternationalizationManager; +import org.apache.wiki.plugin.PluginManager; +import org.apache.wiki.preferences.Preferences; +import static org.apache.wiki.search.SearchManager.PLUGIN_SEARCH; /** @@ -80,8 +86,81 @@ public DefaultSearchManager( final Engine engine, final Properties properties ) // TODO: Replace with custom annotations. See JSPWIKI-566 WikiAjaxDispatcherServlet.registerServlet( JSON_SEARCH, new JSONSearch() ); + WikiAjaxDispatcherServlet.registerServlet( PLUGIN_SEARCH, new PluginSearch() ); } + /** + * Provides a JSON AJAX API to the JSPWiki Plugin discovery mechanism, + * primarily used for [{}] based auto complete + */ + public class PluginSearch implements WikiAjaxServlet { + + public static final String AJAX_ACTION_PLUGINS = "plugins"; + public static final int DEFAULT_MAX_RESULTS = 20; + public int maxResults = DEFAULT_MAX_RESULTS; + + /** {@inheritDoc} */ + @Override + public String getServletMapping() { + return PLUGIN_SEARCH; + } + public static class SimpleSnipData { + public String displayName; + public String snip; + } + + /** {@inheritDoc} */ + @Override + public void service( final HttpServletRequest req, + final HttpServletResponse resp, + final String actionName, + final List< String > params ) throws IOException { + String result = "[]"; + String itemId = null; + if( actionName != null && StringUtils.isNotBlank( actionName ) ) { + if( !params.isEmpty() ) { + itemId = params.get( 0 ); + LOG.debug( "itemId=" + itemId ); + if( params.size() > 1 ) { + itemId = params.get( 0 ); + final String maxResultsParam = params.get( 1 ); + LOG.debug( "maxResultsParam=" + maxResultsParam ); + if( StringUtils.isNotBlank( maxResultsParam ) && StringUtils.isNumeric( maxResultsParam ) ) { + maxResults = Integer.parseInt( maxResultsParam ); + } + } + } + + if( actionName.equals( AJAX_ACTION_PLUGINS ) ) { + LOG.debug( "Calling getPlugins() START" ); + PluginManager mgr = m_engine.getManager(PluginManager.class); + final List< Plugin > plugins = mgr.getDiscoveredPlugins(); + List< SimpleSnipData > callResults = new ArrayList<>(); + final Context wikiContext = Wiki.context().create(m_engine, req, "pluginDisco"); + Locale locale = Preferences.getLocale(wikiContext); + for (Plugin p : plugins) { + if ( itemId != null && StringUtils.isNotBlank(itemId) ) { + if ( !p.getSnipExample().startsWith(itemId) ) { + continue; + } + } else { + SimpleSnipData data = new SimpleSnipData(); + data.snip = p.getSnipExample(); + data.displayName = p.getDisplayName(locale); + callResults.add(data); + } + if ( callResults.size() > maxResults ) + break; + } + LOG.debug( "Calling getSuggestions() DONE. " + callResults.size() ); + result = AjaxUtil.toJson( callResults ); + } + } + LOG.debug( "result=" + result ); + resp.getWriter().write( result ); + } + } + /** * Provides a JSON AJAX API to the JSPWiki Search Engine. */ @@ -160,7 +239,7 @@ public List< String > getSuggestions( String wikiName, final int maxLength ) { final String cleanWikiName = MarkupParser.cleanLink(wikiName).toLowerCase() + filename; final String oldStyleName = MarkupParser.wikifyLink(wikiName).toLowerCase() + filename; final Set< String > allPages = m_engine.getManager( ReferenceManager.class ).findCreated(); - + int counter = 0; for( final Iterator< String > i = allPages.iterator(); i.hasNext() && counter < maxLength; ) { final String p = i.next(); diff --git a/jspwiki-main/src/main/java/org/apache/wiki/search/SearchManager.java b/jspwiki-main/src/main/java/org/apache/wiki/search/SearchManager.java index a483212b13..cb241c3aa3 100644 --- a/jspwiki-main/src/main/java/org/apache/wiki/search/SearchManager.java +++ b/jspwiki-main/src/main/java/org/apache/wiki/search/SearchManager.java @@ -44,6 +44,9 @@ public interface SearchManager extends PageFilter, InternalModule, WikiEventList /** The name of the JSON object that manages search. */ String JSON_SEARCH = "search"; + + /** the name of the Plugin discovery endpoint */ + String PLUGIN_SEARCH = "plugins"; /** * Returns the SearchProvider used. diff --git a/jspwiki-main/src/main/javascript/Wiki.Snips.JSPWiki.js b/jspwiki-main/src/main/javascript/Wiki.Snips.JSPWiki.js index 0a5dfbcadf..e96c2a27e1 100644 --- a/jspwiki-main/src/main/javascript/Wiki.Snips.JSPWiki.js +++ b/jspwiki-main/src/main/javascript/Wiki.Snips.JSPWiki.js @@ -44,7 +44,7 @@ Function: snippets */ Wiki.Snips = { - + ready: false, // Snipe predefined commands find: { }, undo: { event: "undo" }, @@ -519,41 +519,43 @@ Wiki.Snips = { //lback: "(^|[^\\[])\\[{([^\\[\\]\\n\\r]*)(?:\\|\\])?$", match: "^([^\\[\\]\\n\\r]*)\\}\\]" }, - pluginDlg: [ Dialog.Selection, { - caption: "dialog.plugin".localize(), - body: { - "ALLOW {permission} principal ": "Page Access Rights ", - "SET {name}='value'":"Set a Wiki variable", - "${varname}":"Get a Wiki variable", - "If name='{value}' page='pagename' exists='true' contains='regexp'\n\nbody\n":"IF plugin", - "SET keywords={keyword1, keyword2}":"Set Page Keywords", - "SET alias='{pagename}'":"Set Page Alias", - "SET page-styles='prettify-nonum table-condensed-fit'":"Set Page Styles", - "SET sidebar='off'":"Hide Sidebar", - //"Table":"Advanced Tables", - //"Groups":"View all Wiki Groups", - "":"", - "Counter":"Insert a simple counter", - "PageViewPlugin":"Count Views of this page", - "CurrentTimePlugin format='yyyy mmm-dd'":"Insert Current Time", - "Denounce":"Denounce a link", - "Image src='{image.jpg}'":"Insert an Image ", - "IndexPlugin":"Index of all pages", - - "InsertPage page='{pagename}'":"Insert another Page", - "ListLocksPlugin":"List page locks", - "RecentChangesPlugin":"Displays the recent changed pages", - "ReferringPagesPlugin page='{pagename}' separator=',' include='regexp' exclude='regexp'":"Incoming Links (referring pages)", - "ReferredPagesPlugin page='{pagename}' type='local|external|attachment' depth='1..8' include='regexp' exclude='regexp'":"Outgoing Links (referred pages)", - "Search query='{Janne}' max='10'":"Insert a Search query", - "TableOfContents ":"Table Of Contents ", - "UndefinedPagesPlugin":"List pages that are missing", - "UnusedPagesPlugin":"List pages that have been orphaned", - "WeblogArchivePlugin":"Displays a list of older weblog entries", - "WeblogEntryPlugin":"Makes a new weblog entry", - "WeblogPlugin page='{pagename}' startDate='300604' days='30' maxEntries='30' allowComments='false'":"Builds a weblog" - } - }] + pluginDlg: [ Dialog.Selection, + { + caption: "dialog.plugin".localize(), + body: { + "ALLOW {permission} principal ": "Page Access Rights ", + "SET {name}='value'":"Set a Wiki variable", + "${varname}":"Get a Wiki variable", + //"If name='{value}' page='pagename' exists='true' contains='regexp'\n\nbody\n":"IF plugin", + "SET keywords={keyword1, keyword2}":"Set Page Keywords", + "SET alias='{pagename}'":"Set Page Alias", + "SET page-styles='prettify-nonum table-condensed-fit'":"Set Page Styles", + "SET sidebar='off'":"Hide Sidebar", + //"Table":"Advanced Tables", + //"Groups":"View all Wiki Groups", + //"":"", + //deprecated "Counter":"Insert a simple counter", + //"PageViewPlugin":"Count Views of this page", + //"CurrentTimePlugin format='yyyy mmm-dd'":"Insert Current Time", + //"Denounce":"Denounce a link", + //"Image src='{image.jpg}'":"Insert an Image ", + //"IndexPlugin":"Index of all pages", + + //"InsertPage page='{pagename}'":"Insert another Page", + //"ListLocksPlugin":"List page locks", + //"RecentChangesPlugin":"Displays the recent changed pages", + //"ReferringPagesPlugin page='{pagename}' separator=',' include='regexp' exclude='regexp'":"Incoming Links (referring pages)", + //"ReferredPagesPlugin page='{pagename}' type='local|external|attachment' depth='1..8' include='regexp' exclude='regexp'":"Outgoing Links (referred pages)", + //"Search query='{Janne}' max='10'":"Insert a Search query", + //"TableOfContents ":"Table Of Contents ", + //"UndefinedPagesPlugin":"List pages that are missing", + //"UnusedPagesPlugin":"List pages that have been orphaned", + //"WeblogArchivePlugin":"Displays a list of older weblog entries", + //"WeblogEntryPlugin":"Makes a new weblog entry", + //"WeblogPlugin page='{pagename}' startDate='300604' days='30' maxEntries='30' allowComments='false'":"Builds a weblog" + } + } + ] }, @@ -628,5 +630,40 @@ Wiki.Snips = { } }] + }, + +//load up any server defined plugins +//note this file is ran through wro4j maven plugin which is limited ES6 support +//thus the usage of super old xhr requests and var vs let. +//see https://github.com/wro4j/wro4j/issues/1178 + + loadPlugins: function(){ + console.info("loading plugin list"); + const pluginDiscoveryRequest2 = new XMLHttpRequest(); + pluginDiscoveryRequest2.open('GET', 'ajax/plugins/plugins', true); // true for asynchronous + pluginDiscoveryRequest2.onload = function() { + if (pluginDiscoveryRequest2.status >= 200 && pluginDiscoveryRequest2.status < 300) { + var data = JSON.parse(pluginDiscoveryRequest2.responseText); + //Wiki.Snips.pluginDlg["TableOfContents "] = "Table Of Contents "; + for (var i=0; i < data.length; i++) { + Wiki.Snips.pluginDlg.pluginDlg[1].body[data[i].snip] = data[i].displayName; + } + Wiki.Snips.ready = true; + console.info("plugin list loaded"); + } else { + console.error('Request failed. Returned status of ' + pluginDiscoveryRequest2.status); + Wiki.Snips.ready = true; + } + }; + pluginDiscoveryRequest2.onerror = function() { + console.error('Network error occurred'); + Wiki.Snips.ready = true; + }; + pluginDiscoveryRequest2.send(); } -} + + +}; +window.addEventListener("load", function() { + Wiki.Snips.loadPlugins(); +}); \ No newline at end of file diff --git a/jspwiki-main/src/main/resources/ini/jspwiki_module.xml b/jspwiki-main/src/main/resources/ini/jspwiki_module.xml index 4dab13c7c6..3ef2883c25 100644 --- a/jspwiki-main/src/main/resources/ini/jspwiki_module.xml +++ b/jspwiki-main/src/main/resources/ini/jspwiki_module.xml @@ -26,38 +26,129 @@ --> - - - Janne Jalkanen - editors/plain.jsp - 2.4 - org.apache.wiki.ui.admin.beans.PlainEditorAdminBean - - - - MooEditable - editors/wysiwyg.jsp - 2.10 - - - - Janne Jalkanen - 2.4 - If - - - - Janne Jalkanen - 2.4 - - - - Janne Jalkanen - 2.6 - + + + Janne Jalkanen + editors/plain.jsp + 2.4 + org.apache.wiki.ui.admin.beans.PlainEditorAdminBean + + + + MooEditable + editors/wysiwyg.jsp + 2.10 + + + + Janne Jalkanen + 2.4 + If + + + + Janne Jalkanen + 2.4 + + + ASF + 2.4 + + + ASF + 1.9.30 + + + ASF + 2.4 + + + ASF + 2.8 + + + ASF + 2.1.40 + + + ASF + 2.4 + + + ASF + 2.1.37 + + + ASF + 2.0.22 + + + + ASF + 2.4 + + + ASF + 2.4 + + + ASF + 2.4 + + + ASF + 2.4 + + + + ASF + 2.4 + + + ASF + 2.2 + + + ASF + 2.2 + + + ASF + 2.2 + + + ASF + 2.2 + + + ASF + 2.2 + + + ASF + 2.2 + + + + ASF + 2.4 + + + ASF + 2.4 + + + ASF + 2.4 + + + + Janne Jalkanen + 2.6 + \ No newline at end of file diff --git a/jspwiki-main/src/main/resources/plugin/PluginResources.properties b/jspwiki-main/src/main/resources/plugin/PluginResources.properties index 741110a697..fd0ed87ee8 100644 --- a/jspwiki-main/src/main/resources/plugin/PluginResources.properties +++ b/jspwiki-main/src/main/resources/plugin/PluginResources.properties @@ -82,3 +82,28 @@ plugin.listlocks.no.locks.exist=No locks exist currently. # ReferringUndefinedPagesPlugin referringundefinedpagesplugin.more = ...and {0} more + + +# plugin display names + +CurrentTimePlugin=Insert Current Time +Denounce=Denounce a link +Groups=View all Wiki Groups +Image=Insert an Image +IfPlugin=IF Plugin +IndexPlugin=Index of all pages +InsertPage=Insert another Page +ListLocksPlugin=List page locks +Note=Note (tooltip) +PageViewPlugin=Count Views of this page +RecentChangesPlugin=Displays the recent changed pages +ReferredPagesPlugin=Outgoing Links (referred pages) +ReferringPagesPlugin=Incoming Links (referring pages) +ReferringUndefinedPagesPlugin=Pages containing dead links +Search=Insert a Search Query +TableOfConents=Table of Contents +UndefinedPagesPlugin=List pages that are missing +UnusedPagesPlugin=List pages that have been orphaned +WeblogArchivePlugin=Displays a list of older weblog entries +WeblogEntryPlugin=Makes a new weblog entry +WeblogPlugin=Builds a weblog diff --git a/jspwiki-main/src/main/resources/plugin/PluginResources_de.properties b/jspwiki-main/src/main/resources/plugin/PluginResources_de.properties index 4246ce1fa0..b7935fc01e 100644 --- a/jspwiki-main/src/main/resources/plugin/PluginResources_de.properties +++ b/jspwiki-main/src/main/resources/plugin/PluginResources_de.properties @@ -26,7 +26,7 @@ # "du" animiert zum mitmachen. Anrede wird klein geschrieben. # # Die Datei muss in der Codierung ISO 8859-1 (Latin-1) abgespeichert werden. -# Umlaute und Sonderzeichen können daher direkt eingetippt werden und müssen (dürfen) +# Umlaute und Sonderzeichen k\u00f6nnen daher direkt eingetippt werden und m\u00fcssen (d\u00fcrfen) # insbesondere nicht mittels HTML-Entities escaped werden. # # Translation revised on 2008-02-05 by Florian Holeczek @@ -35,7 +35,7 @@ # Errors rendering plugins -plugin.error.insertionfailed={0} : {1} - Einfügen eines Plugins fehlgeschlagen: {2} +plugin.error.insertionfailed={0} : {1} - Einf\u00fcgen eines Plugins fehlgeschlagen: {2} plugin.error.cannotinstantiate=Kann Plugin '{0}' nicht instanziieren. plugin.error.notallowed=Keine Zugriffsberechtigung auf Plugin '{0}'. plugin.error.instantationfailed=Instanziierung des Plugins '{0}' fehlgeschlagen. @@ -57,7 +57,7 @@ bugreporthandler.titlerequired=Ein Titel muss angegeben werden! # CurrentTimePlugin -currenttimeplugin.badformat=Du hast ein ungültiges Format angegeben. +currenttimeplugin.badformat=Du hast ein ung\u00fcltiges Format angegeben. # WeblogEntryPlugin @@ -91,10 +91,31 @@ formtextarea.namemissing=Das Element 'textarea' erwartet den Parameter 'name'. # ListLocks plugin plugin.listlocks.page=Seite -plugin.listlocks.locked.by=gesperrt für +plugin.listlocks.locked.by=gesperrt f\u00fcr plugin.listlocks.acquired=gesperrt ab plugin.listlocks.expires=gesperrt bis plugin.listlocks.no.locks.exist=Momentan existieren keine Sperren. # ReferringUndefinedPagesPlugin referringundefinedpagesplugin.more = ... und {0} weitere +CurrentTimePlugin= +Denounce=Denunzieren Sie einen Link +Groups=Alle Wiki-Gruppen anzeigen +Image=F\u00fcge ein Bild ein +IfPlugin=IF-Plugin +IndexPlugin=Index aller Seiten +InsertPage=F\u00fcgen Sie eine weitere Seite ein +ListLocksPlugin=Seitensperren auflisten +Note=Hinweis (Tooltip) +PageViewPlugin=Anzahl der Seitenaufrufe +RecentChangesPlugin=Zeigt die zuletzt ge\u00e4nderten Seiten an +ReferredPagesPlugin=Ausgehende Links (verwiesene Seiten) +ReferringPagesPlugin=Eingehende Links (verweisende Seiten) +ReferringUndefinedPagesPlugin=Seiten mit defekten Links +Search=Suchanfrage einf\u00fcgen +TableOfConents=Inhaltsverzeichnis +UndefinedPagesPlugin=Fehlende Seiten auflisten +UnusedPagesPlugin=Liste der verwaisten Seiten +WeblogArchivePlugin=Zeigt eine Liste \u00e4lterer Weblog-Eintr\u00e4ge an +WeblogEntryPlugin=Erstellt einen neuen Blogeintrag +WeblogPlugin=Erstellt einen Weblog diff --git a/jspwiki-main/src/main/resources/plugin/PluginResources_es.properties b/jspwiki-main/src/main/resources/plugin/PluginResources_es.properties index 23d0d5899f..8037e8fd49 100644 --- a/jspwiki-main/src/main/resources/plugin/PluginResources_es.properties +++ b/jspwiki-main/src/main/resources/plugin/PluginResources_es.properties @@ -21,14 +21,14 @@ # Errors rendering plugins -plugin.error.insertionfailed = {0} : {1} - Fallo en la inserción del Plugin: {2} +plugin.error.insertionfailed = {0} : {1} - Fallo en la inserci\u00f3n del Plugin: {2} plugin.error.cannotinstantiate = No se pudo instanciar el plugin {0} -plugin.error.notallowed = No está permitido el acceso al plugin {0} -plugin.error.instantationfailed = La instanciación del plugin {0} ha fallado. +plugin.error.notallowed = No est\u00e1 permitido el acceso al plugin {0} +plugin.error.instantationfailed = La instanciaci\u00f3n del plugin {0} ha fallado. plugin.error.failed = El plugin ha fallado plugin.error.couldnotfind = No se pudo encontrar el plugin {0} plugin.error.notawikiplugin = La clase {0} no es un plugin del Wiki. -plugin.error.missingparameter = Parámetro faltante en la definición del plugin: {0} +plugin.error.missingparameter = Par\u00e1metro faltante en la definici\u00f3n del plugin: {0} plugin.error.parsingarguments = Zyrf. Problemas al parsear los argumentos: {0} # TableOfContents @@ -38,18 +38,18 @@ tableofcontents.title = Tabla de Contenidos bugreporthandler.new = Se ha creado un nuevo informe de errores: {0} bugreporthandler.unable = ¡No se pudo crear el nuevo informe de errores! -bugreporthandler.titlerequired = ¡El título es obligatorio! +bugreporthandler.titlerequired = ¡El t\u00edtulo es obligatorio! # CurrentTimePlugin -currenttimeplugin.badformat = Especificaste un formato erróneo +currenttimeplugin.badformat = Especificaste un formato err\u00f3neo # WeblogEntryPlugin weblogentryplugin.newentry = Nueva entrada weblogentryplugin.postedby = Publicado por {0}   weblogentryplugin.permalink = Enlace permanente -weblogentryplugin.addcomment = Añadir nuevo comentario ({0}) +weblogentryplugin.addcomment = A\u00f1adir nuevo comentario ({0}) weblogentryplugin.more = (más) # InserPagePlugin @@ -58,27 +58,48 @@ insertpage.more=Mu00e1s... # ReferringPagesPlugin # This is in JSPWikiMarkup; {0} is where you put in the number -referringpagesplugin.more = ... y {0} más +referringpagesplugin.more = ... y {0} m\u00e1s referringpagesplugin.nobody = ...nadie # Forms plugins formclose.noneedtoshow = (no es necesario mostrar el cierre ahora) -forminput.namemissing = El elemento campo de entrada no tiene definido el parámetro 'name'. +forminput.namemissing = El elemento campo de entrada no tiene definido el par\u00e1metro 'name'. forminput.noneedtoshow = (no es necesario mostrar el campo de entrada de texto ahora) -formopen.missingparam = El elemento FormOpen no tiene definido el parámetro '{0}'. +formopen.missingparam = El elemento FormOpen no tiene definido el par\u00e1metro '{0}'. formopen.postorgetonly = El atributo 'Method' debe ser obligatoriamente 'post' o 'get' formopen.noneedtoshow = (no es necesario mostrar la apertura del form ahora) formoutput.missingargument = El argumento '{0}' es requerido por el plugin Form -formselect.namemissing = El elemento Select no tiene definido el parámetro 'name'. +formselect.namemissing = El elemento Select no tiene definido el par\u00e1metro 'name'. formtextarea.noneedtoshow = (no es necesario mostrar el campo textarea ahora) -formtextarea.namemissing = El elemento Textarea no tiene definido el parámetro 'name'. +formtextarea.namemissing = El elemento Textarea no tiene definido el par\u00e1metro 'name'. # ListLocks plugin -plugin.listlocks.page=Página +plugin.listlocks.page=P\u00e1gina plugin.listlocks.locked.by=Bloqueada por plugin.listlocks.acquired=Adquirida plugin.listlocks.expires=Expira plugin.listlocks.no.locks.exist=No existen bloqueos actualmente. # ReferringUndefinedPagesPlugin -referringundefinedpagesplugin.more = ... y {0} más \ No newline at end of file +referringundefinedpagesplugin.more = ... y {0} m\u00e1s +CurrentTimePlugin=Insertar hora actual +Denounce=Denunciar un enlace +Groups=Ver todos los grupos Wiki +Image=Insertar una imagen +IfPlugin=Complemento SI +IndexPlugin=\u00cdndice de todas las p\u00e1ginas. +InsertPage=Insertar otra p\u00e1gina +ListLocksPlugin=Bloqueos de p\u00e1gina de lista +Note=Nota (informaci\u00f3n sobre herramientas) +PageViewPlugin=N\u00famero de visitas a esta p\u00e1gina +RecentChangesPlugin=Muestra las p\u00e1ginas modificadas recientemente. +ReferredPagesPlugin=Enlaces salientes (p\u00e1ginas de referencia) +ReferringPagesPlugin=Enlaces entrantes (p\u00e1ginas de referencia) +ReferringUndefinedPagesPlugin=P\u00e1ginas con enlaces rotos +Search=Insertar una consulta de b\u00fasqueda +TableOfConents=Sommario +UndefinedPagesPlugin=Lista de p\u00e1ginas que faltan +UnusedPagesPlugin=Lista de p\u00e1ginas que han quedado hu\u00e9rfanas +WeblogArchivePlugin=Muestra una lista de entradas antiguas del blog. +WeblogEntryPlugin=Crea una nueva entrada en el blog +WeblogPlugin=Crea un blog diff --git a/jspwiki-main/src/main/resources/plugin/PluginResources_fi.properties b/jspwiki-main/src/main/resources/plugin/PluginResources_fi.properties index 25e1bdfbf3..c27bb9e48f 100644 --- a/jspwiki-main/src/main/resources/plugin/PluginResources_fi.properties +++ b/jspwiki-main/src/main/resources/plugin/PluginResources_fi.properties @@ -80,3 +80,24 @@ weblogentryplugin.permalink=Pysyv\u00e4 linkki weblogentryplugin.addcomment= Lis\u00e4\u00e4 uusi kommentti ({0}) weblogentryplugin.more=(lis\u00e4\u00e4) insertpage.more=Lis\u00e4\u00e4... +CurrentTimePlugin=Lis\u00e4\u00e4 nykyinen aika +Denounce=Hylk\u00e4\u00e4 linkki +Groups=N\u00e4yt\u00e4 kaikki wikiryhm\u00e4t +Image=Lis\u00e4\u00e4 kuva +IfPlugin=IF-laajennus +IndexPlugin=Kaikkien sivujen hakemisto +InsertPage=Lis\u00e4\u00e4 toinen sivu +ListLocksPlugin=Listaa sivun lukitukset +Note=Huomautus (ty\u00f6kaluvihje) +PageViewPlugin=Laske t\u00e4m\u00e4n sivun katselukerrat +RecentChangesPlugin=N\u00e4ytt\u00e4\u00e4 viimeksi muutetut sivut +ReferredPagesPlugin=L\u00e4htev\u00e4t linkit (viittaukset) +ReferringPagesPlugin=Saapuvat linkit (viittaavat sivut) +ReferringUndefinedPagesPlugin=Sivut, jotka sis\u00e4lt\u00e4v\u00e4t toimimattomia linkkej\u00e4 +Search=Lis\u00e4\u00e4 hakukysely +TableOfConents=Sis\u00e4llysluettelo +UndefinedPagesPlugin=Listaa puuttuvat sivut +UnusedPagesPlugin=Listaa orvoiksi j\u00e4\u00e4neet sivut +WeblogArchivePlugin=N\u00e4ytt\u00e4\u00e4 luettelon vanhemmista blogimerkinn\u00f6ist\u00e4 +WeblogEntryPlugin=Tekee uuden blogimerkinn\u00e4n +WeblogPlugin=Rakentaa weblogin diff --git a/jspwiki-main/src/main/resources/plugin/PluginResources_fr.properties b/jspwiki-main/src/main/resources/plugin/PluginResources_fr.properties index 2b59b83514..a459374e17 100644 --- a/jspwiki-main/src/main/resources/plugin/PluginResources_fr.properties +++ b/jspwiki-main/src/main/resources/plugin/PluginResources_fr.properties @@ -17,46 +17,46 @@ # This is the French language bundle for JSPWiki core plugins # Don't add your own plugins to this file; create your own bundle, please. -# Ceci est le bundle de langue franÁaise pour les plugins noyau de JSPWiki -# N'ajoutez pas vos propres ressources ? ce fichier ; veuillez crÈer votre propre bundle ? la place. +# Ceci est le bundle de langue fran\u00c1aise pour les plugins noyau de JSPWiki +# N'ajoutez pas vos propres ressources ? ce fichier ; veuillez cr\u00c8er votre propre bundle ? la place. # # Every non-English sign is written as Java Unicode sequence -# Warning: in every property value, which is a MessageFormat pattern (with {xx} in it), simple quotes (\u0027) MUST be doubled -# Tous les signes non-anglais sont Ècrits sous la forme de sÈquences Unicode Java -# Attention : dans toutes les valeurs de propriÈtÈs qui sont des patrons MessageFormat (avec un ou plusieurs {xx}), les apostrophes (\u0027) DOIVENT Ítre dupliquÈes +# Warning: in every property value, which is a MessageFormat pattern (with {xx} in it), simple quotes (') MUST be doubled +# Tous les signes non-anglais sont \u00c8crits sous la forme de s\u00c8quences Unicode Java +# Attention : dans toutes les valeurs de propri\u00c8t\u00c8s qui sont des patrons MessageFormat (avec un ou plusieurs {xx}), les apostrophes (') DOIVENT \u00cdtre dupliqu\u00c8es -# ElÈments communs +# El\u00c8ments communs # Erreurs d'activation des plugins -plugin.error.insertionfailed = {0} : {1} - Echec d\u0027\u0027insertion de plugin\u00A0: {2} -plugin.error.cannotinstantiate = Impossible d\u0027\u0027instancier le plugin {0} -plugin.error.notallowed = Acc\u00E8s au plugin {0} refus\u00E9 -plugin.error.instantationfailed = Echec d\u0027\u0027instantiation du plugin {0}. +plugin.error.insertionfailed = {0} : {1} - Echec d''insertion de plugin\u00a0: {2} +plugin.error.cannotinstantiate = Impossible d''instancier le plugin {0} +plugin.error.notallowed = Acc\u00e8s au plugin {0} refus\u00e9 +plugin.error.instantationfailed = Echec d''instantiation du plugin {0}. plugin.error.failed = Echec du plugin. plugin.error.couldnotfind = Impossible de trouver le plugin {0} -plugin.error.notawikiplugin = La classe {0} n\u0027\u0027est pas un plugin Wiki. -plugin.error.missingparameter = Param\u00E8tre manquant dans la d\u00E9finition du plugin\u00A0: {0} -plugin.error.parsingarguments = Argh\u00A0! Probl\u00E8mes rencontr\u00E9s en analysant les arguments\u00A0: {0} +plugin.error.notawikiplugin = La classe {0} n''est pas un plugin Wiki. +plugin.error.missingparameter = Param\u00e8tre manquant dans la d\u00e9finition du plugin\u00a0: {0} +plugin.error.parsingarguments = Argh\u00a0! Probl\u00e8mes rencontr\u00e9s en analysant les arguments\u00a0: {0} # TableOfContents -tableofcontents.title = Table des mati\u00E8res +tableofcontents.title = Table des mati\u00e8res # BugReportHandler -bugreporthandler.new = Une nouvelle page a \u00E9t\u00E9 cr\u00E9\u00E9e\u00A0: {0} -bugreporthandler.unable = Impossible de cr\u00E9er une nouvelle page\u00A0! -bugreporthandler.titlerequired = Un titre est requis\u00A0! +bugreporthandler.new = Une nouvelle page a \u00e9t\u00e9 cr\u00e9\u00e9e\u00a0: {0} +bugreporthandler.unable = Impossible de cr\u00e9er une nouvelle page\u00a0! +bugreporthandler.titlerequired = Un titre est requis\u00a0! # CurrentTimePlugin -currenttimeplugin.badformat = Le format que vous avez sp\u00E9cifi\u00E9 est incorrect +currenttimeplugin.badformat = Le format que vous avez sp\u00e9cifi\u00e9 est incorrect # WeblogEntryPlugin -weblogentryplugin.newentry = Nouvelle entr\u00E9e -weblogentryplugin.postedby = Publi\u00E9 par {0}   +weblogentryplugin.newentry = Nouvelle entr\u00e9e +weblogentryplugin.postedby = Publi\u00e9 par {0}   weblogentryplugin.permalink = Permalien weblogentryplugin.addcomment = Ajouter nouveau commentaire ({0}) weblogentryplugin.more = (plus ) @@ -71,26 +71,47 @@ referringpagesplugin.more = ...et [{0} plus |{1}]\\\\ referringpagesplugin.nobody = ...personne # Plugins Forms -formclose.noneedtoshow = (inutile de montrer le bouton de fermeture imm\u00E9diatement) -forminput.namemissing = L\u0027\u00E9l\u00E9ment d\u0027entr\u00E9e requiert le param\u00E8tre "name". -forminput.noneedtoshow = (inutile de montrer le champ d\u0027entr\u00E9e imm\u00E9diatement) -formopen.missingparam = L\u0027\u0027\u00E9l\u00E9ment d\u0027\u0027ouverture requiert le param\u00E8tre "{0}". -formopen.postorgetonly = La m\u00E9thode doit Ítre "post" ou "get" -formopen.noneedtoshow = (inutile de montrer le bouton d\u0027ouverture imm\u00E9diatement) +formclose.noneedtoshow = (inutile de montrer le bouton de fermeture imm\u00e9diatement) +forminput.namemissing = L'\u00e9l\u00e9ment d'entr\u00e9e requiert le param\u00e8tre "name". +forminput.noneedtoshow = (inutile de montrer le champ d'entr\u00e9e imm\u00e9diatement) +formopen.missingparam = L''\u00e9l\u00e9ment d''ouverture requiert le param\u00e8tre "{0}". +formopen.postorgetonly = La m\u00e9thode doit \u00cdtre "post" ou "get" +formopen.noneedtoshow = (inutile de montrer le bouton d'ouverture imm\u00e9diatement) formoutput.missingargument = Argument "{0}" requis pour le plugin Form -formselect.namemissing = L\u0027\u00E9l\u00E9ment SELECT requiert le param\u00E8tre "name". -formtextarea.noneedtoshow = (inutile de montrer le champ de saisie imm\u00E9diatement) -formtextarea.namemissing = Le champ de saisie requiert le param\u00E8tre "name". +formselect.namemissing = L'\u00e9l\u00e9ment SELECT requiert le param\u00e8tre "name". +formtextarea.noneedtoshow = (inutile de montrer le champ de saisie imm\u00e9diatement) +formtextarea.namemissing = Le champ de saisie requiert le param\u00e8tre "name". # Plugin ListLocks plugin.listlocks.page=Page -plugin.listlocks.locked.by=Verrouill\u00E9e par -plugin.listlocks.acquired=Verrouill\u00E9e depuis -plugin.listlocks.expires=Verrouill\u00E9e jusqu\u0027\u00E0 -plugin.listlocks.no.locks.exist=Aucun verrou n\u0027est pos\u00E9 pour le moment. +plugin.listlocks.locked.by=Verrouill\u00e9e par +plugin.listlocks.acquired=Verrouill\u00e9e depuis +plugin.listlocks.expires=Verrouill\u00e9e jusqu'\u00e0 +plugin.listlocks.no.locks.exist=Aucun verrou n'est pos\u00e9 pour le moment. #Plugin Denounce -#denounce.denouncetext = <Le lien vers les moteurs de recherche d\u00E9sapprouv\u00E9s a \u00E9t\u00E9 supprim\u00E9> +#denounce.denouncetext = <Le lien vers les moteurs de recherche d\u00e9sapprouv\u00e9s a \u00e9t\u00e9 supprim\u00e9> # ReferringUndefinedPagesPlugin referringundefinedpagesplugin.more = ...et [{0} plus |{1}]\\\\ +CurrentTimePlugin=Ins\u00e9rer l'heure actuelle +Denounce=D\u00e9noncer un lien +Groups=Afficher tous les groupes Wiki +Image=Ins\u00e9rer une image +IfPlugin=SI Plugin +IndexPlugin=Index de toutes les pages +InsertPage=Ins\u00e9rer une autre page +ListLocksPlugin=Verrous de page de liste +Note=Note (info-bulle) +PageViewPlugin=Nombre de vues de cette page +RecentChangesPlugin=Affiche les pages r\u00e9cemment modifi\u00e9es +ReferredPagesPlugin=Liens sortants (pages r\u00e9f\u00e9renc\u00e9es) +ReferringPagesPlugin=Liens entrants (pages r\u00e9f\u00e9rentes) +ReferringUndefinedPagesPlugin=Pages contenant des liens morts +Search=Ins\u00e9rer une requ\u00eate de recherche +TableOfConents=Table des mati\u00e8res +UndefinedPagesPlugin=Liste des pages manquantes +UnusedPagesPlugin=Liste des pages orphelines +WeblogArchivePlugin=Affiche une liste d'articles de blog plus anciens +WeblogEntryPlugin=Cr\u00e9e un nouvel article de blog +WeblogPlugin=Cr\u00e9e un blog diff --git a/jspwiki-main/src/main/resources/plugin/PluginResources_it.properties b/jspwiki-main/src/main/resources/plugin/PluginResources_it.properties index 57bfc23076..7cd9e0907d 100644 --- a/jspwiki-main/src/main/resources/plugin/PluginResources_it.properties +++ b/jspwiki-main/src/main/resources/plugin/PluginResources_it.properties @@ -79,3 +79,24 @@ weblogentryplugin.permalink=Collegamento permanente weblogentryplugin.addcomment= Aggiungi un nuovo commento ({0}) weblogentryplugin.more=(Di pi\u00f9) insertpage.more=Di pi\u00f9... +CurrentTimePlugin=Inserisci l'ora corrente +Denounce=Denunciare un collegamento +Groups=Visualizza tutti i gruppi Wiki +Image=Inserisci un'immagine +IfPlugin=SE Plugin +IndexPlugin=Indice di tutte le pagine +InsertPage=Inserisci un'altra pagina +ListLocksPlugin=Elenco blocchi pagina +Note=Nota (suggerimento) +PageViewPlugin=Conta le visualizzazioni di questa pagina +RecentChangesPlugin=Visualizza le pagine modificate di recente +ReferredPagesPlugin=Link in uscita (pagine referenziate) +ReferringPagesPlugin=Link in entrata (pagine di riferimento) +ReferringUndefinedPagesPlugin=Pagine contenenti link non funzionanti +Search=Inserisci una query di ricerca +TableOfConents=Sommario +UndefinedPagesPlugin=Elenca le pagine mancanti +UnusedPagesPlugin=Elenca le pagine che sono rimaste orfane +WeblogArchivePlugin=Visualizza un elenco di voci di weblog pi\u00f9 vecchie +WeblogEntryPlugin=Crea una nuova voce del weblog +WeblogPlugin=Crea un weblog diff --git a/jspwiki-main/src/main/resources/plugin/PluginResources_nl.properties b/jspwiki-main/src/main/resources/plugin/PluginResources_nl.properties index 9438f4473d..b0fb8cb0af 100644 --- a/jspwiki-main/src/main/resources/plugin/PluginResources_nl.properties +++ b/jspwiki-main/src/main/resources/plugin/PluginResources_nl.properties @@ -87,3 +87,24 @@ referringundefinedpagesplugin.more = ... en {0} meer weblogentryplugin.postedby=Geplaatst door {0}   weblogentryplugin.more=(meer) insertpage.more=Meer... +CurrentTimePlugin=Voeg huidige tijd in +Denounce=Een link afwijzen +Groups=Bekijk alle Wiki-groepen +Image=Afbeelding invoegen +IfPlugin=IF-plug-in +IndexPlugin=Index van alle pagina's +InsertPage=Voeg nog een pagina in +ListLocksPlugin=Lijstpaginavergrendelingen +Note=Opmerking (tooltip) +PageViewPlugin=Aantal weergaven van deze pagina +RecentChangesPlugin=Geeft de recent gewijzigde pagina's weer +ReferredPagesPlugin=Uitgaande links (verwezen pagina's) +ReferringPagesPlugin=Inkomende links (verwijzende pagina's) +ReferringUndefinedPagesPlugin=Pagina's met dode links +Search=Een zoekopdracht invoegen +TableOfConents=Inhoudsopgave +UndefinedPagesPlugin=Lijst met ontbrekende pagina's +UnusedPagesPlugin=Lijst met pagina's die zijn verweesd +WeblogArchivePlugin=Geeft een lijst weer met oudere weblogberichten +WeblogEntryPlugin=Maakt een nieuw weblogbericht +WeblogPlugin=Bouwt een weblog diff --git a/jspwiki-main/src/main/resources/plugin/PluginResources_pt_BR.properties b/jspwiki-main/src/main/resources/plugin/PluginResources_pt_BR.properties index 3f903b204b..2016683a6a 100644 --- a/jspwiki-main/src/main/resources/plugin/PluginResources_pt_BR.properties +++ b/jspwiki-main/src/main/resources/plugin/PluginResources_pt_BR.properties @@ -79,3 +79,24 @@ weblogentryplugin.permalink=Link permanente weblogentryplugin.addcomment= Adicionar novo coment\u00e1rio ({0}) weblogentryplugin.more=(mais) insertpage.more=Mais... +CurrentTimePlugin=Inserir hora atual +Denounce=Denunciar um link +Groups=Ver todos os grupos Wiki +Image=Inserir uma imagem +IfPlugin=Plug-in SE +IndexPlugin=\u00cdndice de todas as p\u00e1ginas +InsertPage=Insira outra p\u00e1gina +ListLocksPlugin=Listar bloqueios de p\u00e1gina +Note=Nota (dica de ferramenta) +PageViewPlugin=N\u00famero de visualiza\u00e7\u00f5es desta p\u00e1gina +RecentChangesPlugin=Exibe as p\u00e1ginas alteradas recentemente. +ReferredPagesPlugin=Links externos (p\u00e1ginas referenciadas) +ReferringPagesPlugin=Links de entrada (p\u00e1ginas de refer\u00eancia) +ReferringUndefinedPagesPlugin=P\u00e1ginas contendo links quebrados +Search=Insira uma consulta de pesquisa +TableOfConents=\u00cdndice +UndefinedPagesPlugin=Liste as p\u00e1ginas que est\u00e3o faltando. +UnusedPagesPlugin=Liste as p\u00e1ginas que ficaram \u00f3rf\u00e3s. +WeblogArchivePlugin=Exibe uma lista de entradas antigas do blog. +WeblogEntryPlugin=Cria uma nova entrada no blog. +WeblogPlugin=Constr\u00f3i um blog diff --git a/jspwiki-main/src/main/resources/plugin/PluginResources_ru.properties b/jspwiki-main/src/main/resources/plugin/PluginResources_ru.properties index 6f484fe22f..35e7941611 100644 --- a/jspwiki-main/src/main/resources/plugin/PluginResources_ru.properties +++ b/jspwiki-main/src/main/resources/plugin/PluginResources_ru.properties @@ -79,3 +79,24 @@ weblogentryplugin.permalink=\u041f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u04 weblogentryplugin.addcomment= \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 ({0}) weblogentryplugin.more=(\u0431\u043e\u043b\u0435\u0435) insertpage.more=\u0411\u043e\u043b\u0435\u0435... +CurrentTimePlugin=\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f +Denounce=\u041e\u0442\u043a\u043b\u043e\u043d\u0438\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443 +Groups=\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432\u0441\u0435 \u0433\u0440\u0443\u043f\u043f\u044b Wiki +Image=\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 +IfPlugin=\u0415\u0421\u041b\u0418 \u043f\u043b\u0430\u0433\u0438\u043d +IndexPlugin=\u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0432\u0441\u0435\u0445 \u0441\u0442\u0440\u0430\u043d\u0438\u0446 +InsertPage=\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0434\u0440\u0443\u0433\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 +ListLocksPlugin=\u0421\u043f\u0438\u0441\u043e\u043a \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043e\u043a \u0441\u0442\u0440\u0430\u043d\u0438\u0446 +Note=\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435 (\u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430) +PageViewPlugin=\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u043e\u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b +RecentChangesPlugin=\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043d\u044b\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b +ReferredPagesPlugin=\u0418\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0441\u0441\u044b\u043b\u043a\u0438 (\u0441\u0441\u044b\u043b\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b) +ReferringPagesPlugin=\u0412\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0441\u0441\u044b\u043b\u043a\u0438 (\u0441\u0441\u044b\u043b\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b) +ReferringUndefinedPagesPlugin=\u0421\u0442\u0440\u0430\u043d\u0438\u0446\u044b, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0435 \u043d\u0435\u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0435 \u0441\u0441\u044b\u043b\u043a\u0438 +Search=\u0412\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u043f\u043e\u0438\u0441\u043a\u043e\u0432\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 +TableOfConents=\u041e\u0433\u043b\u0430\u0432\u043b\u0435\u043d\u0438\u0435 +UndefinedPagesPlugin=\u0421\u043f\u0438\u0441\u043e\u043a \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0441\u0442\u0440\u0430\u043d\u0438\u0446 +UnusedPagesPlugin=\u0421\u043f\u0438\u0441\u043e\u043a \u0441\u0442\u0440\u0430\u043d\u0438\u0446, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u044b\u043b\u0438 \u043f\u043e\u0442\u0435\u0440\u044f\u043d\u044b +WeblogArchivePlugin=\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u0442\u0430\u0440\u044b\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0432 \u0431\u043b\u043e\u0433\u0435 +WeblogEntryPlugin=\u0421\u043e\u0437\u0434\u0430\u0435\u0442 \u043d\u043e\u0432\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u0432\u0435\u0431-\u0431\u043b\u043e\u0433\u0435 +WeblogPlugin=\u0421\u043e\u0437\u0434\u0430\u0435\u0442 \u0432\u0435\u0431\u043b\u043e\u0433 diff --git a/jspwiki-main/src/main/resources/plugin/PluginResources_zh_CN.properties b/jspwiki-main/src/main/resources/plugin/PluginResources_zh_CN.properties index cb2fd83c1e..7789201117 100644 --- a/jspwiki-main/src/main/resources/plugin/PluginResources_zh_CN.properties +++ b/jspwiki-main/src/main/resources/plugin/PluginResources_zh_CN.properties @@ -80,3 +80,24 @@ weblogentryplugin.permalink=\u6c38\u4e45\u94fe\u63a5 weblogentryplugin.addcomment=\u6dfb\u52a0\u65b0\u8bc4\u8bba ({0}) weblogentryplugin.more=\uff08\u66f4\u591a\u7684\uff09 insertpage.more=\u66f4\u591a\u7684... +CurrentTimePlugin=\u63d2\u5165\u5f53\u524d\u65f6\u95f4 +Denounce=\u8c34\u8d23\u94fe\u63a5 +Groups=\u67e5\u770b\u6240\u6709\u7ef4\u57fa\u7fa4\u7ec4 +Image=\u63d2\u5165\u56fe\u7247 +IfPlugin=\u5982\u679c\u63d2\u4ef6 +IndexPlugin=\u6240\u6709\u9875\u9762\u7684\u7d22\u5f15 +InsertPage=\u63d2\u5165\u53e6\u4e00\u9875 +ListLocksPlugin=\u5217\u8868\u9875\u9762\u9501\u5b9a +Note=\u6ce8\uff08\u5de5\u5177\u63d0\u793a\uff09 +PageViewPlugin=\u7edf\u8ba1\u6b64\u9875\u9762\u7684\u6d4f\u89c8\u91cf +RecentChangesPlugin=\u663e\u793a\u6700\u8fd1\u66f4\u6539\u7684\u9875\u9762 +ReferredPagesPlugin=\u5916\u90e8\u94fe\u63a5\uff08\u5f15\u7528\u9875\u9762\uff09 +ReferringPagesPlugin=\u5916\u90e8\u94fe\u63a5\uff08\u5f15\u7528\u9875\u9762\uff09 +ReferringUndefinedPagesPlugin=\u5305\u542b\u6b7b\u94fe\u63a5\u7684\u9875\u9762 +Search=\u63d2\u5165\u641c\u7d22\u67e5\u8be2 +TableOfConents=\u76ee\u5f55 +UndefinedPagesPlugin=\u5217\u51fa\u7f3a\u5931\u7684\u9875\u9762 +UnusedPagesPlugin=\u5217\u51fa\u5df2\u5b64\u7acb\u9875\u9762 +WeblogArchivePlugin=\u663e\u793a\u8f83\u65e9\u7684\u535a\u5ba2\u6587\u7ae0\u5217\u8868 +WeblogEntryPlugin=\u521b\u5efa\u65b0\u7684\u535a\u5ba2\u6587\u7ae0 +WeblogPlugin=\u5efa\u7acb\u535a\u5ba2 diff --git a/jspwiki-main/src/test/java/org/apache/wiki/ui/admin/beans/PluginBeanTest.java b/jspwiki-main/src/test/java/org/apache/wiki/ui/admin/beans/PluginBeanTest.java index bfa7f6710a..ebbc575a08 100644 --- a/jspwiki-main/src/test/java/org/apache/wiki/ui/admin/beans/PluginBeanTest.java +++ b/jspwiki-main/src/test/java/org/apache/wiki/ui/admin/beans/PluginBeanTest.java @@ -28,29 +28,49 @@ Licensed to the Apache Software Foundation (ASF) under one import javax.management.NotCompliantMBeanException; import java.util.Properties; - public class PluginBeanTest { - + Properties props = TestEngine.getTestProperties(); TestEngine testEngine; - + @Test public void testDoGet() throws WikiException, NotCompliantMBeanException { - testEngine = new TestEngine( props ); - final Context context = Wiki.context().create( testEngine, Wiki.contents().page( testEngine, "TestPage01" ) ); - final PluginBean pb = new PluginBean( testEngine ); - final String expectedHtml = "

" + - "

Plugins

" + - "" + - "" + - "" + - "" + - "" + - "" + - "
NameAliasAuthorNotes
IfPluginIfJanne Jalkanen
NoteJanne Jalkanen
SamplePluginsamplealiasJanne Jalkanen
SamplePlugin2samplealias2Janne Jalkanen
" + - "
"; - Assertions.assertEquals( expectedHtml, pb.doGet( context ) ); + testEngine = new TestEngine(props); + final Context context = Wiki.context().create(testEngine, Wiki.contents().page(testEngine, "TestPage01")); + final PluginBean pb = new PluginBean(testEngine); + final String expectedHtml = + "
" + + "

Plugins

" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "
NameAliasAuthorNotes
CounterASF
CurrentTimePluginASF
DenounceASF
GroupsASF
IfPluginIfJanne Jalkanen
ImageASF
IndexPluginASF
InsertPageASF
ListLocksPluginASF
NoteJanne Jalkanen
PageViewPluginASF
RecentChangesPluginASF
ReferredPagesPluginASF
ReferringPagesPluginASF
ReferringUndefinedPagesPluginASF
SamplePluginsamplealiasJanne Jalkanen
SamplePlugin2samplealias2Janne Jalkanen
SearchASF
TableOfContentsASF
UndefinedPagesPluginASF
UnusedPagesPluginASF
WeblogArchivePluginASF
WeblogEntryPluginASF
WeblogPluginASF
" + + "
"; + Assertions.assertEquals(expectedHtml, pb.doGet(context)); } } diff --git a/jspwiki-markdown/src/main/javascript/Wiki.Snips.Markdown.js b/jspwiki-markdown/src/main/javascript/Wiki.Snips.Markdown.js index 32bc5ce11a..94ccd7a0bd 100644 --- a/jspwiki-markdown/src/main/javascript/Wiki.Snips.Markdown.js +++ b/jspwiki-markdown/src/main/javascript/Wiki.Snips.Markdown.js @@ -44,7 +44,7 @@ Function: snippets */ Wiki.Snips = { - + ready: false, // Snipe predefined commands find: { }, undo: { event: "undo" }, @@ -628,5 +628,32 @@ Wiki.Snips = { } }] + }, + + loadPlugins: function(){ + const pluginDiscoveryRequest2 = new XMLHttpRequest(); + pluginDiscoveryRequest2.open('GET', 'ajax/plugins/plugins', true); // true for asynchronous + pluginDiscoveryRequest2.onload = function() { + if (pluginDiscoveryRequest2.status >= 200 && pluginDiscoveryRequest2.status < 300) { + var data = JSON.parse(pluginDiscoveryRequest2.responseText); + //Wiki.Snips.pluginDlg["TableOfContents "] = "Table Of Contents "; + for (var i=0; i < data.length; i++) { + Wiki.Snips.pluginDlg.pluginDlg[1].body[data[i].snip] = data[i].displayName; + } + Wiki.Snips.ready = true; + } else { + console.error('Request failed. Returned status of ' + pluginDiscoveryRequest2.status); + Wiki.Snips.ready = true; + } + }; + pluginDiscoveryRequest2.onerror = function() { + console.error('Network error occurred'); + Wiki.Snips.ready = true; + }; + pluginDiscoveryRequest2.send(); } -} +}; + +window.addEventListener("load", function() { + Wiki.Snips.loadPlugins(); +}); \ No newline at end of file diff --git a/jspwiki-portable/build.xml b/jspwiki-portable/build.xml index 1c8fb31215..1f1914992b 100644 --- a/jspwiki-portable/build.xml +++ b/jspwiki-portable/build.xml @@ -75,6 +75,7 @@ + diff --git a/jspwiki-war/src/main/scripts/jspwiki-common.js b/jspwiki-war/src/main/scripts/jspwiki-common.js index 650ff44423..e6673089f7 100644 --- a/jspwiki-war/src/main/scripts/jspwiki-common.js +++ b/jspwiki-war/src/main/scripts/jspwiki-common.js @@ -52,6 +52,7 @@ Complementary Dynamic Styles (see jspwiki-commonstyles.js) * 270 WikiColumns: dynamic style * 300 Prettify: dynamic style +Note this file gets minimied/compiled into haddock.js */ /* extend mootools */ @@ -69,7 +70,7 @@ String.extend({ }); return text; } -}) +}); // get text of a dhtml node function $getText(el) { diff --git a/jspwiki-war/src/main/scripts/wiki-edit/Snipe.Snips.js b/jspwiki-war/src/main/scripts/wiki-edit/Snipe.Snips.js index fcf8e01ce9..0d92391ec4 100644 --- a/jspwiki-war/src/main/scripts/wiki-edit/Snipe.Snips.js +++ b/jspwiki-war/src/main/scripts/wiki-edit/Snipe.Snips.js @@ -55,46 +55,49 @@ Snipe.Snips = new Class({ self.suggestions = {}; for( cmd in snips ){ + try{ + snip = $.toFunction( snips[cmd] )( workarea, cmd ); - snip = $.toFunction( snips[cmd] )( workarea, cmd ); + // short format of snip + if( typeOf(snip) == "string" ){ snip = { snippet:snip }; } - // short format of snip - if( typeOf(snip) == "string" ){ snip = { snippet:snip }; } + //shortcut keys + if(snip.key && (key = snip.key) ){ - //shortcut keys - if( (key = snip.key) ){ + // key: "f" => "control+f" ; key: "shift+enter" (no change) + if( !key.contains( "+" ) ){ key = control + key; } + self.keys[ key.toLowerCase() ] = cmd; - // key: "f" => "control+f" ; key: "shift+enter" (no change) - if( !key.contains( "+" ) ){ key = control + key; } - self.keys[ key.toLowerCase() ] = cmd; + } - } + if( snip.suggest && (suggest = snip.suggest) ){ - if( (suggest = snip.suggest) ){ + //this is a suggest snippets + if( typeOf(suggest) == "string" ){ - //this is a suggest snippets - if( typeOf(suggest) == "string" ){ + snip.suggest = { + lback: RegExp( suggest + "$" ), + match: RegExp( "^" + suggest ) + } - snip.suggest = { - lback: RegExp( suggest + "$" ), - match: RegExp( "^" + suggest ) } - } - - self.suggestions[cmd] = snip; + self.suggestions[cmd] = snip; - //otherwise regular snippet - //} else { + //otherwise regular snippet + //} else { - } + } - //check for snip dialogs -- they have the same name as the command - //TODO better: use the dialog property ! - if( snip[cmd] ){ self.dialogs[cmd] = snip[cmd]; } //deprecated - if( snip.dialog ){ self.dialogs[cmd] = snip.dialog; } + //check for snip dialogs -- they have the same name as the command + //TODO better: use the dialog property ! + if( snip[cmd] ){ self.dialogs[cmd] = snip[cmd]; } //deprecated + if( snip.dialog ){ self.dialogs[cmd] = snip.dialog; } - snips[cmd] = snip; + snips[cmd] = snip; + } catch(e) { + console.debug(e); + } } //console.log(this.keys, this.suggest, this.snip); diff --git a/jspwiki-war/src/main/scripts/wiki/Wiki.js b/jspwiki-war/src/main/scripts/wiki/Wiki.js index f7c91d768c..5c62a76e9e 100644 --- a/jspwiki-war/src/main/scripts/wiki/Wiki.js +++ b/jspwiki-war/src/main/scripts/wiki/Wiki.js @@ -70,7 +70,14 @@ var Wiki = { wiki.add = behavior.add.bind(behavior); wiki.once = behavior.once.bind(behavior); wiki.update = behavior.update.bind(behavior); - + + setTimeout(function(){ + if (wiki.Snips) { + wiki.Snips.loadPlugins(); + } else { + console.warn("snips are not loaded yet, cannot fetch the plugin list"); + } + //add the standard jspwiki behaviors; needed to render the haddock JSP templates wiki.add( "body", wiki.caniuse ) @@ -170,6 +177,7 @@ var Wiki = { popstate: wiki.popstate, domready: wiki.domready.bind(wiki) }); + }, 500); },