mirror of
https://github.com/flynx/pWiki.git
synced 2025-11-01 03:20:08 +00:00
now @quote(..) handles actions without triggering them by deafult + fixes and notes...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
parent
b638f85732
commit
d13cdef574
117
pwiki/page.js
117
pwiki/page.js
@ -192,6 +192,13 @@ object.Constructor('BasePage', {
|
||||
set metadata(value){
|
||||
this.__update__(value) },
|
||||
|
||||
get type(){ return async function(){
|
||||
return this.store.isStore(this.path) ?
|
||||
'store'
|
||||
: typeof(await this.data) == 'function' ?
|
||||
'action'
|
||||
: 'page' }.bind(this)() },
|
||||
|
||||
// number of matching pages...
|
||||
// NOTE: this can be both sync and async...
|
||||
get length(){
|
||||
@ -521,6 +528,8 @@ object.Constructor('Page', BasePage, {
|
||||
|
||||
NOT_FOUND_TEMPLATE_ERROR: 'NotFoundTemplateError',
|
||||
|
||||
QUOTE_ACTION_PAGE: 'QuoteActionPage',
|
||||
|
||||
// XXX DEPENDS to be used for cache invalidation...
|
||||
// Format:
|
||||
// {
|
||||
@ -793,7 +802,7 @@ object.Constructor('Page', BasePage, {
|
||||
//
|
||||
// XXX need a way to escape macros -- i.e. include </quote> in a quoted text...
|
||||
quote: Macro(
|
||||
['src', 'filter', 'text', 'join'],
|
||||
['src', 'filter', 'text', 'join', ['expandactions']],
|
||||
async function*(args, body, state){
|
||||
var src = args.src //|| args[0]
|
||||
var base = this.get(this.path.split(/\*/).shift())
|
||||
@ -804,6 +813,7 @@ object.Constructor('Page', BasePage, {
|
||||
src = src ?
|
||||
await base.parse(src, state)
|
||||
: src
|
||||
var expandactions = args.expandactions
|
||||
|
||||
// XXX DEPENDS
|
||||
var depends = state.depends =
|
||||
@ -811,7 +821,10 @@ object.Constructor('Page', BasePage, {
|
||||
?? new Set()
|
||||
|
||||
var pages = src ?
|
||||
this.get(src).asPages()
|
||||
(!expandactions
|
||||
&& await this.get(src).type == 'action' ?
|
||||
base.get(this.QUOTE_ACTION_PAGE)
|
||||
: this.get(src).asPages())
|
||||
: text instanceof Array ?
|
||||
[text.join('')]
|
||||
: typeof(text) == 'string' ?
|
||||
@ -830,8 +843,13 @@ object.Constructor('Page', BasePage, {
|
||||
first = false
|
||||
|
||||
text = typeof(page) == 'string' ?
|
||||
page
|
||||
page
|
||||
: (!expandactions
|
||||
&& await page.type == 'action') ?
|
||||
base.get(this.QUOTE_ACTION_PAGE).raw
|
||||
: await page.raw
|
||||
|
||||
|
||||
// XXX DEPENDS...
|
||||
page.path
|
||||
&& depends.add(page.path)
|
||||
@ -1157,15 +1175,39 @@ object.Constructor('Page', BasePage, {
|
||||
|
||||
// iterate matches or content list as pages...
|
||||
//
|
||||
// .asPages()
|
||||
// .asPages(<path>[, <options>])
|
||||
// .asPages(<strict>[, <options>])
|
||||
// .asPages(<path>, <strict>[, <options>])
|
||||
// .asPages(<options>)
|
||||
// -> <iter>
|
||||
//
|
||||
// NOTE: this will get .raw for non-pattern pages this it can trigger
|
||||
// actions...
|
||||
//
|
||||
// XXX revise name...
|
||||
asPages: async function*(path='.', strict=false){
|
||||
if(path === true
|
||||
|| path === false){
|
||||
strict = path
|
||||
path = '.' }
|
||||
asPages: async function*(path='.', strict=false, noexpandactions=false){
|
||||
// options...
|
||||
var args = [...arguments]
|
||||
var opts = typeof(args.at(-1)) == 'object' ?
|
||||
args.pop()
|
||||
: {}
|
||||
var {path, strict, noexpandactions} = {
|
||||
...opts,
|
||||
path: typeof(args[0]) == 'string' ?
|
||||
args.shift()
|
||||
: '.',
|
||||
strict: args.shift() ?? false,
|
||||
}
|
||||
|
||||
var page = this.get(path, strict)
|
||||
// handle lists in pages (actions, ... etc.)...
|
||||
if(!page.isPattern){
|
||||
if(noexpandactions
|
||||
&& await page.type == 'action'){
|
||||
//yield this.get(this.QUOTE_ACTION_PAGE)
|
||||
yield page
|
||||
return }
|
||||
var raw = await page.raw
|
||||
if(raw == null){
|
||||
return }
|
||||
@ -1417,18 +1459,27 @@ module.System = {
|
||||
@source(../path)
|
||||
</slot>
|
||||
<macro src="../*" join="@source(line-separator)">
|
||||
<a href="#@source(./path)/list">↳</a>
|
||||
<a href="#@source(./path)">@source(./name)</a>
|
||||
<a href="#@source(./path)/list">@source(./name)</a>
|
||||
<i>
|
||||
<macro src="./isAction">
|
||||
a
|
||||
<else>
|
||||
<macro src="./isStore">s</macro>
|
||||
</else>
|
||||
</macro>
|
||||
</i>
|
||||
<a href="#@source(./path)/delete">×</a>
|
||||
</macro>` },
|
||||
// XXX this is really slow...
|
||||
tree: {
|
||||
text: object.doc`
|
||||
<macro src="../*">
|
||||
<div>
|
||||
<div class="item">
|
||||
<a href="#@source(./path)">@source(./name)</a>
|
||||
<macro src="./isAction">*</macro>
|
||||
<a href="#@source(./path)/delete">×</a>
|
||||
<span class="show-on-hover">
|
||||
<a href="#@source(./path)/info">🛈</a>
|
||||
<a href="#@source(./path)/delete">×</a>
|
||||
</span>
|
||||
<div style="padding-left: 30px">
|
||||
@source(./tree)
|
||||
</div>
|
||||
@ -1438,12 +1489,20 @@ module.System = {
|
||||
text: `@include(../**/path join="@source(line-separator)")`},
|
||||
info: {
|
||||
text: object.doc`
|
||||
Path: @source(../path)<br>
|
||||
Resolved path: @source(../resolved)<br>
|
||||
Referrer: @source(../referrer)<br>
|
||||
Renderer: @source(../renderer)<br>
|
||||
Path: @source(../path)
|
||||
(<a href="#@source(../path)/edit">edit</a>)<br>
|
||||
Resolved path: @source(../resolved)
|
||||
(<a href="#@source(../resolved)/edit">edit</a>)<br>
|
||||
Referrer: @source(../referrer)
|
||||
(<a href="#@source(../referrer)/edit">edit</a>)<br>
|
||||
Renderer: @source(../renderer)
|
||||
(<a href="#@source(../renderer)/edit">edit</a>)<br>
|
||||
|
||||
type: @source(../type)<br>
|
||||
|
||||
ctime: @source(../ctime)<br>
|
||||
mtime: @source(../mtime)<br>
|
||||
|
||||
<hr>
|
||||
<pre wikiwords="no"><quote filter="quote-tags" src=".."/></pre> ` },
|
||||
|
||||
@ -1472,6 +1531,8 @@ module.System = {
|
||||
<slot name="content"></slot>
|
||||
<hr>
|
||||
<slot name="footer"></slot> ` },
|
||||
QuoteActionPage: {
|
||||
text: '[ native code ]' },
|
||||
|
||||
|
||||
// page actions...
|
||||
@ -1498,19 +1559,20 @@ module.System = {
|
||||
return p.title
|
||||
?? p.name },
|
||||
ctime: async function(){
|
||||
return (await this.get('..').data).ctime ?? '' },
|
||||
return (await this.get('..').data).ctime },
|
||||
mtime: async function(){
|
||||
return (await this.get('..').data).mtime ?? '' },
|
||||
return (await this.get('..').data).mtime },
|
||||
|
||||
// XXX EXPERIMENTAL...
|
||||
type: async function(){
|
||||
// XXX also check if a page is a store...
|
||||
return typeof(await this.get('..').data) == 'function' ?
|
||||
'action'
|
||||
: 'page' },
|
||||
return await this.get('..').type },
|
||||
isAction: async function(){
|
||||
return typeof(await this.get('..').data) == 'function' ?
|
||||
['action']
|
||||
return await this.get('..').type == 'action' ?
|
||||
'action'
|
||||
: undefined },
|
||||
isStore: async function(){
|
||||
return await this.get('..').type == 'store' ?
|
||||
'store'
|
||||
: undefined },
|
||||
|
||||
|
||||
@ -1534,6 +1596,8 @@ module.System = {
|
||||
delete: function(){
|
||||
var target = this.get('..')
|
||||
|
||||
console.log('DELETE:', target.path)
|
||||
|
||||
target.delete()
|
||||
|
||||
// redirect...
|
||||
@ -1542,7 +1606,7 @@ module.System = {
|
||||
// show info about the delete operation...
|
||||
return target.get('DeletingPage').text },
|
||||
|
||||
// XXX EXPERIMENTAL
|
||||
/*/ XXX EXPERIMENTAL
|
||||
// move page one level up...
|
||||
moveUp: function(){
|
||||
var target = this.get('..')
|
||||
@ -1587,6 +1651,7 @@ module.System = {
|
||||
this.render_root
|
||||
&& (this.render_root.location = to)
|
||||
return '' },
|
||||
//*/
|
||||
|
||||
//
|
||||
test_path: function(){
|
||||
|
||||
@ -457,12 +457,14 @@ module.MetaStore = {
|
||||
return object.childOf(value, BaseStore) })
|
||||
.map(function([path, _]){
|
||||
return path })) },
|
||||
// XXX do we need to account for trailing '/' here???
|
||||
substore: function(path){
|
||||
path = pwpath.normalize(path, 'string')
|
||||
if(this.substores.includes(path)){
|
||||
return path }
|
||||
var root = path[0] == '/'
|
||||
var store = this.substores
|
||||
// normalize store paths to the given path...
|
||||
.filter(function(p){
|
||||
return path.startsWith(
|
||||
root ?
|
||||
@ -477,6 +479,14 @@ module.MetaStore = {
|
||||
: store },
|
||||
getstore: function(path){
|
||||
return this.data[this.substore(path)] },
|
||||
// XXX do we need to account for trailing '/' here???
|
||||
isStore: function(path){
|
||||
path = pwpath.normalize(path, 'string')
|
||||
path = path[0] == '/' ?
|
||||
path.slice(1)
|
||||
: path
|
||||
return this.substores.includes(path)
|
||||
|| this.substores.includes('/'+ path) },
|
||||
|
||||
// XXX this depends on .data having keys...
|
||||
__paths__: async function(){
|
||||
|
||||
11
pwiki2.html
11
pwiki2.html
@ -25,6 +25,17 @@
|
||||
</head>
|
||||
|
||||
<style>
|
||||
|
||||
.show-on-hover {
|
||||
opacity: 0;
|
||||
}
|
||||
:hover>.show-on-hover {
|
||||
opacity: 0.4;
|
||||
}
|
||||
.show-on-hover:hover {
|
||||
opacity: 0.8;
|
||||
}
|
||||
|
||||
</style>
|
||||
|
||||
<!-- XXX do we need this??? -->
|
||||
|
||||
@ -1,8 +1,8 @@
|
||||
/**********************************************************************
|
||||
*
|
||||
*
|
||||
* XXX need a uniform way to track state in pwiki for things like paging
|
||||
* and the like with simple user/macro access...
|
||||
* XXX need a uniform way to track some state in links in pwiki for things
|
||||
* like paging and the like with simple user/macro access (???)...
|
||||
* ...the simplest that comes to mind is to store in in path
|
||||
* somehow:
|
||||
* - <path>?<arg>=<value>&...
|
||||
@ -10,12 +10,12 @@
|
||||
* - <path>/<arg>:<valu>/<arg>:<value>/.../<action>
|
||||
* stack-style arguments...
|
||||
* + simple to implement
|
||||
* - goes thrugh page search???
|
||||
* - goes through page search???
|
||||
* - <path>:<value>:<name>=<value>:...
|
||||
* - ...
|
||||
* the general idea is to be:
|
||||
* - flexible enough to allow the basics done
|
||||
* - restrictive enough to prevent missuse
|
||||
* - restrictive enough to prevent misuse
|
||||
* ...the rest of the state can simply be stored in the root pwiki
|
||||
* object in one of the following ways:
|
||||
* - directly (attrs/dict)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user