From 48312272adb17610db96d50758e6af947cab7b1d Mon Sep 17 00:00:00 2001 From: Jermolene Date: Fri, 29 Aug 2014 09:54:31 +0100 Subject: [PATCH 01/21] Extend 'all' filter operator to select all source tiddlers --- core/modules/filters/all.js | 4 +++- editions/tw5.com/tiddlers/filters/FilterOperator all.tid | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/core/modules/filters/all.js b/core/modules/filters/all.js index ee31f4abb..da9e949dc 100644 --- a/core/modules/filters/all.js +++ b/core/modules/filters/all.js @@ -34,7 +34,9 @@ exports.all = function(source,operator,options) { var results = [], subops = operator.operand.split("+"); // Check for common optimisations - if(subops.length === 1 && subops[0] === "tiddlers") { + if(subops.length === 1 && subops[0] === "") { + return source; + } else if(subops.length === 1 && subops[0] === "tiddlers") { return options.wiki.each; } else if(subops.length === 1 && subops[0] === "shadows") { return options.wiki.eachShadow; diff --git a/editions/tw5.com/tiddlers/filters/FilterOperator all.tid b/editions/tw5.com/tiddlers/filters/FilterOperator all.tid index 44fb530c0..280703c02 100644 --- a/editions/tw5.com/tiddlers/filters/FilterOperator all.tid +++ b/editions/tw5.com/tiddlers/filters/FilterOperator all.tid @@ -17,4 +17,5 @@ For example: |`[all[current]]` |Selects the current tiddler | |`[all[missing]]` |Selects all MissingTiddlers | |`[all[orphans]]` |Selects all OrphanTiddlers | +|`[all[]]` |Selects all the source tiddlers available to the filter | From 2952afe7afb42bc98212dc5de2818ec0a18d89ef Mon Sep 17 00:00:00 2001 From: Jermolene Date: Fri, 29 Aug 2014 09:58:30 +0100 Subject: [PATCH 02/21] Fix for autosave MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Re-introduces the “tw-auto-save-wiki” message. The previous approach of automatically triggering autosave whenever a tiddler changed meant that changing configuration changes in control panel was triggering an autosave. Using the explicit message gives us better control of the situations in which we’ll autosave. Now we solve the earlier problem of there being outstanding tiddler change events at the time that we process the “tw-auto-save-wiki” by deferring the autosave until the outstanding change event comes in. --- core/modules/saver-handler.js | 262 ++++++++++++++++-------------- core/modules/utils/pluginmaker.js | 2 + core/modules/widgets/navigator.js | 6 + core/modules/wiki.js | 4 + core/wiki/config/SaverFilter.tid | 2 +- 5 files changed, 155 insertions(+), 121 deletions(-) diff --git a/core/modules/saver-handler.js b/core/modules/saver-handler.js index 89b10c872..b03ce976c 100644 --- a/core/modules/saver-handler.js +++ b/core/modules/saver-handler.js @@ -18,64 +18,86 @@ wiki: wiki to be synced dirtyTracking: true if dirty tracking should be performed */ function SaverHandler(options) { - var self = this; - this.wiki = options.wiki; - this.dirtyTracking = options.dirtyTracking; - // Make a logger - this.logger = new $tw.utils.Logger("saver-handler"); - // Initialise our savers - if($tw.browser) { - this.initSavers(); - } - // Only do dirty tracking if required - if($tw.browser && this.dirtyTracking) { - // Compile the dirty tiddler filter - this.filterFn = this.wiki.compileFilter(this.wiki.getTiddlerText(this.titleSyncFilter)); - // Count of tiddlers that have been changed but not yet saved - this.numTasksInQueue = 0; - // Listen out for changes to tiddlers - this.wiki.addEventListener("change",function(changes) { - var filteredChanges = self.filterFn.call(self.wiki,function(callback) { - $tw.utils.each(changes,function(change,title) { - var tiddler = self.wiki.getTiddler(title); - callback(tiddler,title); - }); - }); - self.numTasksInQueue += filteredChanges.length; - self.updateDirtyStatus(); - if(self.numTasksInQueue > 0) { - self.saveWiki({method: "autosave"}); - } - }); - // Browser event handlers - if($tw.browser) { - // Set up our beforeunload handler - window.addEventListener("beforeunload",function(event) { - var confirmationMessage = undefined; - if(self.isDirty()) { - confirmationMessage = $tw.language.getString("UnsavedChangesWarning"); - event.returnValue = confirmationMessage; // Gecko - } - return confirmationMessage; - }); - } - } - // Install the save action handlers - if($tw.browser) { - $tw.rootWidget.addEventListener("tm-save-wiki",function(event) { - self.saveWiki({ - template: event.param, - downloadType: "text/plain" - }); - }); - $tw.rootWidget.addEventListener("tm-download-file",function(event) { - self.saveWiki({ - method: "download", - template: event.param, - downloadType: "text/plain" - }); - }); - } + var self = this; + this.wiki = options.wiki; + this.dirtyTracking = options.dirtyTracking; + this.pendingAutoSave = false; + // Make a logger + this.logger = new $tw.utils.Logger("saver-handler"); + // Initialise our savers + if($tw.browser) { + this.initSavers(); + } + // Only do dirty tracking if required + if($tw.browser && this.dirtyTracking) { + // Compile the dirty tiddler filter + this.filterFn = this.wiki.compileFilter(this.wiki.getTiddlerText(this.titleSyncFilter)); + // Count of tiddlers that have been changed but not yet saved + this.numTasksInQueue = 0; + // Listen out for changes to tiddlers + this.wiki.addEventListener("change",function(changes) { + var filteredChanges = self.filterFn.call(self.wiki,function(callback) { + $tw.utils.each(changes,function(change,title) { + var tiddler = self.wiki.getTiddler(title); + callback(tiddler,title); + }); + }); + self.numTasksInQueue += filteredChanges.length; + self.updateDirtyStatus(); + // Do any autosave if one is pending and there's no more change events + if(self.pendingAutoSave && self.wiki.getSizeOfTiddlerEventQueue() === 0) { + // Check if we're dirty + if(self.numTasksInQueue > 0) { + self.saveWiki({ + method: "autosave", + downloadType: "text/plain" + }); + } + self.pendingAutoSave = false; + } + }); + // Listen for the autosave event + $tw.rootWidget.addEventListener("tw-auto-save-wiki",function(event) { + // Do the autosave unless there are outstanding tiddler change events + if(self.wiki.getSizeOfTiddlerEventQueue() === 0) { + // Check if we're dirty + if(self.numTasksInQueue > 0) { + self.saveWiki({ + method: "autosave", + downloadType: "text/plain" + }); + } + } else { + // Otherwise put ourselves in the "pending autosave" state and wait for the change event before we do the autosave + self.pendingAutoSave = true; + } + }); + // Set up our beforeunload handler + window.addEventListener("beforeunload",function(event) { + var confirmationMessage = undefined; + if(self.isDirty()) { + confirmationMessage = $tw.language.getString("UnsavedChangesWarning"); + event.returnValue = confirmationMessage; // Gecko + } + return confirmationMessage; + }); + } + // Install the save action handlers + if($tw.browser) { + $tw.rootWidget.addEventListener("tm-save-wiki",function(event) { + self.saveWiki({ + template: event.param, + downloadType: "text/plain" + }); + }); + $tw.rootWidget.addEventListener("tm-download-file",function(event) { + self.saveWiki({ + method: "download", + template: event.param, + downloadType: "text/plain" + }); + }); + } } SaverHandler.prototype.titleSyncFilter = "$:/config/SaverFilter"; @@ -86,86 +108,86 @@ SaverHandler.prototype.titleSavedNotification = "$:/language/Notifications/Save/ Select the appropriate saver modules and set them up */ SaverHandler.prototype.initSavers = function(moduleType) { - moduleType = moduleType || "saver"; - // Instantiate the available savers - this.savers = []; - var self = this; - $tw.modules.forEachModuleOfType(moduleType,function(title,module) { - if(module.canSave(self)) { - self.savers.push(module.create(self.wiki)); - } - }); - // Sort the savers into priority order - this.savers.sort(function(a,b) { - if(a.info.priority < b.info.priority) { - return -1; - } else { - if(a.info.priority > b.info.priority) { - return +1; - } else { - return 0; - } - } - }); + moduleType = moduleType || "saver"; + // Instantiate the available savers + this.savers = []; + var self = this; + $tw.modules.forEachModuleOfType(moduleType,function(title,module) { + if(module.canSave(self)) { + self.savers.push(module.create(self.wiki)); + } + }); + // Sort the savers into priority order + this.savers.sort(function(a,b) { + if(a.info.priority < b.info.priority) { + return -1; + } else { + if(a.info.priority > b.info.priority) { + return +1; + } else { + return 0; + } + } + }); }; /* Save the wiki contents. Options are: - method: "save", "autosave" or "download" - template: the tiddler containing the template to save - downloadType: the content type for the saved file + method: "save", "autosave" or "download" + template: the tiddler containing the template to save + downloadType: the content type for the saved file */ SaverHandler.prototype.saveWiki = function(options) { - options = options || {}; - var self = this, - method = options.method || "save", - template = options.template || "$:/core/save/all", - downloadType = options.downloadType || "text/plain", - text = this.wiki.renderTiddler(downloadType,template), - callback = function(err) { - if(err) { - alert("Error while saving:\n\n" + err); - } else { - // Clear the task queue if we're saving (rather than downloading) - if(method !== "download") { - self.numTasksInQueue = 0; - self.updateDirtyStatus(); - } - $tw.notifier.display(self.titleSavedNotification); - if(options.callback) { - options.callback(); - } - } - }; - // Ignore autosave if disabled - if(method === "autosave" && this.wiki.getTiddlerText(this.titleAutoSave,"yes") !== "yes") { - return false; - } - // Call the highest priority saver that supports this method - for(var t=this.savers.length-1; t>=0; t--) { - var saver = this.savers[t]; - if(saver.info.capabilities.indexOf(method) !== -1 && saver.save(text,method,callback)) { - this.logger.log("Saving wiki with method",method,"through saver",saver.info.name); - return true; - } - } - return false; + options = options || {}; + var self = this, + method = options.method || "save", + template = options.template || "$:/core/save/all", + downloadType = options.downloadType || "text/plain", + text = this.wiki.renderTiddler(downloadType,template), + callback = function(err) { + if(err) { + alert("Error while saving:\n\n" + err); + } else { + // Clear the task queue if we're saving (rather than downloading) + if(method !== "download") { + self.numTasksInQueue = 0; + self.updateDirtyStatus(); + } + $tw.notifier.display(self.titleSavedNotification); + if(options.callback) { + options.callback(); + } + } + }; + // Ignore autosave if disabled + if(method === "autosave" && this.wiki.getTiddlerText(this.titleAutoSave,"yes") !== "yes") { + return false; + } + // Call the highest priority saver that supports this method + for(var t=this.savers.length-1; t>=0; t--) { + var saver = this.savers[t]; + if(saver.info.capabilities.indexOf(method) !== -1 && saver.save(text,method,callback)) { + this.logger.log("Saving wiki with method",method,"through saver",saver.info.name); + return true; + } + } + return false; }; /* Checks whether the wiki is dirty (ie the window shouldn't be closed) */ SaverHandler.prototype.isDirty = function() { - return this.numTasksInQueue > 0; + return this.numTasksInQueue > 0; }; /* Update the document body with the class "tc-dirty" if the wiki has unsaved/unsynced changes */ SaverHandler.prototype.updateDirtyStatus = function() { - if($tw.browser) { - $tw.utils.toggleClass(document.body,"tc-dirty",this.isDirty()); - } + if($tw.browser) { + $tw.utils.toggleClass(document.body,"tc-dirty",this.isDirty()); + } }; exports.SaverHandler = SaverHandler; diff --git a/core/modules/utils/pluginmaker.js b/core/modules/utils/pluginmaker.js index 5cce747a0..eadef8e43 100644 --- a/core/modules/utils/pluginmaker.js +++ b/core/modules/utils/pluginmaker.js @@ -71,6 +71,8 @@ exports.repackPlugin = function(title,additionalTiddlers,excludeTiddlers) { $tw.wiki.deleteTiddler(title); } }); + // Trigger an autosave + $tw.rootWidget.dispatchEvent({type: "tw-auto-save-wiki"}); // Return a heartwarming confirmation return "Plugin " + title + " successfully saved"; } diff --git a/core/modules/widgets/navigator.js b/core/modules/widgets/navigator.js index 1ee5a42d3..e8edc321b 100755 --- a/core/modules/widgets/navigator.js +++ b/core/modules/widgets/navigator.js @@ -243,6 +243,8 @@ NavigatorWidget.prototype.handleDeleteTiddlerEvent = function(event) { // Remove the closed tiddler from the story this.removeTitleFromStory(storyList,title); this.saveStoryList(storyList); + // Trigger an autosave + $tw.rootWidget.dispatchEvent({type: "tw-auto-save-wiki"}); return false; }; @@ -331,6 +333,8 @@ NavigatorWidget.prototype.handleSaveTiddlerEvent = function(event) { if(draftTitle !== this.storyTitle) { this.saveStoryList(storyList); } + // Trigger an autosave + $tw.rootWidget.dispatchEvent({type: "tw-auto-save-wiki"}); } } } @@ -478,6 +482,8 @@ NavigatorWidget.prototype.handlePerformImportEvent = function(event) { })); // Navigate to the $:/Import tiddler this.addToHistory([IMPORT_TITLE]); + // Trigger an autosave + $tw.rootWidget.dispatchEvent({type: "tw-auto-save-wiki"}); }; exports.navigator = NavigatorWidget; diff --git a/core/modules/wiki.js b/core/modules/wiki.js index 1cc2c2fb8..f8d3c8323 100755 --- a/core/modules/wiki.js +++ b/core/modules/wiki.js @@ -152,6 +152,10 @@ exports.enqueueTiddlerEvent = function(title,isDeleted) { } }; +exports.getSizeOfTiddlerEventQueue = function() { + return $tw.utils.count(this.changedTiddlers); +}; + exports.clearTiddlerEventQueue = function() { this.changedTiddlers = Object.create(null); this.changeCount = Object.create(null) diff --git a/core/wiki/config/SaverFilter.tid b/core/wiki/config/SaverFilter.tid index 4b4fab9c2..b364b9c5c 100644 --- a/core/wiki/config/SaverFilter.tid +++ b/core/wiki/config/SaverFilter.tid @@ -1,3 +1,3 @@ title: $:/config/SaverFilter -[!is[shadow]] -[[$:/HistoryList]] -[[$:/StoryList]] -[[$:/Import]] -[[$:/isEncrypted]] -[[$:/UploadName]] -[prefix[$:/status]] -[prefix[$:/state]] -[prefix[$:/temp]] -[has[draft.of]] \ No newline at end of file +[all[]] -[[$:/HistoryList]] -[[$:/StoryList]] -[[$:/Import]] -[[$:/isEncrypted]] -[[$:/UploadName]] -[prefix[$:/state]] -[prefix[$:/temp]] -[has[draft.of]] \ No newline at end of file From 44c466d6e7602fe80067239afdcbb213c7f58500 Mon Sep 17 00:00:00 2001 From: Jermolene Date: Fri, 29 Aug 2014 09:58:37 +0100 Subject: [PATCH 03/21] Docs update --- readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.md b/readme.md index 7d04f5492..4f7c1563f 100644 --- a/readme.md +++ b/readme.md @@ -1,4 +1,4 @@ -

Welcome to TiddlyWiki

Welcome to TiddlyWiki, a non-linear personal web notebook that anyone can use and keep forever, independently of any corporation.

TiddlyWiki is a complete interactive wiki in JavaScript. It can be used as a single HTML file in the browser or as a powerful Node.js application. It is highly customisable: the entire user interface is itself implemented in hackable WikiText.

This is version of TiddlyWiki, a major reboot designed for the next 25 years. It is currently in beta (see the detailed ReleaseHistory) with a RoadMap for moving to the full release. It is a great time to get involved and support the future development of TiddlyWiki.

TiddlyWiki is a free, open source project that depends on your love and support for its survival.

TiddlyWikiClassic

The original "Classic" version of TiddlyWiki is still available at http://classic.tiddlywiki.com. Note that it is not fully backwards compatible: existing content will need massaging, while plugins and themes will have to be completely rewritten. The upgrade path will get smoother as the new version matures. +

Welcome to TiddlyWiki

Welcome to TiddlyWiki, a non-linear personal web notebook that anyone can use and keep forever, independently of any corporation.

TiddlyWiki is a complete interactive wiki in JavaScript. It can be used as a single HTML file in the browser or as a powerful Node.js application. It is highly customisable: the entire user interface is itself implemented in hackable WikiText.

This is version of TiddlyWiki, a major reboot designed for the next 25 years. It is currently in beta (see the detailed ReleaseHistory) with a RoadMap for moving to the full release. It is a great time to get involved and support the future development of TiddlyWiki.

TiddlyWiki is a free, open source project that depends on your love and support for its survival.

TiddlyWikiClassic

The original "Classic" version of TiddlyWiki is still available at http://classic.tiddlywiki.com. Note that it is not fully backwards compatible: existing content will need massaging, while plugins and themes will have to be completely rewritten. The upgrade path will get smoother as the new version matures.

Getting started with TiddlyWiki under Node.js

Running TiddlyWiki on Node.js brings several important benefits over and above the single file version:

  • You can edit your content on any suitably compatible HTML5 browser, including smartphones and tablets
  • Individual tiddlers are stored in separate files, which you can organise as you wish
  • The ability to build multiple wikis that blend different combinations of shared and unique content

Installation

  1. Install Node.js from http://nodejs.org
  2. Open a command line terminal and type:

    npm install -g tiddlywiki

    If it fails with an error you may need to re-run the command as an administrator:

    npm install -g tiddlywiki (Windows)

    sudo npm install -g tiddlywiki (Mac/Linux)

  3. Check TiddlyWiki is installed by typing:

    tiddlywiki --version

  4. In response, you should see TiddlyWiki report its current version (eg 5.0.8-beta; you may also see other debugging information reported)
  5. Try it out:
    1. tiddlywiki mynewwiki --init server to create a folder for a new wiki that includes server-related components
    2. tiddlywiki mynewwiki --server to start TiddlyWiki
    3. Visit http://127.0.0.1:8080/ in your browser
    4. Try editing and creating tiddlers

The -g flag causes TiddlyWiki to be installed globally. Without it, TiddlyWiki will only be available in the directory where you installed it.

A slightly different method for installation is recommended if you plan on forking the source code in order to study it or contribute to it. See Working with the TiddlyWiki5 repository.

Usage

TiddlyWiki5 can be used on the command line to perform an extensive set of operations based on TiddlyWikiFolders, TiddlerFiles and TiddlyWikiFiles.

For example, the following command loads the tiddlers from a TiddlyWiki HTML file and then saves one of them in static HTML:

tiddlywiki --verbose --load mywiki.html --rendertiddler ReadMe ./readme.html

Running tiddlywiki from the command line boots the TiddlyWiki kernel, loads the core plugins and establishes an empty wiki store. It then sequentially processes the command line arguments from left to right. The arguments are separated with spaces.

The first argument is the optional path to the TiddlyWikiFolder to be loaded. If not present, then the current directory is used.

The commands and their individual arguments follow, each command being identified by the prefix --.

tiddlywiki [<wikipath>] [--<command> [<arg>[,<arg>]]]

The available commands are:

See also:

Upgrading

If you've installed TiddlyWiki on Node.js on the usual way, when a new version is released you can upgrade it with this command:

npm update -g tiddlywiki

On Mac or Linux you'll need to add sudo like this:

sudo npm update -g tiddlywiki

Working with the TiddlyWiki5 repository

Setting Up

If you plan on working with the TiddlyWiki5 source code then follow these steps:

  1. Fork the TiddlyWiki5 GitHub repository from https://github.com/Jermolene/TiddlyWiki5
  2. Clone a local copy of your fork
  3. Open a command line terminal and change the current working directory to the root of the repo
  4. Type npm link (Windows) or sudo npm link (Mac/Linux) to tell npm to use this copy of the repo as the globally installed one

After this procedure you can work with TiddlyWiki5 via npm as though it were installed in the usual way with npm install -g tiddlywiki.

See also Scripts for TiddlyWiki on Node.js.

This readme file was automatically generated by TiddlyWiki

\ No newline at end of file From 6641d5c93f2ccffea77f82d48d1adc6e76809bf2 Mon Sep 17 00:00:00 2001 From: Jermolene Date: Sat, 30 Aug 2014 14:04:21 +0100 Subject: [PATCH 04/21] Adjust sync filter to avoid bug with deletions The `[is[tiddler]]` filter rejects deleted tiddlers, meaning that deletions were not triggering the dirty state correctly. --- core/wiki/config/SyncFilter.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/wiki/config/SyncFilter.tid b/core/wiki/config/SyncFilter.tid index 548e2987c..fb925264b 100644 --- a/core/wiki/config/SyncFilter.tid +++ b/core/wiki/config/SyncFilter.tid @@ -1,3 +1,3 @@ title: $:/config/SyncFilter -[is[tiddler]] -[[$:/HistoryList]] -[[$:/StoryList]] -[[$:/Import]] -[[$:/isEncrypted]] -[prefix[$:/status]] -[prefix[$:/state]] -[prefix[$:/temp]] \ No newline at end of file +[all[]] -[[$:/HistoryList]] -[[$:/StoryList]] -[[$:/Import]] -[[$:/isEncrypted]] -[prefix[$:/status]] -[prefix[$:/state]] -[prefix[$:/temp]] \ No newline at end of file From 2bc185e1d4a3012a58c904c728f137662ceed3dc Mon Sep 17 00:00:00 2001 From: Jermolene Date: Sat, 30 Aug 2014 14:11:37 +0100 Subject: [PATCH 05/21] Docs for auto save wiki message --- .../messages/WidgetMessage_ tm-auto-save-wiki.tid | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-auto-save-wiki.tid diff --git a/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-auto-save-wiki.tid b/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-auto-save-wiki.tid new file mode 100644 index 000000000..bfe4366a4 --- /dev/null +++ b/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-auto-save-wiki.tid @@ -0,0 +1,11 @@ +created: 20140830112325641 +modified: 20140830115149288 +tags: message +title: WidgetMessage: tm-auto-save-wiki +type: text/vnd.tiddlywiki + +The autosave wiki message causes the current saver module to perform a background save if it is required. + +The autosave wiki message should be generated whenever changes are made to the store. For example, the navigator widget generates the autosave wiki message as part of its handling of the [[WidgetMessage: tw-save-tiddler]], [[WidgetMessage: tw-delete-tiddler]] and [[WidgetMessage: tw-perform-import]]. + +The autosave wiki message is handled by the TiddlyWiki core SyncMechanism which invokes the current [[SaverModule|SaverModules]]. Not all SaverModules can handle autosaving. \ No newline at end of file From 9a57bfdc9cdf7ae3644e6c877c0b90c772ce991f Mon Sep 17 00:00:00 2001 From: Jermolene Date: Sat, 30 Aug 2014 14:44:05 +0100 Subject: [PATCH 06/21] Release note updates --- editions/tw5.com/tiddlers/Release 5.0.16beta.tid | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/editions/tw5.com/tiddlers/Release 5.0.16beta.tid b/editions/tw5.com/tiddlers/Release 5.0.16beta.tid index 096eacc93..7614b6b1a 100644 --- a/editions/tw5.com/tiddlers/Release 5.0.16beta.tid +++ b/editions/tw5.com/tiddlers/Release 5.0.16beta.tid @@ -1,6 +1,6 @@ caption: 5.0.16-beta -created: 20140826131615798 -modified: 20140826131615798 +created: 20140830131615798 +modified: 20140830131615798 tags: releasenote title: Release 5.0.16-beta type: text/vnd.tiddlywiki @@ -9,16 +9,22 @@ type: text/vnd.tiddlywiki !! Incompatible Changes -These changes have the potential to break existing tiddlers. +5.0.16-beta brings more incompatible changes than any previous release. These changes are likely to break almost all plugins written for previous releases of TiddlyWiki 5, and will break many customisations. +* [[Changed|https://github.com/Jermolene/TiddlyWiki5/issues/764]] all CSS class prefixes from `tw-` to `tc-` (eg `tw-tiddler-frame` has become `tc-tiddler-frame`; missing prefixes have also been added, so `btn-invisible` has become `tc-btn-invisible`) +* [[Changed|https://github.com/Jermolene/TiddlyWiki5/commit/2f69ea362cd673f59b9fadbe11f1f95549a59813]] all message prefixes from `tw-` to `tm-` (eg `tw-close-tiddler` has become `tm-close-tiddler`) +* [[Changed|https://github.com/Jermolene/TiddlyWiki5/commit/89fd5379dd78887fc21746d792072bf5a25f0c56]] all variable prefixes from `tw-` to `tv-` (eg `tw-config-toolbar-icons` has become `tv-config-toolbar-icons`) * [[Changed|https://github.com/Jermolene/TiddlyWiki5/commit/112a9a95d95e9f62f110c97a4faaf537c5c100b1]] prefix/removeprefix filter operators to be case-sensitive !! Usability Improvements * [[Amended|https://github.com/Jermolene/TiddlyWiki5/commit/e47852cb141b384ad2a9097eca795545cb5b2494]] behaviour of the [[tw-browser-refresh|WidgetMessage: tw-browser-refresh]] message so that it no longer clears the location hash +* [[Hide|https://github.com/Jermolene/TiddlyWiki5/commit/88c9c0c3ee115917b8c1a9126452bb0574061857]] toolbar buttons from static renderings !! Hackability Improvements +* [[Extend|https://github.com/Jermolene/TiddlyWiki5/commit/48312272adb17610db96d50758e6af947cab7b1d]] the [FilterOperator: all]] to be able to select all the source tiddlers +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/43aeb47fc34f1ba424030c4f78ee907fe7b1d5d8]] problem with single line macro definitions incorrectly including whitespace in the value. (For example, `\define mymacro() yes` would set the macro value to " yes", with a leading space) * [[Extend|https://github.com/Jermolene/TiddlyWiki5/commit/d2a5a12f2d6b6ccc36dd22a70ac2def08d1d3722]] TableOfContentsMacro to use the caption field if present * [[Configurability|https://github.com/Jermolene/TiddlyWiki5/commit/b437f1b450f5f2a3104a9086f7c674299b53b9bc]] for the default tab shown in the tiddler info panel (see [[Configuring the default TiddlerInfo tab]]) * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/dcf4e93a3283e3e93cc14e50366f9b0252870835]] [[suffix|FilterOperator: suffix]] and [[removesuffix|FilterOperator: removesuffix]] filter operators From 2a3e54b0641e3cfc1d6c6bccec03032c4a1ed1d1 Mon Sep 17 00:00:00 2001 From: Jermolene Date: Sat, 30 Aug 2014 15:09:36 +0100 Subject: [PATCH 07/21] Release note update --- editions/tw5.com/tiddlers/Release 5.0.16beta.tid | 1 + 1 file changed, 1 insertion(+) diff --git a/editions/tw5.com/tiddlers/Release 5.0.16beta.tid b/editions/tw5.com/tiddlers/Release 5.0.16beta.tid index 7614b6b1a..0895e29dc 100644 --- a/editions/tw5.com/tiddlers/Release 5.0.16beta.tid +++ b/editions/tw5.com/tiddlers/Release 5.0.16beta.tid @@ -38,4 +38,5 @@ type: text/vnd.tiddlywiki [[@Jermolene|https://github.com/Jermolene]] would like to thank the contributors to this release who have generously given their time to help improve TiddlyWiki: * [[@BramChen|https://github.com/BramChen]] +* [[@pmario|https://github.com/pmario]] * [[@xcazin|https://github.com/xcazin]] From 710759daed9f73eec9822009cbd29382c17f0046 Mon Sep 17 00:00:00 2001 From: buggyj Date: Sat, 30 Aug 2014 17:25:04 +0200 Subject: [PATCH 08/21] added support for xlink: attribute prefix --- core/modules/widgets/widget.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/core/modules/widgets/widget.js b/core/modules/widgets/widget.js index 9424dd6d8..6f20616df 100755 --- a/core/modules/widgets/widget.js +++ b/core/modules/widgets/widget.js @@ -263,9 +263,15 @@ Widget.prototype.assignAttributes = function(domNode,options) { v = undefined; } if(v !== undefined) { + var b = a.split(":"); // Setting certain attributes can cause a DOM error (eg xmlns on the svg element) try { - domNode.setAttributeNS(null,a,v); + if (b.length == 2 && b[0] == "xlink"){ + domNode.setAttributeNS("http://www.w3.org/1999/xlink",b[1],v); + } + else { + domNode.setAttributeNS(null,a,v); + } } catch(e) { } } From 3a67fdb76895003edd7b017a107a773b4a118187 Mon Sep 17 00:00:00 2001 From: Jermolene Date: Sat, 30 Aug 2014 20:44:26 +0100 Subject: [PATCH 09/21] Obeisance to JSHint for core modules MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit There are still some warnings about making functions in a loop, but I’ll fix those as a separate pull request because the fixes are more than typographic errors. --- core/modules/commands/build.js | 2 +- core/modules/commands/server.js | 12 ++--- core/modules/deserializers.js | 2 +- core/modules/filters/is.js | 2 +- core/modules/filters/plugintiddlers.js | 12 ++--- core/modules/filters/shadowsource.js | 4 +- core/modules/filters/sort.js | 2 +- core/modules/info/platform.js | 2 +- .../parsers/wikiparser/rules/commentblock.js | 4 +- .../parsers/wikiparser/rules/commentinline.js | 4 +- .../rules/filteredtranscludeblock.js | 2 +- .../rules/filteredtranscludeinline.js | 2 +- .../wikiparser/rules/hardlinebreaks.js | 5 +- .../parsers/wikiparser/rules/quoteblock.js | 5 +- .../modules/parsers/wikiparser/rules/table.js | 9 ++-- .../wikiparser/rules/transcludeblock.js | 25 ++++----- .../wikiparser/rules/transcludeinline.js | 23 ++++---- .../parsers/wikiparser/rules/typedblock.js | 2 +- .../parsers/wikiparser/rules/wikilink.js | 2 +- core/modules/parsers/wikiparser/wikiparser.js | 6 +-- core/modules/saver-handler.js | 2 +- core/modules/savers/andtidwiki.js | 2 +- core/modules/savers/tiddlyfox.js | 6 +-- core/modules/savers/twedit.js | 36 ++++++------- core/modules/startup/favicon.js | 2 +- core/modules/startup/render.js | 2 +- core/modules/startup/story.js | 4 +- core/modules/storyviews/classic.js | 2 +- core/modules/storyviews/pop.js | 2 +- core/modules/storyviews/zoomin.js | 2 +- core/modules/syncer.js | 10 ++-- core/modules/upgraders/plugins.js | 4 +- core/modules/upgraders/themetweaks.js | 4 +- core/modules/utils/dom/modal.js | 2 +- core/modules/utils/fakedom.js | 38 +++++++------- core/modules/utils/filesystem.js | 4 +- core/modules/utils/parsetree.js | 6 +-- core/modules/utils/pluginmaker.js | 7 +-- core/modules/widgets/dropzone.js | 2 +- core/modules/widgets/edit-bitmap.js | 4 +- core/modules/widgets/fields.js | 2 +- core/modules/widgets/link.js | 2 +- core/modules/widgets/list.js | 2 +- core/modules/widgets/navigator.js | 5 +- core/modules/widgets/reveal.js | 2 +- core/modules/widgets/tiddler.js | 2 +- core/modules/widgets/widget.js | 7 ++- core/modules/wiki.js | 52 ++++++++++--------- 48 files changed, 173 insertions(+), 169 deletions(-) diff --git a/core/modules/commands/build.js b/core/modules/commands/build.js index 6d6e04548..8471119d7 100644 --- a/core/modules/commands/build.js +++ b/core/modules/commands/build.js @@ -26,7 +26,7 @@ Command.prototype.execute = function() { // Get the build targets defined in the wiki var buildTargets = $tw.boot.wikiInfo.build; if(!buildTargets) { - return "No build targets defined" + return "No build targets defined"; } // Loop through each of the specified targets var targets; diff --git a/core/modules/commands/server.js b/core/modules/commands/server.js index e724aa53f..edbb1f1ca 100644 --- a/core/modules/commands/server.js +++ b/core/modules/commands/server.js @@ -78,7 +78,7 @@ SimpleServer.prototype.findMatchingRoute = function(request,state) { }; SimpleServer.prototype.checkCredentials = function(request,incomingUsername,incomingPassword) { - var header = request.headers["authorization"] || "", + var header = request.headers.authorization || "", token = header.split(/\s+/).pop() || "", auth = $tw.utils.base64Decode(token), parts = auth.split(/:/), @@ -89,7 +89,7 @@ SimpleServer.prototype.checkCredentials = function(request,incomingUsername,inco } else { return "DENIED"; } -} +}; SimpleServer.prototype.listen = function(port,host) { var self = this; @@ -167,8 +167,8 @@ var Command = function(params,commander,callback) { delete fields.fields; } // Remove any revision field - if(fields["revision"]) { - delete fields["revision"]; + if(fields.revision) { + delete fields.revision; } state.wiki.addTiddler(new $tw.Tiddler(state.wiki.getCreationFields(),fields,{title: title})); var changeCount = state.wiki.getChangeCount(title).toString(); @@ -237,7 +237,7 @@ var Command = function(params,commander,callback) { tiddlerFields[name] = tiddler.getFieldString(name); } }); - tiddlerFields["revision"] = state.wiki.getChangeCount(title); + tiddlerFields.revision = state.wiki.getChangeCount(title); tiddlerFields.type = tiddlerFields.type || "text/vnd.tiddlywiki"; tiddlers.push(tiddlerFields); }); @@ -265,7 +265,7 @@ var Command = function(params,commander,callback) { tiddlerFields.fields[name] = value; } }); - tiddlerFields["revision"] = state.wiki.getChangeCount(title); + tiddlerFields.revision = state.wiki.getChangeCount(title); tiddlerFields.type = tiddlerFields.type || "text/vnd.tiddlywiki"; response.writeHead(200, {"Content-Type": "application/json"}); response.end(JSON.stringify(tiddlerFields),"utf8"); diff --git a/core/modules/deserializers.js b/core/modules/deserializers.js index 5e3fce42e..ba31c5314 100644 --- a/core/modules/deserializers.js +++ b/core/modules/deserializers.js @@ -109,7 +109,7 @@ exports["text/html"] = function(text,fields) { if(sysMatch) { results.push.apply(results,deserializeTiddlyWikiFile(text,systemAreaMarkerRegExp.lastIndex,!!sysMatch[1],fields)); } - return results + return results; } else { // Check whether we've got an encrypted file var encryptedStoreArea = $tw.utils.extractEncryptedStoreArea(text); diff --git a/core/modules/filters/is.js b/core/modules/filters/is.js index fc45a62f9..d27d00907 100644 --- a/core/modules/filters/is.js +++ b/core/modules/filters/is.js @@ -20,7 +20,7 @@ function getIsFilterOperators() { $tw.modules.applyMethods("isfilteroperator",isFilterOperators); } return isFilterOperators; -}; +} /* Export our filter function diff --git a/core/modules/filters/plugintiddlers.js b/core/modules/filters/plugintiddlers.js index 84d641587..9845e8ce8 100644 --- a/core/modules/filters/plugintiddlers.js +++ b/core/modules/filters/plugintiddlers.js @@ -18,12 +18,12 @@ Export our filter function exports.plugintiddlers = function(source,operator,options) { var results = []; source(function(tiddler,title) { - var pluginInfo = options.wiki.getPluginInfo(title) || options.wiki.getTiddlerData(title,{tiddlers:[]}); - if(pluginInfo) { - $tw.utils.each(pluginInfo.tiddlers,function(fields,title) { - results.push(title); - }); - } + var pluginInfo = options.wiki.getPluginInfo(title) || options.wiki.getTiddlerData(title,{tiddlers:[]}); + if(pluginInfo) { + $tw.utils.each(pluginInfo.tiddlers,function(fields,title) { + results.push(title); + }); + } }); results.sort(); return results; diff --git a/core/modules/filters/shadowsource.js b/core/modules/filters/shadowsource.js index 88ae4132e..f16e2bcc7 100644 --- a/core/modules/filters/shadowsource.js +++ b/core/modules/filters/shadowsource.js @@ -19,9 +19,9 @@ exports.shadowsource = function(source,operator,options) { var results = []; source(function(tiddler,title) { var source = options.wiki.getShadowSource(title); - if(source) { + if(source) { $tw.utils.pushTop(results,source); - } + } }); results.sort(); return results; diff --git a/core/modules/filters/sort.js b/core/modules/filters/sort.js index 408de81eb..f993825df 100644 --- a/core/modules/filters/sort.js +++ b/core/modules/filters/sort.js @@ -45,6 +45,6 @@ var prepare_results = function (source) { results.push(title); }); return results; -} +}; })(); diff --git a/core/modules/info/platform.js b/core/modules/info/platform.js index f084d6c00..9f6097f74 100644 --- a/core/modules/info/platform.js +++ b/core/modules/info/platform.js @@ -13,7 +13,7 @@ Initialise basic platform $:/info/ tiddlers "use strict"; exports.getInfoTiddlerFields = function() { - var mapBoolean = function(value) {return value ? "yes" : "no"}, + var mapBoolean = function(value) {return value ? "yes" : "no";}, infoTiddlerFields = []; // Basics infoTiddlerFields.push({title: "$:/info/browser", text: mapBoolean(!!$tw.browser)}); diff --git a/core/modules/parsers/wikiparser/rules/commentblock.js b/core/modules/parsers/wikiparser/rules/commentblock.js index cb1bd1a93..84ee897ba 100644 --- a/core/modules/parsers/wikiparser/rules/commentblock.js +++ b/core/modules/parsers/wikiparser/rules/commentblock.js @@ -23,8 +23,8 @@ exports.types = {block: true}; exports.init = function(parser) { this.parser = parser; - this.matchRegExp = /\/mg; }; exports.findNextMatch = function(startPos) { diff --git a/core/modules/parsers/wikiparser/rules/commentinline.js b/core/modules/parsers/wikiparser/rules/commentinline.js index fd9c6a10e..6e697e6c0 100644 --- a/core/modules/parsers/wikiparser/rules/commentinline.js +++ b/core/modules/parsers/wikiparser/rules/commentinline.js @@ -23,8 +23,8 @@ exports.types = {inline: true}; exports.init = function(parser) { this.parser = parser; - this.matchRegExp = /\/mg; }; exports.findNextMatch = function(startPos) { diff --git a/core/modules/parsers/wikiparser/rules/filteredtranscludeblock.js b/core/modules/parsers/wikiparser/rules/filteredtranscludeblock.js index 5a863a42a..7ab4801bf 100644 --- a/core/modules/parsers/wikiparser/rules/filteredtranscludeblock.js +++ b/core/modules/parsers/wikiparser/rules/filteredtranscludeblock.js @@ -56,7 +56,7 @@ exports.parse = function() { node.attributes.style = {type: "string", value: style}; } if(classes) { - node.attributes["itemClass"] = {type: "string", value: classes.split(".").join(" ")}; + node.attributes.itemClass = {type: "string", value: classes.split(".").join(" ")}; } return [node]; }; diff --git a/core/modules/parsers/wikiparser/rules/filteredtranscludeinline.js b/core/modules/parsers/wikiparser/rules/filteredtranscludeinline.js index abda75f95..029fd6802 100644 --- a/core/modules/parsers/wikiparser/rules/filteredtranscludeinline.js +++ b/core/modules/parsers/wikiparser/rules/filteredtranscludeinline.js @@ -55,7 +55,7 @@ exports.parse = function() { node.attributes.style = {type: "string", value: style}; } if(classes) { - node.attributes["itemClass"] = {type: "string", value: classes.split(".").join(" ")}; + node.attributes.itemClass = {type: "string", value: classes.split(".").join(" ")}; } return [node]; }; diff --git a/core/modules/parsers/wikiparser/rules/hardlinebreaks.js b/core/modules/parsers/wikiparser/rules/hardlinebreaks.js index 7573a5501..c278686b4 100644 --- a/core/modules/parsers/wikiparser/rules/hardlinebreaks.js +++ b/core/modules/parsers/wikiparser/rules/hardlinebreaks.js @@ -34,7 +34,8 @@ exports.init = function(parser) { exports.parse = function() { var reEnd = /(""")|(\r?\n)/mg, - tree = []; + tree = [], + match; // Move past the match this.parser.pos = this.matchRegExp.lastIndex; do { @@ -42,7 +43,7 @@ exports.parse = function() { tree.push.apply(tree,this.parser.parseInlineRun(reEnd,{eatTerminator: false})); // Redo the terminator match reEnd.lastIndex = this.parser.pos; - var match = reEnd.exec(this.parser.source); + match = reEnd.exec(this.parser.source); if(match) { this.parser.pos = reEnd.lastIndex; // Add a line break if the terminator was a line break diff --git a/core/modules/parsers/wikiparser/rules/quoteblock.js b/core/modules/parsers/wikiparser/rules/quoteblock.js index 8f83c57e8..71b689680 100644 --- a/core/modules/parsers/wikiparser/rules/quoteblock.js +++ b/core/modules/parsers/wikiparser/rules/quoteblock.js @@ -55,7 +55,6 @@ exports.parse = function() { classes.push.apply(classes, this.parser.parseClasses()); this.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true}); var cite = this.parser.parseInlineRun(/(\r?\n)/mg); - // before handling the cite, parse the body of the quote var tree= this.parser.parseBlocks(reEndString); // If we got a cite, put it before the text @@ -66,10 +65,9 @@ exports.parse = function() { children: cite }); } - // Parse any optional cite this.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true}); - var cite = this.parser.parseInlineRun(/(\r?\n)/mg); + cite = this.parser.parseInlineRun(/(\r?\n)/mg); // If we got a cite, push it if(cite.length > 0) { tree.push({ @@ -78,7 +76,6 @@ exports.parse = function() { children: cite }); } - // Return the blockquote element return [{ type: "element", diff --git a/core/modules/parsers/wikiparser/rules/table.js b/core/modules/parsers/wikiparser/rules/table.js index eb830b855..fb72f6890 100644 --- a/core/modules/parsers/wikiparser/rules/table.js +++ b/core/modules/parsers/wikiparser/rules/table.js @@ -27,7 +27,8 @@ var processRow = function(prevColumns) { tree = [], col = 0, colSpanCount = 1, - prevCell; + prevCell, + vAlign; // Match a single cell cellRegExp.lastIndex = this.parser.pos; var cellMatch = cellRegExp.exec(this.parser.source); @@ -38,7 +39,7 @@ var processRow = function(prevColumns) { if(last) { last.rowSpanCount++; $tw.utils.addAttributeToParseTreeNode(last.element,"rowspan",last.rowSpanCount); - var vAlign = $tw.utils.getAttributeValueFromParseTreeNode(last.element,"valign","center"); + vAlign = $tw.utils.getAttributeValueFromParseTreeNode(last.element,"valign","center"); $tw.utils.addAttributeToParseTreeNode(last.element,"valign",vAlign); if(colSpanCount > 1) { $tw.utils.addAttributeToParseTreeNode(last.element,"colspan",colSpanCount); @@ -74,8 +75,8 @@ var processRow = function(prevColumns) { // For ordinary cells, step beyond the opening `|` this.parser.pos++; // Look for a space at the start of the cell - var spaceLeft = false, - vAlign = null; + var spaceLeft = false; + vAlign = null; if(this.parser.source.substr(this.parser.pos).search(/^\^([^\^]|\^\^)/) === 0) { vAlign = "top"; } else if(this.parser.source.substr(this.parser.pos).search(/^,([^,]|,,)/) === 0) { diff --git a/core/modules/parsers/wikiparser/rules/transcludeblock.js b/core/modules/parsers/wikiparser/rules/transcludeblock.js index 6cfb472fc..1a5df1e06 100644 --- a/core/modules/parsers/wikiparser/rules/transcludeblock.js +++ b/core/modules/parsers/wikiparser/rules/transcludeblock.js @@ -41,19 +41,20 @@ exports.parse = function() { isBlock: true }; // Prepare the tiddler widget + var tr, targetTitle, targetField, targetIndex, tiddlerNode; if(textRef) { - var tr = $tw.utils.parseTextReference(textRef), - targetTitle = tr.title, - targetField = tr.field, - targetIndex = tr.index, - tiddlerNode = { - type: "tiddler", - attributes: { - tiddler: {type: "string", value: targetTitle} - }, - isBlock: true, - children: [transcludeNode] - }; + tr = $tw.utils.parseTextReference(textRef); + targetTitle = tr.title; + targetField = tr.field; + targetIndex = tr.index; + tiddlerNode = { + type: "tiddler", + attributes: { + tiddler: {type: "string", value: targetTitle} + }, + isBlock: true, + children: [transcludeNode] + }; } if(template) { transcludeNode.attributes.tiddler = {type: "string", value: template}; diff --git a/core/modules/parsers/wikiparser/rules/transcludeinline.js b/core/modules/parsers/wikiparser/rules/transcludeinline.js index 66f16bb4b..dbf39bfb6 100644 --- a/core/modules/parsers/wikiparser/rules/transcludeinline.js +++ b/core/modules/parsers/wikiparser/rules/transcludeinline.js @@ -38,18 +38,19 @@ exports.parse = function() { attributes: {} }; // Prepare the tiddler widget + var tr, targetTitle, targetField, targetIndex, tiddlerNode; if(textRef) { - var tr = $tw.utils.parseTextReference(textRef), - targetTitle = tr.title, - targetField = tr.field, - targetIndex = tr.index, - tiddlerNode = { - type: "tiddler", - attributes: { - tiddler: {type: "string", value: targetTitle} - }, - children: [transcludeNode] - }; + tr = $tw.utils.parseTextReference(textRef); + targetTitle = tr.title; + targetField = tr.field; + targetIndex = tr.index; + tiddlerNode = { + type: "tiddler", + attributes: { + tiddler: {type: "string", value: targetTitle} + }, + children: [transcludeNode] + }; } if(template) { transcludeNode.attributes.tiddler = {type: "string", value: template}; diff --git a/core/modules/parsers/wikiparser/rules/typedblock.js b/core/modules/parsers/wikiparser/rules/typedblock.js index 561733b91..4195e57e5 100644 --- a/core/modules/parsers/wikiparser/rules/typedblock.js +++ b/core/modules/parsers/wikiparser/rules/typedblock.js @@ -68,7 +68,7 @@ exports.parse = function() { var widgetNode = this.parser.wiki.makeWidget(parser), container = $tw.fakeDocument.createElement("div"); widgetNode.render(container,null); - var text = renderType === "text/html" ? container.innerHTML : container.textContent; + text = renderType === "text/html" ? container.innerHTML : container.textContent; return [{ type: "element", tag: "pre", diff --git a/core/modules/parsers/wikiparser/rules/wikilink.js b/core/modules/parsers/wikiparser/rules/wikilink.js index f4b543896..886a42d4e 100644 --- a/core/modules/parsers/wikiparser/rules/wikilink.js +++ b/core/modules/parsers/wikiparser/rules/wikilink.js @@ -27,7 +27,7 @@ var textPrimitives = { upperLetter: "[A-Z\u00c0-\u00d6\u00d8-\u00de\u0150\u0170]", lowerLetter: "[a-z0-9\u00df-\u00f6\u00f8-\u00ff\u0151\u0171]", anyLetter: "[A-Za-z0-9\u00c0-\u00d6\u00d8-\u00de\u00df-\u00f6\u00f8-\u00ff\u0150\u0170\u0151\u0171]", - blockPrefixLetters: "[A-Za-z0-9\-_\u00c0-\u00d6\u00d8-\u00de\u00df-\u00f6\u00f8-\u00ff\u0150\u0170\u0151\u0171]" + blockPrefixLetters: "[A-Za-z0-9-_\u00c0-\u00d6\u00d8-\u00de\u00df-\u00f6\u00f8-\u00ff\u0150\u0170\u0151\u0171]" }; textPrimitives.unWikiLink = "~"; diff --git a/core/modules/parsers/wikiparser/wikiparser.js b/core/modules/parsers/wikiparser/wikiparser.js index 6b23198c0..19a3522fa 100644 --- a/core/modules/parsers/wikiparser/wikiparser.js +++ b/core/modules/parsers/wikiparser/wikiparser.js @@ -100,7 +100,7 @@ Get the next match out of an array of parse rule instances */ WikiParser.prototype.findNextMatch = function(rules,startPos) { // Find the best matching rule by finding the closest match position - var matchingRule = undefined, + var matchingRule, matchingRulePos = this.sourceLength; // Step through each rule for(var t=0; t x:\blah\blah @@ -32,10 +32,10 @@ TiddlyFoxSaver.prototype.save = function(text,method,callback) { } else if(pathname.indexOf("file://///") === 0) { pathname = "\\\\" + unescape(pathname.substr(10)).replace(/\//g,"\\"); // Mac/Unix local path file:///path/path --> /path/path - } else if(pathname.indexOf("file:///") == 0) { + } else if(pathname.indexOf("file:///") === 0) { pathname = unescape(pathname.substr(7)); // Mac/Unix local path file:/path/path --> /path/path - } else if(pathname.indexOf("file:/") == 0) { + } else if(pathname.indexOf("file:/") === 0) { pathname = unescape(pathname.substr(5)); // Otherwise Windows networth path file://server/share/path/path --> \\server\share\path\path } else { diff --git a/core/modules/savers/twedit.js b/core/modules/savers/twedit.js index 48b3ffbbc..33d748f67 100644 --- a/core/modules/savers/twedit.js +++ b/core/modules/savers/twedit.js @@ -38,25 +38,25 @@ TWEditSaver.prototype.save = function(text,method,callback) { } // Error handler var errorHandler = function(event) { - // Error - callback("Error saving to TWEdit: " + event.target.error.code); - }; + // Error + callback("Error saving to TWEdit: " + event.target.error.code); + }; // Get the file system - window.requestFileSystem(LocalFileSystem.PERSISTENT,0,function(fileSystem) { - // Now we've got the filesystem, get the fileEntry - fileSystem.root.getFile(pathname, {create: true}, function(fileEntry) { - // Now we've got the fileEntry, create the writer - fileEntry.createWriter(function(writer) { - writer.onerror = errorHandler; - writer.onwrite = function() { - callback(null); - }; - writer.position = 0; - writer.write(text); - },errorHandler); - }, errorHandler); - }, errorHandler); - return true; + window.requestFileSystem(LocalFileSystem.PERSISTENT,0,function(fileSystem) { + // Now we've got the filesystem, get the fileEntry + fileSystem.root.getFile(pathname, {create: true}, function(fileEntry) { + // Now we've got the fileEntry, create the writer + fileEntry.createWriter(function(writer) { + writer.onerror = errorHandler; + writer.onwrite = function() { + callback(null); + }; + writer.position = 0; + writer.write(text); + },errorHandler); + }, errorHandler); + }, errorHandler); + return true; }; /* diff --git a/core/modules/startup/favicon.js b/core/modules/startup/favicon.js index 7794dec25..0d1792ea7 100644 --- a/core/modules/startup/favicon.js +++ b/core/modules/startup/favicon.js @@ -38,6 +38,6 @@ function setFavicon() { var faviconLink = document.getElementById("faviconLink"); faviconLink.setAttribute("href","data:" + tiddler.fields.type + ";base64," + tiddler.fields.text); } -}; +} })(); diff --git a/core/modules/startup/render.js b/core/modules/startup/render.js index 865c7f5d8..8e1dafd71 100644 --- a/core/modules/startup/render.js +++ b/core/modules/startup/render.js @@ -19,7 +19,7 @@ exports.after = ["story"]; exports.synchronous = true; // Default story and history lists -var PAGE_TITLE_TITLE = "$:/core/wiki/title" +var PAGE_TITLE_TITLE = "$:/core/wiki/title"; var PAGE_STYLESHEET_TITLE = "$:/core/ui/PageStylesheet"; var PAGE_TEMPLATE_TITLE = "$:/core/ui/PageTemplate"; diff --git a/core/modules/startup/story.js b/core/modules/startup/story.js index 90bb9003d..6c7258485 100644 --- a/core/modules/startup/story.js +++ b/core/modules/startup/story.js @@ -48,7 +48,7 @@ exports.startup = function() { $tw.locationHash = hash; openStartupTiddlers({defaultToCurrentStory: true}); } - },false) + },false); // Listen for the tm-browser-refresh message $tw.rootWidget.addEventListener("tm-browser-refresh",function(event) { window.location.reload(true); @@ -157,7 +157,7 @@ function updateLocationHash(options) { } // Assemble the location hash if(options.updateAddressBar === "permalink") { - $tw.locationHash = "#" + encodeURIComponent(targetTiddler) + $tw.locationHash = "#" + encodeURIComponent(targetTiddler); } else { $tw.locationHash = "#" + encodeURIComponent(targetTiddler) + ":" + encodeURIComponent($tw.utils.stringifyList(storyList)); } diff --git a/core/modules/storyviews/classic.js b/core/modules/storyviews/classic.js index ceb54ee47..a600fe326 100644 --- a/core/modules/storyviews/classic.js +++ b/core/modules/storyviews/classic.js @@ -16,7 +16,7 @@ var easing = "cubic-bezier(0.645, 0.045, 0.355, 1)"; // From http://easings.net/ var ClassicStoryView = function(listWidget) { this.listWidget = listWidget; -} +}; ClassicStoryView.prototype.navigateTo = function(historyInfo) { var listElementIndex = this.listWidget.findListItem(0,historyInfo.title); diff --git a/core/modules/storyviews/pop.js b/core/modules/storyviews/pop.js index 51c014da6..b94a23df2 100644 --- a/core/modules/storyviews/pop.js +++ b/core/modules/storyviews/pop.js @@ -14,7 +14,7 @@ Animates list insertions and removals var PopStoryView = function(listWidget) { this.listWidget = listWidget; -} +}; PopStoryView.prototype.navigateTo = function(historyInfo) { var listElementIndex = this.listWidget.findListItem(0,historyInfo.title); diff --git a/core/modules/storyviews/zoomin.js b/core/modules/storyviews/zoomin.js index 46afb354a..51463e83b 100644 --- a/core/modules/storyviews/zoomin.js +++ b/core/modules/storyviews/zoomin.js @@ -86,7 +86,7 @@ ZoominListView.prototype.navigateTo = function(historyInfo) { ]); // Transform the previous tiddler out of the way and then hide it if(prevCurrentTiddler && prevCurrentTiddler !== targetElement) { - var scale = zoomBounds.width / sourceBounds.width; + scale = zoomBounds.width / sourceBounds.width; x = zoomBounds.left - targetBounds.left - (sourceBounds.left - targetBounds.left) * scale; y = zoomBounds.top - targetBounds.top - (sourceBounds.top - targetBounds.top) * scale; $tw.utils.setStyle(prevCurrentTiddler,[ diff --git a/core/modules/syncer.js b/core/modules/syncer.js index ba736f677..7d5880d1e 100644 --- a/core/modules/syncer.js +++ b/core/modules/syncer.js @@ -20,7 +20,7 @@ wiki: wiki to be synced function Syncer(options) { var self = this; this.wiki = options.wiki; - this.syncadaptor = options.syncadaptor + this.syncadaptor = options.syncadaptor; // Make a logger this.logger = new $tw.utils.Logger("syncer" + ($tw.browser ? "-browser" : "") + ($tw.node ? "-server" : "")); // Compile the dirty tiddler filter @@ -40,7 +40,7 @@ function Syncer(options) { if($tw.browser) { // Set up our beforeunload handler window.addEventListener("beforeunload",function(event) { - var confirmationMessage = undefined; + var confirmationMessage; if(self.isDirty()) { confirmationMessage = $tw.language.getString("UnsavedChangesWarning"); event.returnValue = confirmationMessage; // Gecko @@ -94,10 +94,10 @@ Syncer.prototype.readTiddlerInfo = function() { $tw.utils.each(tiddlers,function(title) { var tiddler = self.wiki.getTiddler(title); self.tiddlerInfo[title] = { - revision: tiddler.fields["revision"], + revision: tiddler.fields.revision, adaptorInfo: self.syncadaptor && self.syncadaptor.getTiddlerInfo(tiddler), changeCount: self.wiki.getChangeCount(title) - } + }; }); }; @@ -329,7 +329,7 @@ Syncer.prototype.enqueueSyncTask = function(task) { revision: null, adaptorInfo: {}, changeCount: -1 - } + }; } // Bail if this is a save and the tiddler is already at the changeCount that the server has if(task.type === "save" && this.wiki.getChangeCount(task.title) <= this.tiddlerInfo[task.title].changeCount) { diff --git a/core/modules/upgraders/plugins.js b/core/modules/upgraders/plugins.js index 91948ff73..d770ea29a 100644 --- a/core/modules/upgraders/plugins.js +++ b/core/modules/upgraders/plugins.js @@ -36,10 +36,10 @@ exports.upgrade = function(wiki,titles,tiddlers) { $tw.utils.each(titles,function(title) { var incomingTiddler = tiddlers[title]; // Check if we're dealing with a plugin - if(incomingTiddler && incomingTiddler["plugin-type"] && incomingTiddler["version"]) { + if(incomingTiddler && incomingTiddler["plugin-type"] && incomingTiddler.version) { // Upgrade the incoming plugin if we've got a newer version in the upgrade library var libraryTiddler = getLibraryTiddler(title); - if(libraryTiddler && libraryTiddler["plugin-type"] && libraryTiddler["version"]) { + if(libraryTiddler && libraryTiddler["plugin-type"] && libraryTiddler.version) { if($tw.utils.checkVersions(libraryTiddler.version,incomingTiddler.version)) { tiddlers[title] = libraryTiddler; messages[title] = $tw.language.getString("Import/Upgrader/Plugins/Upgraded",{variables: {incoming: incomingTiddler.version, upgraded: libraryTiddler.version}}); diff --git a/core/modules/upgraders/themetweaks.js b/core/modules/upgraders/themetweaks.js index 8a15271e4..86ddc0f7e 100644 --- a/core/modules/upgraders/themetweaks.js +++ b/core/modules/upgraders/themetweaks.js @@ -51,10 +51,10 @@ exports.upgrade = function(wiki,titles,tiddlers) { tiddlers[mappedTitle] = { title: mappedTitle, text: tiddlerData[index] - } + }; messages[mappedTitle] = $tw.language.getString("Import/Upgrader/ThemeTweaks/Created",{variables: { from: title + "##" + index - }}) + }}); } } } diff --git a/core/modules/utils/dom/modal.js b/core/modules/utils/dom/modal.js index a27f84024..1c4e30c1c 100644 --- a/core/modules/utils/dom/modal.js +++ b/core/modules/utils/dom/modal.js @@ -93,7 +93,7 @@ Modal.prototype.display = function(title,options) { }); // Setup the link if present if(options.downloadLink) { - modalLink.href = options.downloadLink + modalLink.href = options.downloadLink; modalLink.appendChild(document.createTextNode("Right-click to save changes")); modalBody.appendChild(modalLink); } diff --git a/core/modules/utils/fakedom.js b/core/modules/utils/fakedom.js index 3904f95b0..dd36369a2 100755 --- a/core/modules/utils/fakedom.js +++ b/core/modules/utils/fakedom.js @@ -19,7 +19,7 @@ var bumpSequenceNumber = function(object) { if(sequenceNumber !== null) { object.sequenceNumber = sequenceNumber++; } -} +}; var TW_TextNode = function(text) { bumpSequenceNumber(this); @@ -79,7 +79,7 @@ TW_Element.prototype.insertBefore = function(node,nextSibling) { } else { this.appendChild(node); } -} +}; TW_Element.prototype.removeChild = function(node) { var p = this.children.indexOf(node); @@ -93,9 +93,9 @@ TW_Element.prototype.hasChildNodes = function() { }; Object.defineProperty(TW_Element.prototype, "firstChild", { - get: function() { - return this.children[0]; - } + get: function() { + return this.children[0]; + } }); TW_Element.prototype.addEventListener = function(type,listener,useCapture) { @@ -106,22 +106,22 @@ Object.defineProperty(TW_Element.prototype, "className", { get: function() { return this.attributes["class"] || ""; }, - set: function(value) { - this.attributes["class"] = value; - } + set: function(value) { + this.attributes["class"] = value; + } }); Object.defineProperty(TW_Element.prototype, "value", { get: function() { - return this.attributes["value"] || ""; + return this.attributes.value || ""; }, - set: function(value) { - this.attributes["value"] = value; - } + set: function(value) { + this.attributes.value = value; + } }); Object.defineProperty(TW_Element.prototype, "outerHTML", { - get: function() { + get: function() { var output = [],attr,a,v; output.push("<",this.tag); if(this.attributes) { @@ -143,7 +143,7 @@ Object.defineProperty(TW_Element.prototype, "outerHTML", { output.push(""); } return output.join(""); - } + } }); Object.defineProperty(TW_Element.prototype, "innerHTML", { @@ -162,10 +162,10 @@ Object.defineProperty(TW_Element.prototype, "innerHTML", { return b.join(""); } }, - set: function(value) { - this.isRaw = true; - this.rawHTML = value; - } + set: function(value) { + this.isRaw = true; + this.rawHTML = value; + } }); Object.defineProperty(TW_Element.prototype, "textContent", { @@ -193,7 +193,7 @@ Object.defineProperty(TW_Element.prototype, "formattedTextContent", { b.push("\n"); } if(this.tag === "li") { - b.push("* ") + b.push("* "); } $tw.utils.each(this.children,function(node) { b.push(node.formattedTextContent); diff --git a/core/modules/utils/filesystem.js b/core/modules/utils/filesystem.js index db7e5e26a..d0fe34645 100644 --- a/core/modules/utils/filesystem.js +++ b/core/modules/utils/filesystem.js @@ -41,7 +41,7 @@ exports.copyDirectory = function(srcPath,dstPath) { if(err) { return err; } - }; + } } }; copy(srcPath,dstPath); @@ -70,7 +70,7 @@ exports.copyFile = function(srcPath,dstPath) { fs.closeSync(srcFile); fs.closeSync(dstFile); return null; -} +}; /* Remove trailing path separator diff --git a/core/modules/utils/parsetree.js b/core/modules/utils/parsetree.js index dc811c727..26c7f9a1b 100644 --- a/core/modules/utils/parsetree.js +++ b/core/modules/utils/parsetree.js @@ -41,9 +41,9 @@ exports.addClassToParseTreeNode = function(node,classString) { exports.addStyleToParseTreeNode = function(node,name,value) { node.attributes = node.attributes || {}; - node.attributes["style"] = node.attributes["style"] || {type: "string", value: ""}; - if(node.attributes["style"].type === "string") { - node.attributes["style"].value += name + ":" + value + ";"; + node.attributes.style = node.attributes.style || {type: "string", value: ""}; + if(node.attributes.style.type === "string") { + node.attributes.style.value += name + ":" + value + ";"; } }; diff --git a/core/modules/utils/pluginmaker.js b/core/modules/utils/pluginmaker.js index eadef8e43..c3ef000b0 100644 --- a/core/modules/utils/pluginmaker.js +++ b/core/modules/utils/pluginmaker.js @@ -24,15 +24,16 @@ exports.repackPlugin = function(title,additionalTiddlers,excludeTiddlers) { throw "No such tiddler as " + title; } // Extract the JSON + var jsonPluginTiddler; try { - var jsonPluginTiddler = JSON.parse(pluginTiddler.fields.text); + jsonPluginTiddler = JSON.parse(pluginTiddler.fields.text); } catch(e) { throw "Cannot parse plugin tiddler " + title + "\nError: " + e; } // Get the list of tiddlers var tiddlers = Object.keys(jsonPluginTiddler.tiddlers); // Add the additional tiddlers - $tw.utils.pushTop(tiddlers,additionalTiddlers) + $tw.utils.pushTop(tiddlers,additionalTiddlers); // Remove any excluded tiddlers for(var t=tiddlers.length-1; t>=0; t--) { if(excludeTiddlers.indexOf(tiddlers[t]) !== -1) { @@ -75,6 +76,6 @@ exports.repackPlugin = function(title,additionalTiddlers,excludeTiddlers) { $tw.rootWidget.dispatchEvent({type: "tw-auto-save-wiki"}); // Return a heartwarming confirmation return "Plugin " + title + " successfully saved"; -} +}; })(); diff --git a/core/modules/widgets/dropzone.js b/core/modules/widgets/dropzone.js index 30f1ddb5c..edda8fa50 100644 --- a/core/modules/widgets/dropzone.js +++ b/core/modules/widgets/dropzone.js @@ -126,7 +126,7 @@ DropZoneWidget.prototype.importData = function(dataTransfer) { return; } } - }; + } }; DropZoneWidget.prototype.importDataTypes = [ diff --git a/core/modules/widgets/edit-bitmap.js b/core/modules/widgets/edit-bitmap.js index f73734cca..11728bea0 100644 --- a/core/modules/widgets/edit-bitmap.js +++ b/core/modules/widgets/edit-bitmap.js @@ -120,7 +120,7 @@ EditBitmapWidget.prototype.loadCanvas = function() { self.initCanvas(self.currCanvas,DEFAULT_IMAGE_WIDTH,DEFAULT_IMAGE_HEIGHT); // Set the width and height input boxes self.updateSize(); - } + }; // Get the current bitmap into an image object currImage.src = "data:" + tiddler.fields.type + ";base64," + tiddler.fields.text; }; @@ -135,7 +135,7 @@ EditBitmapWidget.prototype.initCanvas = function(canvas,width,height,image) { ctx.fillStyle = "#fff"; ctx.fillRect(0,0,canvas.width,canvas.height); } -} +}; /* ** Update the input boxes with the actual size of the canvas diff --git a/core/modules/widgets/fields.js b/core/modules/widgets/fields.js index aaa9761b6..511b6f7d5 100755 --- a/core/modules/widgets/fields.js +++ b/core/modules/widgets/fields.js @@ -78,7 +78,7 @@ FieldsWidget.prototype.execute = function() { row = row.replace("$name$",fieldName); row = row.replace("$value$",value); row = row.replace("$encoded_value$",$tw.utils.htmlEncode(value)); - text.push(row) + text.push(row); } } } diff --git a/core/modules/widgets/link.js b/core/modules/widgets/link.js index 0be1dbef0..60d3edd7d 100755 --- a/core/modules/widgets/link.js +++ b/core/modules/widgets/link.js @@ -35,7 +35,7 @@ LinkWidget.prototype.render = function(parent,nextSibling) { this.execute(); // Get the value of the tv-wikilinks configuration macro var wikiLinksMacro = this.getVariable("tv-wikilinks"), - useWikiLinks = wikiLinksMacro ? !(wikiLinksMacro.trim() === "no") : true; + useWikiLinks = wikiLinksMacro ? (wikiLinksMacro.trim() !== "no") : true; // Render the link if required if(useWikiLinks) { this.renderLink(parent,nextSibling); diff --git a/core/modules/widgets/list.js b/core/modules/widgets/list.js index fd3b26dd9..0138e0837 100755 --- a/core/modules/widgets/list.js +++ b/core/modules/widgets/list.js @@ -44,7 +44,7 @@ ListWidget.prototype.render = function(parent,nextSibling) { // Construct the storyview var StoryView = this.storyViews[this.storyViewName]; if(StoryView && !this.document.isTiddlyWikiFakeDom) { - this.storyview = new StoryView(this) + this.storyview = new StoryView(this); } else { this.storyview = null; } diff --git a/core/modules/widgets/navigator.js b/core/modules/widgets/navigator.js index e8edc321b..dcc0b0594 100755 --- a/core/modules/widgets/navigator.js +++ b/core/modules/widgets/navigator.js @@ -283,9 +283,10 @@ NavigatorWidget.prototype.makeDraftTiddler = function(targetTitle) { Generate a title for the draft of a given tiddler */ NavigatorWidget.prototype.generateDraftTitle = function(title) { - var c = 0; + var c = 0, + draftTitle; do { - var draftTitle = "Draft " + (c ? (c + 1) + " " : "") + "of '" + title + "'"; + draftTitle = "Draft " + (c ? (c + 1) + " " : "") + "of '" + title + "'"; c++; } while(this.wiki.tiddlerExists(draftTitle)); return draftTitle; diff --git a/core/modules/widgets/reveal.js b/core/modules/widgets/reveal.js index b2229631a..66a87f1af 100755 --- a/core/modules/widgets/reveal.js +++ b/core/modules/widgets/reveal.js @@ -41,7 +41,7 @@ RevealWidget.prototype.render = function(parent,nextSibling) { $tw.utils.addClass(domNode,"tc-popup"); // Make sure that clicks don't dismiss popups within the revealed content } if(!this.isOpen) { - domNode.setAttribute("hidden","true") + domNode.setAttribute("hidden","true"); } this.domNodes.push(domNode); }; diff --git a/core/modules/widgets/tiddler.js b/core/modules/widgets/tiddler.js index fcc4fabf1..6a86940c0 100755 --- a/core/modules/widgets/tiddler.js +++ b/core/modules/widgets/tiddler.js @@ -44,7 +44,7 @@ TiddlerWidget.prototype.execute = function() { this.setVariable("missingTiddlerClass",(this.wiki.tiddlerExists(this.tiddlerTitle) || this.wiki.isShadowTiddler(this.tiddlerTitle)) ? "tc-tiddler-exists" : "tc-tiddler-missing"); this.setVariable("shadowTiddlerClass",this.wiki.isShadowTiddler(this.tiddlerTitle) ? "tc-tiddler-shadow" : ""); this.setVariable("systemTiddlerClass",this.wiki.isSystemTiddler(this.tiddlerTitle) ? "tc-tiddler-system" : ""); - this.setVariable("tiddlerTagClasses",this.getTagClasses()) + this.setVariable("tiddlerTagClasses",this.getTagClasses()); // Construct the child widgets this.makeChildWidgets(); }; diff --git a/core/modules/widgets/widget.js b/core/modules/widgets/widget.js index 9424dd6d8..d0f23c96d 100755 --- a/core/modules/widgets/widget.js +++ b/core/modules/widgets/widget.js @@ -171,7 +171,7 @@ Widget.prototype.evaluateMacroModule = function(name,actualParams,defaultValue) else for(var i=0; i Date: Sat, 30 Aug 2014 22:32:53 +0200 Subject: [PATCH 10/21] Update Improving TiddlyWiki Documentation.tid --- .../tiddlers/howtos/Improving TiddlyWiki Documentation.tid | 2 ++ 1 file changed, 2 insertions(+) diff --git a/editions/tw5.com/tiddlers/howtos/Improving TiddlyWiki Documentation.tid b/editions/tw5.com/tiddlers/howtos/Improving TiddlyWiki Documentation.tid index 3dd1a9bdf..17ccab6da 100644 --- a/editions/tw5.com/tiddlers/howtos/Improving TiddlyWiki Documentation.tid +++ b/editions/tw5.com/tiddlers/howtos/Improving TiddlyWiki Documentation.tid @@ -17,3 +17,5 @@ Anyone can submit improvements to the TiddlyWiki documentation that appears on h # On the following screen, click the green button labelled ''Create pull request'' [[Jermolene|https://github.com/Jermolene]] or one of the other core developers will then have the opportunity to merge your pull request so that it is incorporated into the next build of http://tiddlywiki.com. + +There will be a short viedeo soon! From 9c74afdd1a7751265407888995dcb3dc8276126b Mon Sep 17 00:00:00 2001 From: Jermolene Date: Sat, 30 Aug 2014 21:32:55 +0100 Subject: [PATCH 11/21] JSHint obeisance for plugins folder Also add a jshintignore file to skip the various imported modules --- .jshintignore | 7 ++ plugins/tiddlywiki/browser-sniff/browser.js | 2 +- .../browser-sniff/{bowser => files}/bowser.js | 0 .../{bowser => files}/tiddlywiki.files | 0 plugins/tiddlywiki/cecily/cecily.js | 2 +- .../tiddlywiki/codemirror/edit-codemirror.js | 4 +- .../{lib => files}/addon/dialog/dialog.css | 0 .../{lib => files}/addon/dialog/dialog.js | 0 .../addon/edit/matchbrackets.js | 0 .../addon/search/searchcursor.js | 0 .../codemirror/{lib => files}/codemirror.css | 0 .../codemirror/{lib => files}/codemirror.js | 0 .../codemirror/{lib => files}/keymap/emacs.js | 0 .../codemirror/{lib => files}/keymap/extra.js | 0 .../{lib => files}/keymap/sublime.js | 0 .../codemirror/{lib => files}/keymap/vim.js | 0 .../mode/javascript/javascript.js | 0 .../{lib => files}/tiddlywiki.files | 0 plugins/tiddlywiki/d3/barwidget.js | 68 +++++++++---------- .../filesystem/filesystemadaptor.js | 29 ++++---- .../{jasmine-1.3.1 => files}/MIT.LICENSE | 0 .../{jasmine-1.3.1 => files}/jasmine-html.js | 0 .../{jasmine-1.3.1 => files}/jasmine.css | 0 .../{jasmine-1.3.1 => files}/jasmine.js | 0 .../{jasmine-1.3.1 => files}/reporter.js | 0 .../{jasmine-1.3.1 => files}/tiddlywiki.files | 0 plugins/tiddlywiki/jasmine/jasmine-plugin.js | 2 +- .../tiddlywiki/nodewebkitsaver/nodewebkit.js | 2 +- .../tiddlywiki/tiddlyweb/tiddlywebadaptor.js | 4 +- 29 files changed, 63 insertions(+), 57 deletions(-) create mode 100644 .jshintignore rename plugins/tiddlywiki/browser-sniff/{bowser => files}/bowser.js (100%) rename plugins/tiddlywiki/browser-sniff/{bowser => files}/tiddlywiki.files (100%) rename plugins/tiddlywiki/codemirror/{lib => files}/addon/dialog/dialog.css (100%) rename plugins/tiddlywiki/codemirror/{lib => files}/addon/dialog/dialog.js (100%) rename plugins/tiddlywiki/codemirror/{lib => files}/addon/edit/matchbrackets.js (100%) rename plugins/tiddlywiki/codemirror/{lib => files}/addon/search/searchcursor.js (100%) rename plugins/tiddlywiki/codemirror/{lib => files}/codemirror.css (100%) rename plugins/tiddlywiki/codemirror/{lib => files}/codemirror.js (100%) rename plugins/tiddlywiki/codemirror/{lib => files}/keymap/emacs.js (100%) rename plugins/tiddlywiki/codemirror/{lib => files}/keymap/extra.js (100%) rename plugins/tiddlywiki/codemirror/{lib => files}/keymap/sublime.js (100%) rename plugins/tiddlywiki/codemirror/{lib => files}/keymap/vim.js (100%) rename plugins/tiddlywiki/codemirror/{lib => files}/mode/javascript/javascript.js (100%) rename plugins/tiddlywiki/codemirror/{lib => files}/tiddlywiki.files (100%) rename plugins/tiddlywiki/jasmine/{jasmine-1.3.1 => files}/MIT.LICENSE (100%) rename plugins/tiddlywiki/jasmine/{jasmine-1.3.1 => files}/jasmine-html.js (100%) rename plugins/tiddlywiki/jasmine/{jasmine-1.3.1 => files}/jasmine.css (100%) rename plugins/tiddlywiki/jasmine/{jasmine-1.3.1 => files}/jasmine.js (100%) rename plugins/tiddlywiki/jasmine/{jasmine-1.3.1 => files}/reporter.js (100%) rename plugins/tiddlywiki/jasmine/{jasmine-1.3.1 => files}/tiddlywiki.files (100%) diff --git a/.jshintignore b/.jshintignore new file mode 100644 index 000000000..cca917270 --- /dev/null +++ b/.jshintignore @@ -0,0 +1,7 @@ +plugins/tiddlywiki/browser-sniff/files +plugins/tiddlywiki/codemirror/files/ +plugins/tiddlywiki/d3/files/ +plugins/tiddlywiki/highlight/files/ +plugins/tiddlywiki/jasmine/files/ +plugins/tiddlywiki/markdown/files/ +plugins/tiddlywiki/markdown/files/ diff --git a/plugins/tiddlywiki/browser-sniff/browser.js b/plugins/tiddlywiki/browser-sniff/browser.js index 28a80fc66..2ca0b4840 100644 --- a/plugins/tiddlywiki/browser-sniff/browser.js +++ b/plugins/tiddlywiki/browser-sniff/browser.js @@ -13,7 +13,7 @@ Initialise $:/info/browser tiddlers "use strict"; exports.getInfoTiddlerFields = function() { - var mapBoolean = function(value) {return value ? "yes" : "no"}, + var mapBoolean = function(value) {return value ? "yes" : "no";}, infoTiddlerFields = []; // Basics if($tw.browser) { diff --git a/plugins/tiddlywiki/browser-sniff/bowser/bowser.js b/plugins/tiddlywiki/browser-sniff/files/bowser.js similarity index 100% rename from plugins/tiddlywiki/browser-sniff/bowser/bowser.js rename to plugins/tiddlywiki/browser-sniff/files/bowser.js diff --git a/plugins/tiddlywiki/browser-sniff/bowser/tiddlywiki.files b/plugins/tiddlywiki/browser-sniff/files/tiddlywiki.files similarity index 100% rename from plugins/tiddlywiki/browser-sniff/bowser/tiddlywiki.files rename to plugins/tiddlywiki/browser-sniff/files/tiddlywiki.files diff --git a/plugins/tiddlywiki/cecily/cecily.js b/plugins/tiddlywiki/cecily/cecily.js index 5efd4a4af..e7646f726 100644 --- a/plugins/tiddlywiki/cecily/cecily.js +++ b/plugins/tiddlywiki/cecily/cecily.js @@ -113,7 +113,7 @@ CecilyStoryView.prototype.lookupTiddlerInMap = function(title,domNode) { if(tiddler) { var draftOf = tiddler.fields["draft.of"]; if(draftOf && this.map.positions[draftOf]) { - return this.map.positions[draftOf] + return this.map.positions[draftOf]; } } // Try looking the target tiddler up in the map diff --git a/plugins/tiddlywiki/codemirror/edit-codemirror.js b/plugins/tiddlywiki/codemirror/edit-codemirror.js index 121792649..a47560d35 100644 --- a/plugins/tiddlywiki/codemirror/edit-codemirror.js +++ b/plugins/tiddlywiki/codemirror/edit-codemirror.js @@ -25,14 +25,14 @@ Config options "$:/config/CodeMirror" e.g. to allow vim key bindings /*global $tw: false */ "use strict"; -var CODEMIRROR_OPTIONS = "$:/config/CodeMirror" +var CODEMIRROR_OPTIONS = "$:/config/CodeMirror"; // Install CodeMirror if($tw.browser && !window.CodeMirror) { window.CodeMirror = require("$:/plugins/tiddlywiki/codemirror/lib/codemirror.js"); // Install required CodeMirror plugins var configOptions = $tw.wiki.getTiddlerData(CODEMIRROR_OPTIONS,{}), - req = configOptions["require"]; + req = configOptions.require; if(req) { if($tw.utils.isArray(req)) { for(var index=0; index|\:|\"|\/|\\|\||\?|\*|\^/g,"_"); + var baseFilename = title.replace(/<|>|\:|\"|\/|\\|\||\?|\*|\^/g,"_"); // Truncate the filename if it is too long if(baseFilename.length > 200) { baseFilename = baseFilename.substr(0,200) + extension; diff --git a/plugins/tiddlywiki/jasmine/jasmine-1.3.1/MIT.LICENSE b/plugins/tiddlywiki/jasmine/files/MIT.LICENSE similarity index 100% rename from plugins/tiddlywiki/jasmine/jasmine-1.3.1/MIT.LICENSE rename to plugins/tiddlywiki/jasmine/files/MIT.LICENSE diff --git a/plugins/tiddlywiki/jasmine/jasmine-1.3.1/jasmine-html.js b/plugins/tiddlywiki/jasmine/files/jasmine-html.js similarity index 100% rename from plugins/tiddlywiki/jasmine/jasmine-1.3.1/jasmine-html.js rename to plugins/tiddlywiki/jasmine/files/jasmine-html.js diff --git a/plugins/tiddlywiki/jasmine/jasmine-1.3.1/jasmine.css b/plugins/tiddlywiki/jasmine/files/jasmine.css similarity index 100% rename from plugins/tiddlywiki/jasmine/jasmine-1.3.1/jasmine.css rename to plugins/tiddlywiki/jasmine/files/jasmine.css diff --git a/plugins/tiddlywiki/jasmine/jasmine-1.3.1/jasmine.js b/plugins/tiddlywiki/jasmine/files/jasmine.js similarity index 100% rename from plugins/tiddlywiki/jasmine/jasmine-1.3.1/jasmine.js rename to plugins/tiddlywiki/jasmine/files/jasmine.js diff --git a/plugins/tiddlywiki/jasmine/jasmine-1.3.1/reporter.js b/plugins/tiddlywiki/jasmine/files/reporter.js similarity index 100% rename from plugins/tiddlywiki/jasmine/jasmine-1.3.1/reporter.js rename to plugins/tiddlywiki/jasmine/files/reporter.js diff --git a/plugins/tiddlywiki/jasmine/jasmine-1.3.1/tiddlywiki.files b/plugins/tiddlywiki/jasmine/files/tiddlywiki.files similarity index 100% rename from plugins/tiddlywiki/jasmine/jasmine-1.3.1/tiddlywiki.files rename to plugins/tiddlywiki/jasmine/files/tiddlywiki.files diff --git a/plugins/tiddlywiki/jasmine/jasmine-plugin.js b/plugins/tiddlywiki/jasmine/jasmine-plugin.js index 1ed39e186..07e19ffda 100644 --- a/plugins/tiddlywiki/jasmine/jasmine-plugin.js +++ b/plugins/tiddlywiki/jasmine/jasmine-plugin.js @@ -51,7 +51,7 @@ exports.startup = function() { // The HTMLReporter links itself into the jasmine object automatically, but we have to manually add the node reporter jasmine.jasmine.TerminalVerboseReporter = reporterExports.jasmineNode.TerminalVerboseReporter; jasmine.jasmine.TerminalReporter = reporterExports.jasmineNode.TerminalReporter; - jasmineEnv.addReporter(new jasmine.jasmine.TerminalVerboseReporter({ + jasmineEnv.addReporter(new jasmine.jasmine.TerminalVerboseReporter({ print: require("util").print, color: true, includeStackTrace: true diff --git a/plugins/tiddlywiki/nodewebkitsaver/nodewebkit.js b/plugins/tiddlywiki/nodewebkitsaver/nodewebkit.js index 81680f667..ae36dea1f 100644 --- a/plugins/tiddlywiki/nodewebkitsaver/nodewebkit.js +++ b/plugins/tiddlywiki/nodewebkitsaver/nodewebkit.js @@ -48,7 +48,7 @@ Static method that returns true if this saver is capable of working */ exports.canSave = function(wiki) { // Check if we're running under node-webkit - return (typeof process == "object") + return (typeof process == "object"); }; /* diff --git a/plugins/tiddlywiki/tiddlyweb/tiddlywebadaptor.js b/plugins/tiddlywiki/tiddlyweb/tiddlywebadaptor.js index e87db5b0b..69d92119d 100644 --- a/plugins/tiddlywiki/tiddlyweb/tiddlywebadaptor.js +++ b/plugins/tiddlywiki/tiddlyweb/tiddlywebadaptor.js @@ -37,7 +37,7 @@ TiddlyWebAdaptor.prototype.getHost = function() { TiddlyWebAdaptor.prototype.getTiddlerInfo = function(tiddler) { return { - bag: tiddler.fields["bag"] + bag: tiddler.fields.bag }; }; @@ -248,7 +248,7 @@ TiddlyWebAdaptor.prototype.convertTiddlerToTiddlyWebFormat = function(tiddler) { // Default the content type and convert the type "text/x-tiddlywiki" into null if(result.type === "text/x-tiddlywiki") { result.type = null; - }; + } result.type = result.type || "text/vnd.tiddlywiki"; return JSON.stringify(result,null,$tw.config.preferences.jsonSpaces); }; From 659592bce1caeb07e4af8d80db81800ab9679cf7 Mon Sep 17 00:00:00 2001 From: Mario Pietsch Date: Sat, 30 Aug 2014 22:35:47 +0200 Subject: [PATCH 12/21] Update Improving TiddlyWiki Documentation.tid --- .../tiddlers/howtos/Improving TiddlyWiki Documentation.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/howtos/Improving TiddlyWiki Documentation.tid b/editions/tw5.com/tiddlers/howtos/Improving TiddlyWiki Documentation.tid index 17ccab6da..ada695eaa 100644 --- a/editions/tw5.com/tiddlers/howtos/Improving TiddlyWiki Documentation.tid +++ b/editions/tw5.com/tiddlers/howtos/Improving TiddlyWiki Documentation.tid @@ -18,4 +18,4 @@ Anyone can submit improvements to the TiddlyWiki documentation that appears on h [[Jermolene|https://github.com/Jermolene]] or one of the other core developers will then have the opportunity to merge your pull request so that it is incorporated into the next build of http://tiddlywiki.com. -There will be a short viedeo soon! +There will be a short video soon! From 5a538b2703bd48a587948a057436e7cd48a8ccec Mon Sep 17 00:00:00 2001 From: Jermolene Date: Sat, 30 Aug 2014 22:53:39 +0100 Subject: [PATCH 13/21] Improve GitHub explanation Trying to address #770 --- .../tiddlers/howtos/Improving TiddlyWiki Documentation.tid | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/howtos/Improving TiddlyWiki Documentation.tid b/editions/tw5.com/tiddlers/howtos/Improving TiddlyWiki Documentation.tid index 3dd1a9bdf..9e3522c4d 100644 --- a/editions/tw5.com/tiddlers/howtos/Improving TiddlyWiki Documentation.tid +++ b/editions/tw5.com/tiddlers/howtos/Improving TiddlyWiki Documentation.tid @@ -1,7 +1,7 @@ title: Improving TiddlyWiki Documentation tags: howto created: 20140820151051019 -modified: 20140820151051019 +modified: 20140830151051019 Anyone can submit improvements to the TiddlyWiki documentation that appears on http://tiddlywiki.com. @@ -9,6 +9,7 @@ Anyone can submit improvements to the TiddlyWiki documentation that appears on h # On http://tiddlywiki.com, click "edit" on the tiddler you want to improve # You should see a pink banner with the text: //Can you help us improve this documentation? Find out how to edit this tiddler on ~GitHub// # Click on the external link ...''this tiddler on ~GitHub'' +## You will be prompted that "you need to fork this repository to propose changes". A "fork" is your own copy of the repository that incorporates the changes you are proposing # A new browser tab should open ready to edit the tiddler on github.com # Below the edit box for the tiddler text you should see a box labelled ''Propose file change'' # Enter a brief title to explain the change (eg, "Clarify attribute syntax instability") From 05dfa1e1e329c2503ac6d5ddfaccdb4ab5ba8759 Mon Sep 17 00:00:00 2001 From: Jermolene Date: Sat, 30 Aug 2014 23:05:04 +0100 Subject: [PATCH 14/21] Coding style tweak --- core/modules/widgets/widget.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/modules/widgets/widget.js b/core/modules/widgets/widget.js index 4ddf69c3b..144f12fa2 100755 --- a/core/modules/widgets/widget.js +++ b/core/modules/widgets/widget.js @@ -268,8 +268,7 @@ Widget.prototype.assignAttributes = function(domNode,options) { try { if (b.length == 2 && b[0] == "xlink"){ domNode.setAttributeNS("http://www.w3.org/1999/xlink",b[1],v); - } - else { + } else { domNode.setAttributeNS(null,a,v); } } catch(e) { From 60e95beed2cb2a837327150df777dce3b10752db Mon Sep 17 00:00:00 2001 From: Bram Chen Date: Sun, 31 Aug 2014 10:40:08 +0800 Subject: [PATCH 15/21] Typos in documentation --- .../tiddlers/messages/WidgetMessage_ tm-auto-save-wiki.tid | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-auto-save-wiki.tid b/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-auto-save-wiki.tid index bfe4366a4..1d21af34d 100644 --- a/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-auto-save-wiki.tid +++ b/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-auto-save-wiki.tid @@ -6,6 +6,6 @@ type: text/vnd.tiddlywiki The autosave wiki message causes the current saver module to perform a background save if it is required. -The autosave wiki message should be generated whenever changes are made to the store. For example, the navigator widget generates the autosave wiki message as part of its handling of the [[WidgetMessage: tw-save-tiddler]], [[WidgetMessage: tw-delete-tiddler]] and [[WidgetMessage: tw-perform-import]]. +The autosave wiki message should be generated whenever changes are made to the store. For example, the navigator widget generates the autosave wiki message as part of its handling of the [[WidgetMessage: tm-save-tiddler]], [[WidgetMessage: tm-delete-tiddler]] and [[WidgetMessage: tm-perform-import]]. -The autosave wiki message is handled by the TiddlyWiki core SyncMechanism which invokes the current [[SaverModule|SaverModules]]. Not all SaverModules can handle autosaving. \ No newline at end of file +The autosave wiki message is handled by the TiddlyWiki core SyncMechanism which invokes the current [[SaverModule|SaverModules]]. Not all SaverModules can handle autosaving. From 559afcffd9ef1fdfd8d1f76766fe83cf5a94621a Mon Sep 17 00:00:00 2001 From: Jermolene Date: Sun, 31 Aug 2014 14:05:43 +0100 Subject: [PATCH 16/21] Add classes to the toc macro output --- core/wiki/macros/toc.tid | 6 +++--- editions/tw5.com/tiddlers/macros/TableOfContentsMacro.tid | 2 ++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/core/wiki/macros/toc.tid b/core/wiki/macros/toc.tid index 60c6d73f6..c4ed79eef 100644 --- a/core/wiki/macros/toc.tid +++ b/core/wiki/macros/toc.tid @@ -2,7 +2,7 @@ title: $:/core/macros/toc tags: $:/tags/Macro \define toc(tag,sort:"") -
    +
      <$list filter="[tag[$tag$]$sort$]">
    1. <$link> @@ -42,7 +42,7 @@ tags: $:/tags/Macro \end \define toc-expandable(tag,sort:"") -
        +
          <$list filter="[tag[$tag$]$sort$]"> <> @@ -77,7 +77,7 @@ tags: $:/tags/Macro \end \define toc-selective-expandable(tag,sort:"") -
            +
              <$list filter="[tag[$tag$]$sort$]"> <> diff --git a/editions/tw5.com/tiddlers/macros/TableOfContentsMacro.tid b/editions/tw5.com/tiddlers/macros/TableOfContentsMacro.tid index e31760db1..169cb8ec3 100644 --- a/editions/tw5.com/tiddlers/macros/TableOfContentsMacro.tid +++ b/editions/tw5.com/tiddlers/macros/TableOfContentsMacro.tid @@ -12,6 +12,8 @@ There are several variants of the macro: * `<>` produces an expandable tree of links * `<>` produces an expandable tree of links where the expand/contract buttons are only shown for entries that possess child nodes +The macros all generate HTML ordered lists. The `
                ` elements are given the class `tc-toc`, with the expandable variant also having the class `tc-toc-expandable` and the selective expandable variant also having the class `tc-toc-selective-expandable`. + ! Parameters |!Position |!Name |!Description |!Default | From d2fd85eb1257599e41728c08bcf2a439da1e0dea Mon Sep 17 00:00:00 2001 From: Jermolene Date: Sun, 31 Aug 2014 14:37:37 +0100 Subject: [PATCH 17/21] Missed class "body" conversion to "tc-tiddler-body" --- core/ui/ViewTemplate/body.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/ui/ViewTemplate/body.tid b/core/ui/ViewTemplate/body.tid index c983fd965..c0cd21e50 100644 --- a/core/ui/ViewTemplate/body.tid +++ b/core/ui/ViewTemplate/body.tid @@ -1,7 +1,7 @@ title: $:/core/ui/ViewTemplate/body tags: $:/tags/ViewTemplate -
                +
                <$list filter="[all[current]!has[plugin-type]]"> From 0e5d70f8ba8071fa3fc563386087f28443ac47a9 Mon Sep 17 00:00:00 2001 From: Jermolene Date: Sun, 31 Aug 2014 14:43:14 +0100 Subject: [PATCH 18/21] Add @pmario's video tutorials --- .../dev/Working with the TiddlyWiki5 repository.tid | 6 ++++++ .../tiddlers/howtos/Improving TiddlyWiki Documentation.tid | 4 +++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/dev/Working with the TiddlyWiki5 repository.tid b/editions/tw5.com/tiddlers/dev/Working with the TiddlyWiki5 repository.tid index 535cb2575..7a3866248 100644 --- a/editions/tw5.com/tiddlers/dev/Working with the TiddlyWiki5 repository.tid +++ b/editions/tw5.com/tiddlers/dev/Working with the TiddlyWiki5 repository.tid @@ -4,6 +4,12 @@ tags: dev howto title: Working with the TiddlyWiki5 repository type: text/vnd.tiddlywiki +! Introduction + +Mario Pietsch has created a short video tutorial on working with the TiddlyWiki5 ~GitHub repository. + + + ! Setting Up If you plan on working with the TiddlyWiki5 source code then follow these steps: diff --git a/editions/tw5.com/tiddlers/howtos/Improving TiddlyWiki Documentation.tid b/editions/tw5.com/tiddlers/howtos/Improving TiddlyWiki Documentation.tid index c316b8a09..89976fb22 100644 --- a/editions/tw5.com/tiddlers/howtos/Improving TiddlyWiki Documentation.tid +++ b/editions/tw5.com/tiddlers/howtos/Improving TiddlyWiki Documentation.tid @@ -19,4 +19,6 @@ Anyone can submit improvements to the TiddlyWiki documentation that appears on h [[Jermolene|https://github.com/Jermolene]] or one of the other core developers will then have the opportunity to merge your pull request so that it is incorporated into the next build of http://tiddlywiki.com. -There will be a short video soon! +Mario Pietsch has created this short video tutorial: + + From f9a8ba46be94f3450f481df6fcb4989059f21c8a Mon Sep 17 00:00:00 2001 From: Jermolene Date: Sun, 31 Aug 2014 14:43:20 +0100 Subject: [PATCH 19/21] Fix OXTWIG video --- editions/tw5.com/tiddlers/howtos/Video Tutorials.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/howtos/Video Tutorials.tid b/editions/tw5.com/tiddlers/howtos/Video Tutorials.tid index 74d13396b..6ed1ef675 100644 --- a/editions/tw5.com/tiddlers/howtos/Video Tutorials.tid +++ b/editions/tw5.com/tiddlers/howtos/Video Tutorials.tid @@ -22,4 +22,4 @@ The aim is to curate a series of videos to guide people through getting up and r This video of the second [[OXTWIG]] meeting starts with a tutorial overview demonstrating how to use ~TiddlyWiki in different scenarios: - + From 94538394d417b12c81270cb19408f8d9d4ac63b8 Mon Sep 17 00:00:00 2001 From: Jermolene Date: Sun, 31 Aug 2014 14:44:04 +0100 Subject: [PATCH 20/21] Improve embed and iframe styling These styles are intended for viewing PDF tiddlers directly --- themes/tiddlywiki/vanilla/base.tid | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index fae5fda62..9d4b35c3e 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -129,8 +129,8 @@ table tfoot tr td { max-width: 100%; } -.tc-tiddler-frame embed, -.tc-tiddler-frame iframe { +.tc-tiddler-body > embed, +.tc-tiddler-body > iframe { width: 100%; height: 600px; } From 522d945275f92b5e1c829326b71fb0c60e64ee81 Mon Sep 17 00:00:00 2001 From: gernert Date: Sun, 31 Aug 2014 15:52:46 +0200 Subject: [PATCH 21/21] Update PluginMechanism.tid Without a name field the entry in the minithemeswitcher will be blank. --- editions/tw5.com/tiddlers/mechanisms/PluginMechanism.tid | 1 + 1 file changed, 1 insertion(+) diff --git a/editions/tw5.com/tiddlers/mechanisms/PluginMechanism.tid b/editions/tw5.com/tiddlers/mechanisms/PluginMechanism.tid index d271885e8..5d41cedc1 100644 --- a/editions/tw5.com/tiddlers/mechanisms/PluginMechanism.tid +++ b/editions/tw5.com/tiddlers/mechanisms/PluginMechanism.tid @@ -33,6 +33,7 @@ Plugins are stored as tiddlers with the following fields: |plugin-type |Can be ''plugin'' (default) or ''theme'' | |text |JSON encoding of the list of tiddlers comprising the plugin | |list |Names of exposed plugin information tiddlers (see below) | +|name |Name of the theme (only for themes) | |dependents |List of dependent plugins (currently only implemented for themes) | ! Plugin folders