* Access current element in xmlsetsetup via xml.expressions
@ 2019-10-01 19:24 achim
2019-10-02 8:18 ` Taco Hoekwater
0 siblings, 1 reply; 5+ messages in thread
From: achim @ 2019-10-01 19:24 UTC (permalink / raw)
To: ntg-context
[-- Attachment #1.1: Type: text/plain, Size: 1464 bytes --]
Hello,
I'm trying to build an xmlsetsetup with an own lua function. XML in MKIV
says on pg. 33:
You can also use normal Lua functions as long as you make sure that you pass
the right arguments.
There are a few predefined variables available inside such functions.
list table the list of matches
l number the current index in the list of matches
ll element the current element that matched
order number the position of the root of the path
But I can't figure out how to get access to list, ll etc.
My MWE (only for testing the access, is always true):
\startbuffer[text]
<para>Dies ist <inline style="sup">ein</inline> xxx<inline
style="sub">zwei</inline> noch ein <inline style="sup">sup</inline>
Test<inline style="sub">sub</inline></para>
\stopbuffer
%\enabletrackers[xml.parse,xml.path]
\startluacode
function xml.expressions.nextnodeatt(e)
inspect(e)
inspect(ll)
return('sub')
end
\stopluacode
\startxmlsetups xml:textsetups
\xmlsetsetup{#1}{*}{+}
\xmlsetsetup{#1}{para}{xml:*}
\xmlsetsetup{#1}{inline[@style='sup'][xml.expressions.nextnodeatt(ll)=='sub'
]}{xml:sub}
\stopxmlsetups
\xmlregistersetup{xml:textsetups}
\startxmlsetups xml:para
\xmlflush{#1}\par
\stopxmlsetups
\startxmlsetups xml:sub
\color[red]{\xmlflush{#1}}
\stopxmlsetups
\starttext
\xmlprocessbuffer{main}{text}{}
\stoptext
Thanks in advance,
Achim
[-- Attachment #1.2: Type: text/html, Size: 6553 bytes --]
[-- Attachment #2: Type: text/plain, Size: 493 bytes --]
___________________________________________________________________________________
If your question is of interest to others as well, please add an entry to the Wiki!
maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context
webpage : http://www.pragma-ade.nl / http://context.aanhet.net
archive : https://bitbucket.org/phg/context-mirror/commits/
wiki : http://contextgarden.net
___________________________________________________________________________________
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: Access current element in xmlsetsetup via xml.expressions
2019-10-01 19:24 Access current element in xmlsetsetup via xml.expressions achim
@ 2019-10-02 8:18 ` Taco Hoekwater
2019-10-02 10:32 ` mf
0 siblings, 1 reply; 5+ messages in thread
From: Taco Hoekwater @ 2019-10-02 8:18 UTC (permalink / raw)
To: mailing list for ConTeXt users
> On 1 Oct 2019, at 21:24, achim@jander.de wrote:
>
> Hello,
> I’m trying to build an xmlsetsetup with an own lua function. XML in MKIV says on pg. 33:
> You can also use normal Lua functions as long as you make sure that you pass the right arguments.
> There are a few predefined variables available inside such functions.
> list table the list of matches
> l number the current index in the list of matches
> ll element the current element that matched
> order number the position of the root of the path
>
> But I can’t figure out how to get access to list, ll etc.
Neither can I :(
Taco
> My MWE (only for testing the access, is always true):
>
> \startbuffer[text]
> <para>Dies ist <inline style="sup">ein</inline> xxx<inline style="sub">zwei</inline> noch ein <inline style="sup">sup</inline> Test<inline style="sub">sub</inline></para>
> \stopbuffer
> %\enabletrackers[xml.parse,xml.path]
>
> \startluacode
> function xml.expressions.nextnodeatt(e)
> inspect(e)
> inspect(ll)
> return('sub')
> end
> \stopluacode
>
> \startxmlsetups xml:textsetups
> \xmlsetsetup{#1}{*}{+}
> \xmlsetsetup{#1}{para}{xml:*}
> \xmlsetsetup{#1}{inline[@style='sup'][xml.expressions.nextnodeatt(ll)=='sub']}{xml:sub}
> \stopxmlsetups
>
> \xmlregistersetup{xml:textsetups}
>
> \startxmlsetups xml:para
> \xmlflush{#1}\par
> \stopxmlsetups
>
> \startxmlsetups xml:sub
> \color[red]{\xmlflush{#1}}
> \stopxmlsetups
>
>
> \starttext
> \xmlprocessbuffer{main}{text}{}
> \stoptext
>
> Thanks in advance,
> Achim
> ___________________________________________________________________________________
> If your question is of interest to others as well, please add an entry to the Wiki!
>
> maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context
> webpage : http://www.pragma-ade.nl / http://context.aanhet.net
> archive : https://bitbucket.org/phg/context-mirror/commits/
> wiki : http://contextgarden.net
> ___________________________________________________________________________________
Taco Hoekwater
Elvenkind BV
___________________________________________________________________________________
If your question is of interest to others as well, please add an entry to the Wiki!
maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context
webpage : http://www.pragma-ade.nl / http://context.aanhet.net
archive : https://bitbucket.org/phg/context-mirror/commits/
wiki : http://contextgarden.net
___________________________________________________________________________________
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: Access current element in xmlsetsetup via xml.expressions
2019-10-02 8:18 ` Taco Hoekwater
@ 2019-10-02 10:32 ` mf
2019-10-02 16:52 ` Hans Hagen
0 siblings, 1 reply; 5+ messages in thread
From: mf @ 2019-10-02 10:32 UTC (permalink / raw)
To: ntg-context
The answer is in lxml-lpt.lua, where built-in expressions are defined.
You need a good knowledge of LPEG that i miss.
Some built-in expressions get the current element as first argument,
like count() or child() (lines 1300-1307 of lxml-lpt.lua):
expressions.child = function(e,pattern)
return applylpath(e,pattern) -- todo: cache
end
expressions.count = function(e,pattern) -- what if pattern == empty or nil
local collected = applylpath(e,pattern) -- todo: cache
return pattern and (collected and #collected) or 0
end
Some other expressions use a template that passes the "list", "ll", "l"
and "order" arguments you find cited in the XML manual §4.1 "Path
expressions - Expressions and filters".
These are the lines 738-743 in lxml-lpt.lua:
local template_e = [[
local expr = xml.expressions
return function(list,ll,l,order)
return %s
end
]]
That template is used by the function that registers a new expression
(lines 807-812 in lxml-lpt.lua):
local function register_expression(expression)
local converted = lpegmatch(converter,expression)
local runner = load(format(template_e,converted))
runner = (runner and runner()) or function()
errorrunner_e(expression,converted) end
return { kind = "expression", expression = expression, converted =
converted, evaluator = runner }
end
Anyway i could not find a way to define an expression with a function
like this:
xml.expressions.myexpr( ... )
that gets access to those arguments.
The only arguments it gets are the ones you specify in your LPATH
expressions; AFAIK they are attributes values -- with the @attr syntax
-- and strings.
Best wishes,
Massi
___________________________________________________________________________________
If your question is of interest to others as well, please add an entry to the Wiki!
maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context
webpage : http://www.pragma-ade.nl / http://context.aanhet.net
archive : https://bitbucket.org/phg/context-mirror/commits/
wiki : http://contextgarden.net
___________________________________________________________________________________
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: Access current element in xmlsetsetup via xml.expressions
2019-10-02 10:32 ` mf
@ 2019-10-02 16:52 ` Hans Hagen
2019-10-02 17:48 ` achim
0 siblings, 1 reply; 5+ messages in thread
From: Hans Hagen @ 2019-10-02 16:52 UTC (permalink / raw)
To: mailing list for ConTeXt users, mf
On 10/2/2019 12:32 PM, mf wrote:
> The answer is in lxml-lpt.lua, where built-in expressions are defined.
> You need a good knowledge of LPEG that i miss.
>
> Some built-in expressions get the current element as first argument,
> like count() or child() (lines 1300-1307 of lxml-lpt.lua):
>
> expressions.child = function(e,pattern)
> return applylpath(e,pattern) -- todo: cache
> end
>
> expressions.count = function(e,pattern) -- what if pattern == empty or nil
> local collected = applylpath(e,pattern) -- todo: cache
> return pattern and (collected and #collected) or 0
> end
>
> Some other expressions use a template that passes the "list", "ll", "l"
> and "order" arguments you find cited in the XML manual §4.1 "Path
> expressions - Expressions and filters".
> These are the lines 738-743 in lxml-lpt.lua:
>
> local template_e = [[
> local expr = xml.expressions
> return function(list,ll,l,order)
> return %s
> end
> ]]
>
> That template is used by the function that registers a new expression
> (lines 807-812 in lxml-lpt.lua):
>
> local function register_expression(expression)
> local converted = lpegmatch(converter,expression)
> local runner = load(format(template_e,converted))
> runner = (runner and runner()) or function()
> errorrunner_e(expression,converted) end
> return { kind = "expression", expression = expression, converted =
> converted, evaluator = runner }
> end
>
> Anyway i could not find a way to define an expression with a function
> like this:
>
> xml.expressions.myexpr( ... )
>
> that gets access to those arguments.
>
> The only arguments it gets are the ones you specify in your LPATH
> expressions; AFAIK they are attributes values -- with the @attr syntax
> -- and strings.
Live is complex isn't it? The problem, is that we also support the
normal path expressions which in retrospect maybe was a bad idea ...
better be explicit. Strings without quotes are actually intercepted as
element references (just like the @ is).
So, I added a few extra accessors:
\startbuffer[text]
<para>
A <inline style="sup">sup 1</inline>
B <inline style="sub">sub 1</inline>
C <inline style="sup">sup 2</inline>
D <inline style="sub">sub 2</inline>
E <inline style="sup">sup 3</inline>
F <inline style="sup">sup 4</inline>
G <inline style="sup">sup 5</inline>
H <inline style="sub">sub 5</inline>
I <inline style="sup">sup 6</inline>
</para>
\stopbuffer
\startluacode
function xml.expressions.MyCheck(list,position,what)
-- print("list", list)
-- print("position",position)
-- print("what", what)
local n = list[position+1]
return n and n.at.style == what
end
\stopluacode
\enabletrackers[lxml.*]
\startxmlsetups xml:textsetups
\xmlsetsetup{#1}{para|inline}{xml:*}
% with a helper:
% \xmlsetsetup{#1}{inline[@style='sup' and
MyCheck(list(),position(),"sub")]}{xml:supsub}
% \xmlsetsetup{#1}{inline[@style='sup' and
MyCheck(list(),position(),"sup")]}{xml:supsup}
% rather verbose, we *need* to use ['at'] and not .at
% \xmlsetsetup{#1}{inline[@style='sup' and (position() < last() and
list()[position()+1]['at']['style']=='sub')]}{xml:supsub}
% \xmlsetsetup{#1}{inline[@style='sup' and (position() < last() and
list()[position()+1]['at']['style']=='sup')]}{xml:supsup}
% also ok
% \xmlsetsetup{#1}{inline[@style='sup' and (position() < last() and
attribute(list()[position()+1],'style')=='sub')]}{xml:supsub}
% \xmlsetsetup{#1}{inline[@style='sup' and (position() < last() and
attribute(list()[position()+1],'style')=='sup')]}{xml:supsup}
% direct checking
% \xmlsetsetup{#1}{inline[@style='sup' and (position() < last() and
attribute(list()[position()+1],'style','sub'))]}{xml:supsub}
% \xmlsetsetup{#1}{inline[@style='sup' and (position() < last() and
attribute(list()[position()+1],'style','sup'))]}{xml:supsup}
% shorter
\xmlsetsetup{#1}{inline[@style='sup' and
(attribute(list()[position()+1],'style','sub'))]}{xml:supsub}
\xmlsetsetup{#1}{inline[@style='sup' and
(attribute(list()[position()+1],'style','sup'))]}{xml:supsup}
\stopxmlsetups
\xmlregistersetup{xml:textsetups}
\startxmlsetups xml:para
\xmlflush{#1}\par
\stopxmlsetups
\startxmlsetups xml:supsub
\color[red]{\xmlflush{#1}}
\stopxmlsetups
\startxmlsetups xml:supsup
\color[blue]{\xmlflush{#1}}
\stopxmlsetups
\startxmlsetups xml:inline
\color[green]{\xmlflush{#1}}
\stopxmlsetups
\starttext
\xmlprocessbuffer{main}{text}{}
\stoptext
In the next beta. Now, who is going to wikify this ...
Hans
-----------------------------------------------------------------
Hans Hagen | PRAGMA ADE
Ridderstraat 27 | 8061 GH Hasselt | The Netherlands
tel: 038 477 53 69 | www.pragma-ade.nl | www.pragma-pod.nl
-----------------------------------------------------------------
___________________________________________________________________________________
If your question is of interest to others as well, please add an entry to the Wiki!
maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context
webpage : http://www.pragma-ade.nl / http://context.aanhet.net
archive : https://bitbucket.org/phg/context-mirror/commits/
wiki : http://contextgarden.net
___________________________________________________________________________________
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: Access current element in xmlsetsetup via xml.expressions
2019-10-02 16:52 ` Hans Hagen
@ 2019-10-02 17:48 ` achim
0 siblings, 0 replies; 5+ messages in thread
From: achim @ 2019-10-02 17:48 UTC (permalink / raw)
To: 'mailing list for ConTeXt users'
Dear Hans,
that is really great. Thank's a lot. Ill check the next beta and try to wikifiy (maybe I need further help for that)
Achim
-----Ursprüngliche Nachricht-----
Von: ntg-context <ntg-context-bounces@ntg.nl> Im Auftrag von Hans Hagen
Gesendet: Mittwoch, 2. Oktober 2019 18:53
An: mailing list for ConTeXt users <ntg-context@ntg.nl>; mf <massifr@fastwebnet.it>
Betreff: Re: [NTG-context] Access current element in xmlsetsetup via xml.expressions
On 10/2/2019 12:32 PM, mf wrote:
> The answer is in lxml-lpt.lua, where built-in expressions are defined.
> You need a good knowledge of LPEG that i miss.
>
> Some built-in expressions get the current element as first argument,
> like count() or child() (lines 1300-1307 of lxml-lpt.lua):
>
> expressions.child = function(e,pattern)
> return applylpath(e,pattern) -- todo: cache end
>
> expressions.count = function(e,pattern) -- what if pattern == empty or
> nil
> local collected = applylpath(e,pattern) -- todo: cache
> return pattern and (collected and #collected) or 0 end
>
> Some other expressions use a template that passes the "list", "ll", "l"
> and "order" arguments you find cited in the XML manual §4.1 "Path
> expressions - Expressions and filters".
> These are the lines 738-743 in lxml-lpt.lua:
>
> local template_e = [[
> local expr = xml.expressions
> return function(list,ll,l,order)
> return %s
> end
> ]]
>
> That template is used by the function that registers a new expression
> (lines 807-812 in lxml-lpt.lua):
>
> local function register_expression(expression)
> local converted = lpegmatch(converter,expression)
> local runner = load(format(template_e,converted))
> runner = (runner and runner()) or function()
> errorrunner_e(expression,converted) end
> return { kind = "expression", expression = expression, converted
> = converted, evaluator = runner } end
>
> Anyway i could not find a way to define an expression with a function
> like this:
>
> xml.expressions.myexpr( ... )
>
> that gets access to those arguments.
>
> The only arguments it gets are the ones you specify in your LPATH
> expressions; AFAIK they are attributes values -- with the @attr syntax
> -- and strings.
Live is complex isn't it? The problem, is that we also support the normal path expressions which in retrospect maybe was a bad idea ...
better be explicit. Strings without quotes are actually intercepted as element references (just like the @ is).
So, I added a few extra accessors:
\startbuffer[text]
<para>
A <inline style="sup">sup 1</inline>
B <inline style="sub">sub 1</inline>
C <inline style="sup">sup 2</inline>
D <inline style="sub">sub 2</inline>
E <inline style="sup">sup 3</inline>
F <inline style="sup">sup 4</inline>
G <inline style="sup">sup 5</inline>
H <inline style="sub">sub 5</inline>
I <inline style="sup">sup 6</inline> </para> \stopbuffer
\startluacode
function xml.expressions.MyCheck(list,position,what)
-- print("list", list)
-- print("position",position)
-- print("what", what)
local n = list[position+1]
return n and n.at.style == what
end
\stopluacode
\enabletrackers[lxml.*]
\startxmlsetups xml:textsetups
\xmlsetsetup{#1}{para|inline}{xml:*}
% with a helper:
% \xmlsetsetup{#1}{inline[@style='sup' and
MyCheck(list(),position(),"sub")]}{xml:supsub}
% \xmlsetsetup{#1}{inline[@style='sup' and
MyCheck(list(),position(),"sup")]}{xml:supsup}
% rather verbose, we *need* to use ['at'] and not .at
% \xmlsetsetup{#1}{inline[@style='sup' and (position() < last() and
list()[position()+1]['at']['style']=='sub')]}{xml:supsub}
% \xmlsetsetup{#1}{inline[@style='sup' and (position() < last() and
list()[position()+1]['at']['style']=='sup')]}{xml:supsup}
% also ok
% \xmlsetsetup{#1}{inline[@style='sup' and (position() < last() and
attribute(list()[position()+1],'style')=='sub')]}{xml:supsub}
% \xmlsetsetup{#1}{inline[@style='sup' and (position() < last() and
attribute(list()[position()+1],'style')=='sup')]}{xml:supsup}
% direct checking
% \xmlsetsetup{#1}{inline[@style='sup' and (position() < last() and
attribute(list()[position()+1],'style','sub'))]}{xml:supsub}
% \xmlsetsetup{#1}{inline[@style='sup' and (position() < last() and
attribute(list()[position()+1],'style','sup'))]}{xml:supsup}
% shorter
\xmlsetsetup{#1}{inline[@style='sup' and (attribute(list()[position()+1],'style','sub'))]}{xml:supsub}
\xmlsetsetup{#1}{inline[@style='sup' and (attribute(list()[position()+1],'style','sup'))]}{xml:supsup}
\stopxmlsetups
\xmlregistersetup{xml:textsetups}
\startxmlsetups xml:para
\xmlflush{#1}\par
\stopxmlsetups
\startxmlsetups xml:supsub
\color[red]{\xmlflush{#1}}
\stopxmlsetups
\startxmlsetups xml:supsup
\color[blue]{\xmlflush{#1}}
\stopxmlsetups
\startxmlsetups xml:inline
\color[green]{\xmlflush{#1}}
\stopxmlsetups
\starttext
\xmlprocessbuffer{main}{text}{}
\stoptext
In the next beta. Now, who is going to wikify this ...
Hans
-----------------------------------------------------------------
Hans Hagen | PRAGMA ADE
Ridderstraat 27 | 8061 GH Hasselt | The Netherlands
tel: 038 477 53 69 | www.pragma-ade.nl | www.pragma-pod.nl
-----------------------------------------------------------------
___________________________________________________________________________________
If your question is of interest to others as well, please add an entry to the Wiki!
maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context
webpage : http://www.pragma-ade.nl / http://context.aanhet.net archive : https://bitbucket.org/phg/context-mirror/commits/
wiki : http://contextgarden.net
___________________________________________________________________________________
___________________________________________________________________________________
If your question is of interest to others as well, please add an entry to the Wiki!
maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context
webpage : http://www.pragma-ade.nl / http://context.aanhet.net
archive : https://bitbucket.org/phg/context-mirror/commits/
wiki : http://contextgarden.net
___________________________________________________________________________________
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2019-10-02 17:48 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-10-01 19:24 Access current element in xmlsetsetup via xml.expressions achim
2019-10-02 8:18 ` Taco Hoekwater
2019-10-02 10:32 ` mf
2019-10-02 16:52 ` Hans Hagen
2019-10-02 17:48 ` achim
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).