mirror of
https://github.com/Jermolene/TiddlyWiki5
synced 2024-11-23 10:07:19 +00:00
Added ginsu.js for splitting TiddlyWiki files into separate tiddlers
This commit is contained in:
parent
21e06b9833
commit
b45c3249df
30
ginsu.js
Normal file
30
ginsu.js
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
// Break apart a TiddlyWiki HTML file into separate .tid files
|
||||||
|
//
|
||||||
|
// Usage: node ginsu.js <tiddlywikifile> <outputdir>
|
||||||
|
//
|
||||||
|
// The .html extension is optional
|
||||||
|
//
|
||||||
|
// Ginsu creates the specified places the .tid files in the specified directory (which must already exist)
|
||||||
|
var sys = require("sys"),
|
||||||
|
fs = require("fs"),
|
||||||
|
path = require("path"),
|
||||||
|
tiddler = require("./js/Tiddler.js"),
|
||||||
|
tiddlyWikiInput = require("./js/TiddlyWikiInput.js"),
|
||||||
|
tiddlerOutput = require("./js/TiddlerOutput.js");
|
||||||
|
|
||||||
|
var tiddlywikifilename = process.argv[2];
|
||||||
|
var outputdir = process.argv[3];
|
||||||
|
|
||||||
|
var tiddlywikidoc = fs.readFileSync(tiddlywikifilename,"utf8");
|
||||||
|
var tiddlers = tiddlyWikiInput.parseTiddlyWiki(tiddlywikidoc);
|
||||||
|
|
||||||
|
var recipe = [];
|
||||||
|
for(var t=0; t<tiddlers.length; t++) {
|
||||||
|
var tid = new tiddler.Tiddler(tiddlers[t]);
|
||||||
|
var filename = tid.fields.title + ".tid";
|
||||||
|
fs.writeFileSync(path.join(outputdir,filename),tiddlerOutput.outputTiddler(tid));
|
||||||
|
recipe.push("tiddler: " + filename + "\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
fs.writeFileSync(path.join(outputdir,"split.recipe"),recipe.join());
|
||||||
|
|
@ -7,6 +7,39 @@ var argParser = require("./ArgParser.js"),
|
|||||||
|
|
||||||
var tiddlerOutput = exports;
|
var tiddlerOutput = exports;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Output a tiddler as a .tid file
|
||||||
|
*/
|
||||||
|
tiddlerOutput.outputTiddler = function(tid) {
|
||||||
|
var result = [];
|
||||||
|
var outputAttribute = function(name,value) {
|
||||||
|
result.push(name + ": " + value + "\n");
|
||||||
|
};
|
||||||
|
for(var t in tid.fields) {
|
||||||
|
switch(t) {
|
||||||
|
case "text":
|
||||||
|
// Ignore the text field
|
||||||
|
break;
|
||||||
|
case "tags":
|
||||||
|
// Output tags as a list
|
||||||
|
outputAttribute(t,tiddlerOutput.stringifyTags(tid.fields.tags));
|
||||||
|
break;
|
||||||
|
case "modified":
|
||||||
|
case "created":
|
||||||
|
// Output dates in YYYYMMDDHHMM
|
||||||
|
outputAttribute(t,utils.convertToYYYYMMDDHHMM(tid.fields[t]));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
// Output other attributes raw
|
||||||
|
outputAttribute(t,tid.fields[t]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
result.push("\n");
|
||||||
|
result.push(tid.fields.text);
|
||||||
|
return result.join("");
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Output a tiddler as an HTML <DIV>
|
Output a tiddler as an HTML <DIV>
|
||||||
out - array to push the output strings
|
out - array to push the output strings
|
||||||
|
50
js/TiddlyWikiInput.js
Executable file
50
js/TiddlyWikiInput.js
Executable file
@ -0,0 +1,50 @@
|
|||||||
|
/*
|
||||||
|
Functions concerned with parsing TiddlyWiki files
|
||||||
|
*/
|
||||||
|
|
||||||
|
var tiddlerInput = require("./TiddlerInput.js"),
|
||||||
|
utils = require("./Utils.js");
|
||||||
|
|
||||||
|
var tiddlyWikiInput = exports;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Parses the text of a TiddlyWiki HTML file, and returns the tiddlers as an array of hashmaps of raw fields.
|
||||||
|
|
||||||
|
*/
|
||||||
|
tiddlyWikiInput.parseTiddlyWiki = function(tiddlywikidoc) {
|
||||||
|
var results = [];
|
||||||
|
var storeAreaPos = locateStoreArea(tiddlywikidoc);
|
||||||
|
if(storeAreaPos) {
|
||||||
|
var endOfDivRegExp = /(<\/div>\s*)/gi;
|
||||||
|
var startPos = storeAreaPos[0];
|
||||||
|
endOfDivRegExp.lastIndex = startPos;
|
||||||
|
var match = endOfDivRegExp.exec(tiddlywikidoc);
|
||||||
|
while(match && startPos < storeAreaPos[1]) {
|
||||||
|
var endPos = endOfDivRegExp.lastIndex;
|
||||||
|
var fields = tiddlerInput.parseTiddlerDiv(tiddlywikidoc.substring(startPos,endPos));
|
||||||
|
results.push(fields);
|
||||||
|
startPos = endPos;
|
||||||
|
match = endOfDivRegExp.exec(tiddlywikidoc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return results;
|
||||||
|
}
|
||||||
|
|
||||||
|
function locateStoreArea(tiddlywikidoc)
|
||||||
|
{
|
||||||
|
var startSaveArea = '<div id="' + 'storeArea">';
|
||||||
|
var startSaveAreaRegExp = /<div id=["']?storeArea['"]?>/gi;
|
||||||
|
var endSaveArea = '</d' + 'iv>';
|
||||||
|
var endSaveAreaCaps = '</D' + 'IV>';
|
||||||
|
var posOpeningDiv = tiddlywikidoc.search(startSaveAreaRegExp);
|
||||||
|
var limitClosingDiv = tiddlywikidoc.indexOf("<"+"!--POST-STOREAREA--"+">");
|
||||||
|
if(limitClosingDiv == -1) {
|
||||||
|
limitClosingDiv = tiddlywikidoc.indexOf("<"+"!--POST-BODY-START--"+">");
|
||||||
|
}
|
||||||
|
var start = limitClosingDiv == -1 ? tiddlywikidoc.length : limitClosingDiv;
|
||||||
|
var posClosingDiv = tiddlywikidoc.lastIndexOf(endSaveArea,start);
|
||||||
|
if(posClosingDiv == -1) {
|
||||||
|
posClosingDiv = tiddlywikidoc.lastIndexOf(endSaveAreaCaps,start);
|
||||||
|
}
|
||||||
|
return (posOpeningDiv != -1 && posClosingDiv != -1) ? [posOpeningDiv + startSaveArea.length,posClosingDiv] : null;
|
||||||
|
}
|
7
test.sh
7
test.sh
@ -10,4 +10,9 @@ cook $PWD/test/data/tiddlywiki.com/index.html.recipe -d $PWD -o tmp/oldcooked.ht
|
|||||||
node cook.js $PWD/test/data/tiddlywiki.com/index.html.recipe > tmp/newcooked.html || exit 1
|
node cook.js $PWD/test/data/tiddlywiki.com/index.html.recipe > tmp/newcooked.html || exit 1
|
||||||
|
|
||||||
# compare the two
|
# compare the two
|
||||||
opendiff tmp/oldcooked.html tmp/newcooked.html
|
# opendiff tmp/oldcooked.html tmp/newcooked.html
|
||||||
|
|
||||||
|
# split the newly cooked tiddlywiki into tiddlers
|
||||||
|
mkdir -p tmp/tiddlers
|
||||||
|
rm -f tmp/tiddlers/*
|
||||||
|
node ginsu.js tmp/newcooked.html tmp/tiddlers
|
||||||
|
Loading…
Reference in New Issue
Block a user