From 83defb8b5083a72cff60ac22a5b319cbb6354c40 Mon Sep 17 00:00:00 2001 From: "Alex A. Naanou" Date: Fri, 8 Jul 2016 01:40:59 +0300 Subject: [PATCH] started work on updating links on page move... Signed-off-by: Alex A. Naanou --- index.html | 10 ++++-- wiki.js | 98 ++++++++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 88 insertions(+), 20 deletions(-) diff --git a/index.html b/index.html index 5740cea..651c699 100755 --- a/index.html +++ b/index.html @@ -75,8 +75,12 @@ $(() => { reload() + // XXX make this update on enter... $('.title') - .on('keyup', () => { Wiki.title = $('.title').text() }) + .on('blur', () => { + Wiki.title = $('.title').text() + reload() + }) // live update text... // XXX is this the right way to go for large documents??? @@ -93,8 +97,8 @@ $(() => {

-

-
+

+
diff --git a/wiki.js b/wiki.js index 28a0a3e..d5c8e95 100755 --- a/wiki.js +++ b/wiki.js @@ -22,7 +22,7 @@ // } // } var data = { - 'Templates/DefaultPage': { + 'Templates/EmptyPage': { text: 'This page is empty.

WikiHome', }, } @@ -44,7 +44,7 @@ var Wiki = { __wiki_data: data, __home_page__: 'WikiHome', - __default_page__: 'DefaultPage', + __default_page__: 'EmptyPage', __templates__: 'Templates', __wiki_link__: RegExp('('+[ @@ -71,10 +71,53 @@ var Wiki = { return this.location }, set path(value){ var l = this.location + // old title... + var ot = this.title value = normalizePath(value) - this.__wiki_data[value] = this.__wiki_data[l] || {} + if(this.exists(l)){ + this.__wiki_data[value] = this.__wiki_data[l] + } this.location = value + + // new title... + var nt = this.title + + // update all links... + this.pages(function(page){ + page.location != l && page.links.forEach(lnk => { + var p = path2lst(lnk) + var t = p.pop() + + // 1:1 change + (lnk == l + // change all links that resolve to current page + // with same basename... + || (t == ot && page.acquire(p, t) == l) + // XXX need to take changing paths into acount... + || true) + && console.log(lnk, '->', p +'/'+ nt) + /* + && (page.text.match(this.__wiki_link__) || []) + // get both types of links... + .filter(e => e == l || e == '['+l+']') + // unique... + .filter((e, i, l) => l.slice(0, i).indexOf(e) == -1) + // do the replacing... + .forEach(e => + page.text = page.text.replace( + // XXX BUG: this will change anything + // containing the pattern... + RegExp('' + // regexp-quote string... + +e.replace(/[\[\]\(\)\$\^\{\}\?\|\*\.\+]/g, '\\$1') + + '', 'g'), + value)) + //*/ + }) + }) + + // cleaup... delete this.__wiki_data[l] }, @@ -111,16 +154,20 @@ var Wiki = { this.__wiki_data[l].text = value // cache links... + delete this.__wiki_data[l].links this.__wiki_data[l].links = this.links }, + // NOTE: this is set by setting .text get links(){ - return (this.acquireData() || {}).links - || this.text.match(this.__wiki_link__) + var data = this.acquireData() || {} + var links = data.links = data.links + || (this.text.match(this.__wiki_link__) || []) // unwrap explicit links... .map(e => e[0] == '[' ? e.slice(1, -1) : e) // unique... .filter((e, i, l) => l.slice(0, i).indexOf(e) == -1) + return links }, // XXX @@ -133,7 +180,7 @@ var Wiki = { exists: function(path){ return normalizePath(path) in this.__wiki_data }, // get title from dir and then go up the tree... - acquire: function(title){ + _acquire: function(title){ title = title || this.__default_page__ var templates = this.__templates__ var data = this.__wiki_data @@ -142,11 +189,8 @@ var Wiki = { var path = path2lst(this.dir) var _res = function(p){ - return { - dir: normalizePath(p.slice(0, -1)), - title: title, - text: that.__wiki_data[normalizePath(p)].text - } + p = normalizePath(p) + return that.__wiki_data[p] && p } while(true){ @@ -169,21 +213,27 @@ var Wiki = { path.pop() } }, - - acquireData: function(path, title){ - path = path || this.path + acquire: function(path, title){ + path = path && normalizePath(path) || this.path title = title || this.title + var wiki = this.__wiki_data // get the page directly... - return this.__wiki_data[path +'/'+ title] + return (this.exists(path +'/'+ title) && path +'/'+ title) // acquire the page from path... - || this.acquire(title) + || this._acquire(title) // acquire the default page... - || this.acquire(this.__default_page__) + || this._acquire(this.__default_page__) // nothing found... || null }, + // shorthand... + acquireData: function(path, title){ + var page = this.acquire(path, title) + return page ? this.__wiki_data[page] : null + }, + // serialization... json: function(path){ @@ -201,6 +251,20 @@ var Wiki = { load: function(json){ this.__wiki_data = json }, + + + // iteration... + // XXX this is not page specific, might need refactoring... + pages: function(callback){ + var that = this + Object.keys(this.__wiki_data).forEach(function(location){ + // XXX not sure if this is the right way to go... + var o = Object.create(that) + o.location = location + callback.call(o, o) + }) + return this + }, }