mirror of
https://github.com/flynx/pWiki.git
synced 2025-10-28 17:40:07 +00:00
190 lines
4.0 KiB
HTML
Executable File
190 lines
4.0 KiB
HTML
Executable File
<!DOCTYPE html>
|
|
<html>
|
|
<head>
|
|
<title>pWiki</title>
|
|
</head>
|
|
<style>
|
|
</style>
|
|
|
|
<script src="ext-lib/jquery.js"></script>
|
|
<script src="ext-lib/pouchdb.min.js"></script>
|
|
<script src="wiki.js"></script>
|
|
|
|
<script>
|
|
|
|
var clear = () => {
|
|
delete localStorage['wiki-data']
|
|
delete localStorage['wiki-location']
|
|
}
|
|
|
|
|
|
|
|
var reload = () => {
|
|
$('.path').text('/' + Wiki.path)
|
|
|
|
$('.title').text(Wiki.title)
|
|
|
|
// process text...
|
|
var text = Wiki.text
|
|
var editing = $('.text').prop('contenteditable') != 'true'
|
|
var filters = []
|
|
var slots = {}
|
|
|
|
// expand macros...
|
|
if(editing){
|
|
text = text
|
|
// Syntax:
|
|
// @<macro>( <args> )
|
|
.replace(/@([a-zA-Z-_]+)\(([^)]*)\)/g, function(_, macro, args){
|
|
args = $('<div>')
|
|
.html(args)
|
|
.text()
|
|
.trim()
|
|
.split(/\s+/g)
|
|
|
|
//console.log('>>>>>', macro, args)
|
|
|
|
if(macro == 'filter' && args.length == 1){
|
|
filters.push(args[0])
|
|
return ''
|
|
}
|
|
|
|
if(macro == 'include' && args.length == 1){
|
|
w = Object.create(Wiki)
|
|
w.location = args[0]
|
|
return w.text
|
|
}
|
|
|
|
if(macro == 'attr'
|
|
&& args.length == 1
|
|
&& ['title', 'path', 'location', 'dir'].indexOf(args[0]) >= 0){
|
|
return Wiki[args[0]]
|
|
}
|
|
|
|
return _
|
|
})
|
|
// html-like macro syntax...
|
|
.replace(/\<[a-zA-Z-_:]+.*?\/?\>/g, function(t){
|
|
var elem = $($('<div>').html(t).text())
|
|
var macro = elem.prop('tagName').toLowerCase()
|
|
|
|
var args = {}
|
|
var a = elem.prop('attributes')
|
|
|
|
for(var i=0; i<a.length; i++){
|
|
args[a[i].name] = a[i].value
|
|
}
|
|
|
|
//console.log('>>>>>', macro, args)
|
|
|
|
if(macro == 'filter' && args.name != null){
|
|
console.log('FILTER:', args.name)
|
|
// XXX
|
|
return ''
|
|
}
|
|
|
|
if(macro == 'include' && args.src != null){
|
|
w = Object.create(Wiki)
|
|
w.location = args.src
|
|
return w.text
|
|
}
|
|
|
|
// XXX need content...
|
|
// Procedure:
|
|
// - if new slot
|
|
// - add to list
|
|
// - fill
|
|
// - if slot exists
|
|
// - fill original
|
|
if(macro == 'slot' && args.name != null){
|
|
slots[args.name] = ''
|
|
return t
|
|
}
|
|
|
|
if(macro == 'attr'
|
|
&& args.name != null
|
|
&& ['title', 'path', 'location', 'dir'].indexOf(args.name) >= 0){
|
|
return Wiki[args.name]
|
|
}
|
|
|
|
return t
|
|
})
|
|
}
|
|
|
|
$('.text').html(setWikiWords(text, filters.indexOf('show_link_brackets') < 0 && editing))
|
|
|
|
// XXX save...
|
|
localStorage['wiki-data'] = JSON.stringify(Wiki.__wiki_data)
|
|
localStorage['wiki-location'] = Wiki.location
|
|
|
|
$('title').text(Wiki.location)
|
|
}
|
|
|
|
var go = (path) => {
|
|
history.pushState({
|
|
wikipath: path
|
|
},
|
|
Wiki.title,
|
|
window.location)
|
|
|
|
Wiki.location = path
|
|
reload()
|
|
}
|
|
|
|
$(() => {
|
|
$(window).on('popstate', function(evt){
|
|
event.state
|
|
&& event.state.wikipath
|
|
&& go(event.state.wikipath)
|
|
})
|
|
|
|
// load stored data...
|
|
Wiki.__wiki_data = localStorage['wiki-data'] ?
|
|
JSON.parse(localStorage['wiki-data'])
|
|
: data
|
|
Wiki.__wiki_data.__proto__ = data
|
|
|
|
Wiki.location = localStorage['wiki-location'] || Wiki.location
|
|
|
|
|
|
reload()
|
|
|
|
// XXX make this update on enter...
|
|
$('.title')
|
|
.on('blur', () => {
|
|
Wiki.title = $('.title').text()
|
|
reload()
|
|
})
|
|
|
|
// live update text...
|
|
// XXX is this the right way to go for large documents???
|
|
$('.text')
|
|
.focus(() => {
|
|
$('.text').prop('contenteditable', $('.text').prop('contenteditable') != 'true')
|
|
reload()
|
|
})
|
|
.on('keyup', () => {
|
|
if($('.text').prop('contenteditable') == 'true'){
|
|
Wiki.raw = clearWikiWords($('.text').clone()).html()
|
|
}
|
|
})
|
|
// XXX do this live, but on a timeout after user input...
|
|
// XXX need to place the cursor in the same position...
|
|
.blur(() => {
|
|
$('.text').prop('contenteditable', false)
|
|
reload()
|
|
})
|
|
})
|
|
</script>
|
|
|
|
<body>
|
|
|
|
<div class="path"></div>
|
|
<hr>
|
|
<h1 class="title" contenteditable tabindex=0></h1>
|
|
<div class="text" tabindex=0></div>
|
|
|
|
</body>
|
|
</html>
|
|
<!-- vim:set sw=4 ts=4 : -->
|