Created
June 13, 2016 03:58
-
-
Save icm7216/bb982a5e8d29b0f6a82ee40c36a542c9 to your computer and use it in GitHub Desktop.
TiddlyWiki classic (TWc) の検索プラグイン「SimpleSearchPlugin」をカスタマイズ。検索結果リストの並び順を tiddler の変更日順に。検索結果リストに変更日付を表示。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/*** | |
|''Name''|SimpleSearchPlugin| | |
|''Description''|displays search results as a simple list of matching tiddlers| | |
|''Authors''|FND, (v0.4.2 modified by babooshka)| | |
|''Version''|0.4.2| | |
|''Status''|stable| | |
|''Source''|http://devpad.tiddlyspot.com/#SimpleSearchPlugin <br/> http://babooshka.tiddlyspot.com/#SimpleSearchPlugin| | |
|''CodeRepository''|http://svn.tiddlywiki.org/Trunk/contributors/FND/plugins/SimpleSearchPlugin.js| | |
|''License''|[[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]| | |
|''Keywords''|search| | |
!Revision History | |
!!v0.2.0 (2008-08-18) | |
* initial release | |
!!v0.3.0 (2008-08-19) | |
* added Open All button (renders Classic Search option obsolete) | |
* sorting by relevance (title matches before content matches) | |
!!v0.4.0 (2008-08-26) | |
* added tag matching | |
!!v0.4.2 (2015-02-20) | |
* modify sorted by the modified date descendingly | |
* add Date for results list | |
!To Do | |
* tag matching optional | |
* animations for container creation and removal | |
* when clicking on search results, do not scroll to the respective tiddler (optional) | |
* use template for search results | |
!Code | |
***/ | |
//{{{ | |
if(!version.extensions.SimpleSearchPlugin) { //# ensure that the plugin is only installed once | |
version.extensions.SimpleSearchPlugin = { installed: true }; | |
if(!config.extensions) { config.extensions = {}; } | |
config.extensions.SimpleSearchPlugin = { | |
heading: "Search Results", | |
containerId: "searchResults", | |
btnCloseLabel: "close", | |
btnCloseTooltip: "dismiss search results", | |
btnCloseId: "search_close", | |
btnOpenLabel: "Open all", | |
btnOpenTooltip: "open all search results", | |
btnOpenId: "search_open", | |
displayResults: function(matches, query) { | |
story.refreshAllTiddlers(true); // update highlighting within story tiddlers | |
var el = document.getElementById(this.containerId); | |
query = '"""' + query + '"""'; // prevent WikiLinks | |
if(el) { | |
removeChildren(el); | |
} else { //# fallback: use displayArea as parent | |
var container = document.getElementById("displayArea"); | |
el = document.createElement("div"); | |
el.id = this.containerId; | |
el = container.insertBefore(el, container.firstChild); | |
} | |
var msg = "!" + this.heading + "\n"; | |
if(matches.length > 0) { | |
msg += "''" + config.macros.search.successMsg.format([matches.length.toString(), query]) + ":''\n"; | |
this.results = []; | |
for(var i = 0 ; i < matches.length; i++) { | |
this.results.push(matches[i].title); | |
// add Date for results list | |
msg += "* " + matches[i].modified.formatString("[ YYYY-0MM-0DD ]"); | |
msg += " [[" + matches[i].title + "]]\n"; | |
} | |
} else { | |
msg += "''" + config.macros.search.failureMsg.format([query]) + "''"; // XXX: do not use bold here!? | |
} | |
createTiddlyButton(el, this.btnCloseLabel, this.btnCloseTooltip, config.extensions.SimpleSearchPlugin.closeResults, "button", this.btnCloseId); | |
wikify(msg, el); | |
if(matches.length > 0) { // XXX: redundant!? | |
createTiddlyButton(el, this.btnOpenLabel, this.btnOpenTooltip, config.extensions.SimpleSearchPlugin.openAll, "button", this.btnOpenId); | |
} | |
}, | |
closeResults: function() { | |
var el = document.getElementById(config.extensions.SimpleSearchPlugin.containerId); | |
removeNode(el); | |
config.extensions.SimpleSearchPlugin.results = null; | |
highlightHack = null; | |
}, | |
openAll: function(ev) { | |
story.displayTiddlers(null, config.extensions.SimpleSearchPlugin.results); | |
return false; | |
} | |
}; | |
config.shadowTiddlers.StyleSheetSimpleSearch = "/*{{{*/\n" + | |
"#" + config.extensions.SimpleSearchPlugin.containerId + " {\n" + | |
"\toverflow: auto;\n" + | |
"\tpadding: 5px 1em 10px;\n" + | |
"\tbackground-color: [[ColorPalette::TertiaryPale]];\n" + | |
"}\n\n" + | |
"#" + config.extensions.SimpleSearchPlugin.containerId + " h1 {\n" + | |
"\tmargin-top: 0;\n" + | |
"\tborder: none;\n" + | |
"}\n\n" + | |
"#" + config.extensions.SimpleSearchPlugin.containerId + " ul {\n" + | |
"\tmargin: 0.5em;\n" + | |
"\tpadding-left: 1.5em;\n" + | |
"}\n\n" + | |
"#" + config.extensions.SimpleSearchPlugin.containerId + " .button {\n" + | |
"\tdisplay: block;\n" + | |
"\tborder-color: [[ColorPalette::TertiaryDark]];\n" + | |
"\tpadding: 5px;\n" + | |
"\tbackground-color: [[ColorPalette::TertiaryLight]];\n" + | |
"}\n\n" + | |
"#" + config.extensions.SimpleSearchPlugin.containerId + " .button:hover {\n" + | |
"\tborder-color: [[ColorPalette::SecondaryMid]];\n" + | |
"\tbackground-color: [[ColorPalette::SecondaryLight]];\n" + | |
"}\n\n" + | |
"#" + config.extensions.SimpleSearchPlugin.btnCloseId + " {\n" + | |
"\tfloat: right;\n" + | |
"\tmargin: -5px -1em 5px 5px;\n" + | |
"}\n\n" + | |
"#" + config.extensions.SimpleSearchPlugin.btnOpenId + " {\n" + | |
"\tfloat: left;\n" + | |
"\tmargin-top: 5px;\n" + | |
"}\n" + | |
"/*}}}*/"; | |
store.addNotification("StyleSheetSimpleSearch", refreshStyles); | |
// override Story.search() | |
Story.prototype.search = function(text, useCaseSensitive, useRegExp) { | |
highlightHack = new RegExp(useRegExp ? text : text.escapeRegExp(), useCaseSensitive ? "mg" : "img"); | |
var matches = store.search(highlightHack, null, "excludeSearch"); | |
var q = useRegExp ? "/" : "'"; | |
config.extensions.SimpleSearchPlugin.displayResults(matches, q + text + q); | |
}; | |
// override TiddlyWiki.search() to sort by relevance | |
TiddlyWiki.prototype.search = function(searchRegExp, sortField, excludeTag, match) { | |
var candidates = this.reverseLookup("tags", excludeTag, !!match); | |
var primary = []; | |
var secondary = []; | |
var tertiary = []; | |
for(var t = 0; t < candidates.length; t++) { | |
if(candidates[t].title.search(searchRegExp) != -1) { | |
primary.push(candidates[t]); | |
} else if(candidates[t].tags.join(" ").search(searchRegExp) != -1) { | |
secondary.push(candidates[t]); | |
} else if(candidates[t].text.search(searchRegExp) != -1) { | |
tertiary.push(candidates[t]); | |
} | |
} | |
var results = primary.concat(secondary).concat(tertiary); | |
// comment out sort function | |
// if(sortField) { | |
// results.sort(function(a, b) { | |
// return a[sortField] < b[sortField] ? -1 : (a[sortField] == b[sortField] ? 0 : +1); | |
// }); | |
// } | |
// modify sorted by the modified date descendingly | |
sortField = "-modified"; | |
this.sortTiddlers(results,sortField); | |
return results; | |
}; | |
} //# end of "install only once" | |
//}}} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment