diff --git a/pwiki/dom/wikiword.js b/pwiki/dom/wikiword.js
index f812242..bbaf5fc 100755
--- a/pwiki/dom/wikiword.js
+++ b/pwiki/dom/wikiword.js
@@ -7,8 +7,86 @@
(function(require){ var module={} // make module AMD/node compatible...
/*********************************************************************/
+var WIKIWORD_PATTERN =
+ RegExp('('+[
+ //'\\\\?(\\/|\\./|\\.\\./|>>|[A-Z][_a-z0-9]+[A-Z/])[_a-zA-Z0-9/]*',
+ '\\\\?\\/?(\\./|\\.\\./|>>|[A-Z][_a-z0-9]+[A-Z/])[_a-zA-Z0-9/]*',
+ '\\\\?\\[[^\\]]+\\]',
+ ].join('|') +')', 'g')
+
+// XXX RENAME...
+// XXX REVISE...
+var setWikiWords =
+module.setWikiWords =
+function(text, show_brackets=true, skip){
+ skip = skip ?? []
+ skip = skip instanceof Array ?
+ skip
+ : [skip]
+ return text
+ // set new...
+ .replace(
+ WIKIWORD_PATTERN,
+ function(l){
+ // check if WikiWord is escaped...
+ if(l[0] == '\\'){
+ return l.slice(1) }
+
+ var path = l[0] == '[' ?
+ l.slice(1, -1)
+ : l
+ var i = [].slice.call(arguments).slice(-2)[0]
+
+ // XXX HACK check if we are inside a tag...
+ var rest = text.slice(i+1)
+ if(rest.indexOf('>') < rest.indexOf('<')){
+ return l }
+
+ return skip.indexOf(l) < 0 ?
+ (''
+ + (!!show_brackets ? path : l)
+ +'')
+ : l })}
+// XXX move this to a better spot....
+var iterText =
+module.iterText =
+function*(root, skip_empty=true){
+ for(var node of root.childNodes){
+ if(node.nodeType == Node.TEXT_NODE
+ && (!skip_empty || node.nodeValue.trim().length != 0)){
+ yield node
+ } else {
+ yield* iterText(node) } } }
+
+
+// handle wikiwords...
+//
+// this will skip:
+// a
+// [wikiwords=no]
+//
+var wikiword =
+module.wikiword =
+function(root){
+ var tmp = document.createElement('div')
+ iterText(pwiki.dom)
+ .forEach(function(text){
+ // skip stuff...
+ if(text.parentNode.nodeName == 'a'
+ || text.parentNode.getAttribute('wikiwords') == 'no'){
+ return }
+ var t = text.nodeValue
+ var n = setWikiWords(text.nodeValue)
+ if(t != n){
+ tmp.innerHTML = n
+ text.replaceWith(...tmp.childNodes) } }) }
diff --git a/pwiki/filters/base.js b/pwiki/filters/base.js
index 06df7ab..71a5b0f 100755
--- a/pwiki/filters/base.js
+++ b/pwiki/filters/base.js
@@ -20,65 +20,6 @@ function(...args){
return func }
-//---------------------------------------------------------------------
-// XXX this does not seem to handle html well...
-
-var WIKIWORD_PATTERN =
- RegExp('('+[
- //'\\\\?(\\/|\\./|\\.\\./|>>|[A-Z][_a-z0-9]+[A-Z/])[_a-zA-Z0-9/]*',
- '\\\\?\\/?(\\./|\\.\\./|>>|[A-Z][_a-z0-9]+[A-Z/])[_a-zA-Z0-9/]*',
- '\\\\?\\[[^\\]]+\\]',
- ].join('|') +')', 'g')
-
-// XXX REVISE...
-var setWikiWords =
-module.setWikiWords =
-function(text, show_brackets=true, skip){
- skip = skip ?? []
- skip = skip instanceof Array ?
- skip
- : [skip]
- return text
- // set new...
- .replace(
- WIKIWORD_PATTERN,
- function(l){
- // check if WikiWord is escaped...
- if(l[0] == '\\'){
- return l.slice(1) }
-
- var path = l[0] == '[' ?
- l.slice(1, -1)
- : l
- var i = [].slice.call(arguments).slice(-2)[0]
-
- // XXX HACK check if we are inside a tag...
- var rest = text.slice(i+1)
- if(rest.indexOf('>') < rest.indexOf('<')){
- return l }
-
- return skip.indexOf(l) < 0 ?
- (''
- + (!!show_brackets ? path : l)
- +'')
- : l })}
-
-module.wikiWord =
-Filter(
- {quote: 'quote-wikiword'},
- function(source){
- return setWikiWords(source) })
-module.quoteWikiWord =
-function(source){
- // XXX
- return source }
-
-
/**********************************************************************
* vim:set ts=4 sw=4 : */ return module })
diff --git a/pwiki/page.js b/pwiki/page.js
index f7831c5..32b7683 100755
--- a/pwiki/page.js
+++ b/pwiki/page.js
@@ -548,8 +548,9 @@ object.Constructor('Page', BasePage, {
return source
.replace(/test/g, 'TEST') },
- wikiword: filters.wikiWord,
- 'quote-wikiword': filters.quoteWikiWord,
+ // XXX
+ wikiword: function(){},
+ 'quote-wikiword': function(){},
markdown: markdown.markdown,
'quote-markdown': markdown.quoteMarkdown,
@@ -1005,6 +1006,7 @@ object.Constructor('Page', BasePage, {
state = text
text = null }
state = state ?? {}
+
return this.__parser__.parse(this, text, state) },
// true if page has an array value but is not a pattern page...
@@ -1102,6 +1104,7 @@ object.Constructor('DOMPage', Page, {
wikiword: undefined,
},
+
// events...
//
// XXX might be a good idea to move this up to Page and trigger when
diff --git a/pwiki2.html b/pwiki2.html
index 3af78ad..a0fc5fc 100755
--- a/pwiki2.html
+++ b/pwiki2.html
@@ -88,13 +88,16 @@ document.pwikiloaded = new Event('pwikiloaded')
// start loading pWiki...
-require(['./browser'], function(m){
- window.pwiki = m.pwiki
+require(['./browser', './pwiki/dom/wikiword'], function(pwiki, wikiword){
+ pwiki = window.pwiki = pwiki.pwiki
+ wikiword = window.wikiword = wikiword.wikiword
+
+ // XXX for some reason this sets to undefined...
+ var iterText = window.iterText = wikiword.iterText
// XXX make a pWikiDom page to manage this...
pwiki.dom = document.querySelector('#pWiki')
-
// handle location.hash (both directions)
var _debounceHashChange = false
pwiki.onNavigate(async function(){
@@ -109,7 +112,12 @@ require(['./browser'], function(m){
// XXX do we need to use a MutationObserver here to trigger this
// after the above is done loading???
// (see: https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver)
- pwiki.dom.dispatchEvent(document.pwikiloaded) })
+ pwiki.dom.dispatchEvent(document.pwikiloaded)
+
+ // wikiwords
+ // XXX this should be controllable from the page...
+ wikiword(pwiki.dom)
+ })
window.addEventListener('hashchange', function(evt){
evt.preventDefault()
diff --git a/pwiki2.js b/pwiki2.js
index 4b887f2..6af579a 100755
--- a/pwiki2.js
+++ b/pwiki2.js
@@ -29,7 +29,7 @@
* - migrate bootstrap
* - store topology
* - markdown -- DONE??
-* - WikiWord --
+* - WikiWord -- DONE-ish
* currently this is broken as it does not know how to deal with HTML
* this can be solved by one of:
* - make this a dom filter and only handle text nodes (as v1-2)