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)