pWiki/pwiki2.js
Alex A. Naanou 7a1a89e904 experimenting with wikiwords...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
2022-08-08 23:04:42 +03:00

210 lines
6.5 KiB
JavaScript
Executable File

/**********************************************************************
*
*
* XXX wikiword filter seems to act up on /
* XXX BUG? /test/wikiword -- produces nested links...
* to reproduce:
* await p.pwiki.get('/test/wikiword').text
* ..as-is, seems not to deal well with tags...
* ...also might be a good idea to try and moke wiki-word generation
* a DOM thing instead of a filter, this seems logical as we might
* need it only within a UI and I do not think I'll be working on
* a non DOM interface (curses, ...) any time soon...
* XXX add action to reset overloaded (bootstrap) pages...
* - per page
* - global
* XXX Q: can we access fs from a pwa???
*
*
*
* XXX ROADMAP:
* - run in browser
* - basics, loading -- DONE
* - test localStorage / sessionStorage -- DONE
* - test pouch -- DONE
* - render page -- DONE
* - navigation -- DONE
* - hash/anchor -- DONE
* - editor and interactivity
* - migrate bootstrap
* - store topology
* - markdown -- DONE??
* - 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)
* - add a way to go around tags (as pwiki/parser)
* the first approach looks more promising...
* - dom filters ???
* does this need to be a pWiki level thing or just a js call/load??
* ...this can be used to contain all to page-side stuff like:
* - hash handling / navigation
* - editors
* - wikiwords
* - configuration
* - defaults
* - System/config (global)
* - pwa
* - service worker ???
* ...handle relative urls (???)
* - cli
* - basic wiki manipulations (1:1 methods)
* - import/export/sync
* - introspection/repl
* - archive old code
* - update docs
* - refactor and cleanup
* - module structure -- REVISE
* - pack as electron app (???)
*
*
*
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*
* Architecture:
* store
* page
* renderer
*
* Modules:
* page - base pages and page APIs (XXX should this be in lib???)
* parser - pWiki macro parser (XXX should this be in lib???)
* store - stores
* base - memory store and store utils
* file - file storage
* localstorage - localStorage / sessionStorage stores
* pouchdb -
* ...
* filter - page filters
* base - base filters incl. wikiword
* markdown - markdown renderer
* ...
* pwiki2 - main cli / node entry point
* browser - browser entry point
* pwiki2-test - testing and experimenting (XXX move to test.js)
*
*
* Q: can we make this a single module with +/- some plugins??
* ...this would make things quite a bit simpler but will negate the
* use of high level libs like types...
*
*
* XXX weaknesses to review:
* - <store>.paths() as an index...
* + decouples the search logic from the store backend
* - requires the whole list of pages to be in memory
* ...need to be independent of the number of pages if at
* all possible -- otherwise this will hinder long-term use...
* .paths() should be cached to make all path searches away from
* async waits as we can test quite a number of paths before we
* find a page...
* ...another solution is to offload the search to the store backend
* but this would require the stores to reimplement most of pwiki/path
* -
*
*
* TODO?:
* - <page>.then() -- resolve when all pending write operations done ???
* - an async REPL???
* - custom element???
* - might be a good idea to try signature based security:
* - sign changes
* - sign sync session
* - refuse changes with wrong signatures
* - public keys available on client and on server
* - check signatures localy
* - check signatures remotely
* - private key available only with author
* - keep both the last signed and superceding unsigned version
* - on sync ask to overwrite unsigned with signed
* - check if we can use the same mechanics as ssh...
* - in this view a user in the system is simply a set of keys and
* a signature (a page =))
*
* XXX need to think about search -- page function argument syntax???
*
* XXX might need to get all the links (macro-level) from a page...
* ...would be useful for caching...
*
*
*
**********************************************************************/
((typeof define)[0]=='u'?function(f){module.exports=f(require)}:define)
(function(require){ var module={} // make module AMD/node compatible...
/*********************************************************************/
// XXX
//var object = require('lib/object')
var object = require('ig-object')
var types = require('ig-types')
var pwpath =
module.path =
require('./pwiki/path')
var page = require('./pwiki/page')
var basestore = require('./pwiki/store/base')
//var localstoragestore = require('./store/localstorage')
// XXX for some reason this does not run quietly in browser
//var pouchdbstore = require('./store/pouchdb')
//var filestore = require('./store/file')
//---------------------------------------------------------------------
// Basic setup...
//
//
// Store topology:
//
// root (BaseStore) ---next--- main (MetaStore)
// |
// +-- System/... (BaseStore)
//
// Alternative store topology:
//
// root (BaseStore) ---next--- main (MetaStore)
// System/... (static)
//
//
var store =
module.store =
//BaseStore.nest()
// XXX clone...
{ __proto__: basestore.BaseStore }
.nest({ __proto__: basestore.MetaStore })
// XXX note sure how to organize the system actions -- there can be two
// options:
// - a root ram store with all the static stuff and nest the rest
// - a nested store (as is the case here)
// XXX nested system store...
store.update('System',
Object.create(basestore.BaseStore).load(page.System))
// NOTE: in general the root wiki api is simply a page instance.
// XXX not yet sure how to organize the actual client -- UI, hooks, .. etc
var pwiki =
module.pwiki =
page.Page('/', '/', store)
//---------------------------------------------------------------------
// comandline...
if(typeof(__filename) != 'undefined'
&& __filename == (require.main || {}).filename){
}
/**********************************************************************
* vim:set ts=4 sw=4 nowrap : */ return module })