summaryrefslogtreecommitdiff
path: root/tex/context
diff options
context:
space:
mode:
authorContext Git Mirror Bot <phg42.2a@gmail.com>2016-09-04 15:04:09 +0200
committerContext Git Mirror Bot <phg42.2a@gmail.com>2016-09-04 15:04:09 +0200
commitc209ed36b6aaaa992df8976789c8ba8112f8e5c5 (patch)
tree750f886c59728842787e58441d39439819050c27 /tex/context
parent1ee48eeafd4e46712a29c91ad704b882f00d765f (diff)
downloadcontext-c209ed36b6aaaa992df8976789c8ba8112f8e5c5.tar.gz
2016-09-04 13:51:00
Diffstat (limited to 'tex/context')
-rw-r--r--tex/context/base/context-version.pdfbin4253 -> 4255 bytes
-rw-r--r--tex/context/base/mkiv/cont-new.mkiv2
-rw-r--r--tex/context/base/mkiv/context.mkiv2
-rw-r--r--tex/context/base/mkiv/math-ali.mkiv69
-rw-r--r--tex/context/base/mkiv/math-ini.mkiv4
-rw-r--r--tex/context/base/mkiv/mlib-pps.lua4
-rw-r--r--tex/context/base/mkiv/node-met.lua18
-rw-r--r--tex/context/base/mkiv/node-nut.lua18
-rw-r--r--tex/context/base/mkiv/node-ref.lua155
-rw-r--r--tex/context/base/mkiv/node-rul.lua35
-rw-r--r--tex/context/base/mkiv/node-rul.mkiv2
-rw-r--r--tex/context/base/mkiv/status-files.pdfbin9176 -> 9264 bytes
-rw-r--r--tex/context/base/mkiv/status-lua.pdfbin368144 -> 368304 bytes
-rw-r--r--tex/context/base/mkiv/strc-mat.mkiv74
-rw-r--r--tex/context/base/mkiv/util-lua.lua28
-rw-r--r--tex/context/base/mkiv/util-sql-imp-client.lua4
-rw-r--r--tex/context/base/mkiv/util-sql-imp-sqlite.lua192
-rw-r--r--tex/context/base/mkiv/util-sql-loggers.lua96
-rw-r--r--tex/context/base/mkiv/util-sql.lua20
-rw-r--r--tex/context/interface/mkiv/i-context.pdfbin774729 -> 774839 bytes
-rw-r--r--tex/context/interface/mkiv/i-readme.pdfbin60792 -> 60793 bytes
21 files changed, 386 insertions, 337 deletions
diff --git a/tex/context/base/context-version.pdf b/tex/context/base/context-version.pdf
index 488b0a574..1e57311f4 100644
--- a/tex/context/base/context-version.pdf
+++ b/tex/context/base/context-version.pdf
Binary files differ
diff --git a/tex/context/base/mkiv/cont-new.mkiv b/tex/context/base/mkiv/cont-new.mkiv
index ffeb9087c..f619cbcc4 100644
--- a/tex/context/base/mkiv/cont-new.mkiv
+++ b/tex/context/base/mkiv/cont-new.mkiv
@@ -11,7 +11,7 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-\newcontextversion{2016.09.01 21:11}
+\newcontextversion{2016.09.04 13:46}
%D This file is loaded at runtime, thereby providing an excellent place for
%D hacks, patches, extensions and new features.
diff --git a/tex/context/base/mkiv/context.mkiv b/tex/context/base/mkiv/context.mkiv
index d13f28bd4..37dc55cc6 100644
--- a/tex/context/base/mkiv/context.mkiv
+++ b/tex/context/base/mkiv/context.mkiv
@@ -39,7 +39,7 @@
%D up and the dependencies are more consistent.
\edef\contextformat {\jobname}
-\edef\contextversion{2016.09.01 21:11}
+\edef\contextversion{2016.09.04 13:46}
\edef\contextkind {beta}
%D For those who want to use this:
diff --git a/tex/context/base/mkiv/math-ali.mkiv b/tex/context/base/mkiv/math-ali.mkiv
index 404fddcc6..2456efd22 100644
--- a/tex/context/base/mkiv/math-ali.mkiv
+++ b/tex/context/base/mkiv/math-ali.mkiv
@@ -83,37 +83,6 @@
% use zeroskipplusfill
-% \def\math_prepare_r_eqalign_no
-% {\t_math_align_a{\strut\math_first_in_eqalign\hfil\math_left_of_equalign\span\math_math_in_eqalign{\alignmark\alignmark}\math_right_of_eqalign\tabskip\zeropoint}%
-% \t_math_align_b{\aligntab\math_next_in_eqalign\math_left_of_equalign\span\math_math_in_eqalign{\alignmark\alignmark}\math_right_of_eqalign\tabskip\zeropoint}%
-% \ifnum\mathraggedstatus=\plusone
-% \t_math_align_c{\hfil\aligntab\span\math_text_in_eqalign{\alignmark\alignmark}\tabskip\zeropoint}%
-% \else\ifnum\mathraggedstatus=\plusthree
-% \t_math_align_c{\hfil\tabskip\zeropoint\s!plus 1\s!fill\aligntab\span\math_text_in_eqalign{\alignmark\alignmark}\tabskip\zeropoint}%
-% \else
-% \t_math_align_c{\hfil\tabskip\centering\aligntab\llap{\span\math_text_in_eqalign{\alignmark\alignmark}}\tabskip\zeropoint}%
-% \fi\fi
-% \global\mathnumberstatus\zerocount
-% \math_build_eqalign
-% \the\mathdisplayaligntweaks
-% \tabskip\centering}
-
-% \def\math_prepare_l_eqalign_no % \checkeddisplaymath
-% {\t_math_align_a{\strut\math_first_in_eqalign\hfil\math_left_of_equalign\span\math_math_in_eqalign{\alignmark\alignmark}\math_right_of_eqalign\tabskip\zeropoint}%
-% \t_math_align_b{\aligntab\math_next_in_eqalign\math_left_of_equalign\span\math_math_in_eqalign{\alignmark\alignmark}\math_right_of_eqalign\tabskip\zeropoint}%
-% % problem: number is handled after rest and so ends up in the margin
-% \ifnum\mathraggedstatus=\plusone
-% \t_math_align_c{\hfil\aligntab\kern-\displaywidth\rlap{\span\math_text_in_eqalign{\alignmark\alignmark}}\tabskip\displaywidth}%
-% \else\ifnum\mathraggedstatus=\plusthree
-% \t_math_align_c{\hfil\tabskip\zeropoint\s!plus 1\s!fill\aligntab\kern-\displaywidth\span\math_rlap{\span\math_text_in_eqalign{\alignmark\alignmark}}\tabskip\displaywidth}%
-% \else
-% \t_math_align_c{\hfil\tabskip\centering\aligntab\kern-\displaywidth\rlap{\span\math_text_in_eqalign{\alignmark\alignmark}}\tabskip\displaywidth}%
-% \fi\fi
-% \global\mathnumberstatus\zerocount
-% \math_build_eqalign
-% \the\mathdisplayaligntweaks
-% \tabskip\centering}
-
\def\math_prepare_r_eqalign_no
{\t_math_align_a
{\strut
@@ -156,11 +125,9 @@
\tabskip\centering
\aligntab
\span
- % \rlap{\math_text_in_eqalign{\alignmark\alignmark}}%
- \math_text_in_eqalign{\alignmark\alignmark}%
+ \llap{\math_text_in_eqalign{\alignmark\alignmark}}%
\tabskip\zeropoint}%
\fi\fi
- \global\mathnumberstatus\zerocount
\math_build_eqalign
\the\mathdisplayaligntweaks
\tabskip\centering}
@@ -213,7 +180,6 @@
\rlap{\math_text_in_eqalign{\alignmark\alignmark}}%
\tabskip\displaywidth}%
\fi\fi
- \global\mathnumberstatus\zerocount
\math_build_eqalign
\the\mathdisplayaligntweaks
\tabskip\centering}
@@ -235,15 +201,15 @@
\def\math_both_eqalign_no_aligned#1%
{\ifmmode
- \the\mathdisplayaligntweaks
- \global\mathnumberstatus\plusone
- \ifcase\mathraggedstatus
+ \the\mathdisplayaligntweaks
+ \global\mathnumberstatus\plusone
+ \ifcase\mathraggedstatus
\def\math_finish_eqalign_no{\crcr\egroup}%
- \else
+ \else
% we're in a mathbox
\vcenter\bgroup
\def\math_finish_eqalign_no{\crcr\egroup\egroup}%
- \fi
+ \fi
\fi
#1%
\math_halign_checked\expandafter\bgroup\the\scratchtoks\crcr}
@@ -275,27 +241,6 @@
\newtoks \everymathalignment
-% \def\math_alignment_NC_first
-% {\glet\math_alignment_NC\math_alignment_NC_rest}
-%
-% \def\math_alignment_NR
-% {\aligntab
-% \dostoptagged % finish cell
-% \dodoubleempty\math_alignment_NR_indeed} % use xx from tabulate
-%
-% \def\math_alignment_NR_indeed[#1][#2]%
-% {\strc_formulas_place_number_nested{#1}{#2}% to be tagged (better an attribute)
-% \crcr
-% \dostoptagged % finish row
-% \noalign{\glet\math_alignment_NC\math_alignment_NC_first}} % noalign used for change state, conditional does not work here
-
-% \def\math_alignment_NC_first#1\NR
-% {\glet\math_alignment_NC\math_alignment_NC_rest
-% \dotripleempty\math_alignment_NC_first_indeed[{#1}]}
-
-% \def\math_alignment_NC_first_indeed[#1][#2][#3]%
-% {\strc_formulas_place_number_nested{#2}{#3}\aligntab#1\NR}
-
\def\math_alignment_NC_first#1\NR
{\glet\math_alignment_NC\math_alignment_NC_rest
\scratchtoks{\math_number_left_of_eqalign\aligntab#1\NR}%
@@ -355,7 +300,7 @@
\the\everymathalignment
\c_math_eqalign_column\zerocount
\processcommacommand
- [\mathalignmentparameter\c!align]
+ [\mathalignmentparameter\c!align]%
{\advance\c_math_eqalign_column\plusone\math_eqalign_set_column}% takes argument
\global\c_math_eqalign_column\plusone
\dostarttagged\t!math\empty
diff --git a/tex/context/base/mkiv/math-ini.mkiv b/tex/context/base/mkiv/math-ini.mkiv
index ca309df3d..38bff5afe 100644
--- a/tex/context/base/mkiv/math-ini.mkiv
+++ b/tex/context/base/mkiv/math-ini.mkiv
@@ -2201,10 +2201,6 @@
\newtoks\mathdisplayaligntweaks
-\appendtoks
- \resetdisplaymatheq % moved to here
-\to \mathdisplayaligntweaks
-
% this can become an option:
\unexpanded\def\math_display_align_hack % I don't like the global, maybe we should push and pop
diff --git a/tex/context/base/mkiv/mlib-pps.lua b/tex/context/base/mkiv/mlib-pps.lua
index 0c0cc6637..b6d22f1be 100644
--- a/tex/context/base/mkiv/mlib-pps.lua
+++ b/tex/context/base/mkiv/mlib-pps.lua
@@ -25,7 +25,7 @@ local setmacro = interfaces.setmacro
local texsetbox = tex.setbox
local textakebox = tex.takebox
local copy_list = node.copy_list
-local free_list = node.flush_list
+local flush_list = node.flush_list
local setmetatableindex = table.setmetatableindex
local sortedhash = table.sortedhash
@@ -259,7 +259,7 @@ end
local function stopjob()
if top then
for n, tn in next, top.textexts do
- free_list(tn)
+ flush_list(tn)
if trace_textexts then
report_textexts("freeing text %s",n)
end
diff --git a/tex/context/base/mkiv/node-met.lua b/tex/context/base/mkiv/node-met.lua
index 1dee3a9f5..efd748b12 100644
--- a/tex/context/base/mkiv/node-met.lua
+++ b/tex/context/base/mkiv/node-met.lua
@@ -76,6 +76,7 @@ nodes.copy_node = node.copy
nodes.copy_list = node.copy_list
nodes.delete = node.delete
nodes.dimensions = node.dimensions
+nodes.rangedimensions = node.rangedimensions
nodes.end_of_math = node.end_of_math
nodes.flush = node.flush_node
nodes.flush_node = node.flush_node
@@ -128,6 +129,23 @@ if LUATEXVERSION < 0.97 then
end
+if not node.rangedimensions then -- LUATEXVERSION < 0.99
+
+ local dimensions = node.dimensions
+ local getfield = node.getfield
+ local findtail = node.find_tail
+
+ function node.rangedimensions(parent,first,last)
+ return dimensions(
+ getfield(parent,"glue_set"), getfield(parent,"glue_sign"), getfield(parent,"glue_order"),
+ first, last or find_tail(first), getfield(parent,"dir")
+ )
+ end
+
+ nodes.rangedimensions = node.rangedimensions
+
+end
+
nodes.effective_glue = node.effective_glue
nodes.getglue = node.getglue
nodes.setglue = node.setglue
diff --git a/tex/context/base/mkiv/node-nut.lua b/tex/context/base/mkiv/node-nut.lua
index c2c74308d..e158b9325 100644
--- a/tex/context/base/mkiv/node-nut.lua
+++ b/tex/context/base/mkiv/node-nut.lua
@@ -164,6 +164,7 @@ nuts.copy_node = direct.copy
nuts.copy_list = direct.copy_list
nuts.delete = direct.delete
nuts.dimensions = direct.dimensions
+nuts.rangedimensions = direct.rangedimensions
nuts.end_of_math = direct.end_of_math
nuts.flush = direct.flush_node
nuts.flush_node = direct.flush_node
@@ -225,6 +226,23 @@ if LUATEXVERSION < 0.97 then
end
+if not direct.rangedimensions then -- LUATEXVERSION < 0.99
+
+ local dimensions = direct.dimensions
+ local getfield = direct.getfield
+ local findtail = direct.find_tail
+
+ function direct.rangedimensions(parent,first,last)
+ return dimensions(
+ getfield(parent,"glue_set"), getfield(parent,"glue_sign"), getfield(parent,"glue_order"),
+ first, last or find_tail(first), getfield(parent,"dir")
+ )
+ end
+
+ nuts.rangedimensions = direct.rangedimensions
+
+end
+
local getglue = direct.getglue
local setglue = direct.setglue
local is_zero_glue = direct.is_zero_glue
diff --git a/tex/context/base/mkiv/node-ref.lua b/tex/context/base/mkiv/node-ref.lua
index 7bdd5b8d8..d709eb811 100644
--- a/tex/context/base/mkiv/node-ref.lua
+++ b/tex/context/base/mkiv/node-ref.lua
@@ -20,82 +20,83 @@ local concat = table.concat
local attributes, nodes, node = attributes, nodes, node
-local allocate = utilities.storage.allocate, utilities.storage.mark
-local mark = utilities.storage.allocate, utilities.storage.mark
-
-local nodeinjections = backends.nodeinjections
-local codeinjections = backends.codeinjections
-
-local cleanupreferences = false
-local cleanupdestinations = true
-
-local transparencies = attributes.transparencies
-local colors = attributes.colors
-local references = structures.references
-local tasks = nodes.tasks
-
-local trace_references = false trackers.register("nodes.references", function(v) trace_references = v end)
-local trace_destinations = false trackers.register("nodes.destinations", function(v) trace_destinations = v end)
-local trace_areas = false trackers.register("nodes.areas", function(v) trace_areas = v end)
-local show_references = false trackers.register("nodes.references.show", function(v) show_references = tonumber(v) or (v and 2.25 or false) end)
-local show_destinations = false trackers.register("nodes.destinations.show", function(v) show_destinations = tonumber(v) or (v and 2.00 or false) end)
-
-local report_reference = logs.reporter("backend","references")
-local report_destination = logs.reporter("backend","destinations")
-local report_area = logs.reporter("backend","areas")
-
-local nuts = nodes.nuts
-local nodepool = nuts.pool
-
-local tonode = nuts.tonode
-local tonut = nuts.tonut
-
-local getfield = nuts.getfield
-local setfield = nuts.setfield
-local setlink = nuts.setlink
-local setnext = nuts.setnext
-local setprev = nuts.setprev
-local getnext = nuts.getnext
-local getprev = nuts.getprev
-local getid = nuts.getid
-local getlist = nuts.getlist
-local setlist = nuts.setlist
-local getattr = nuts.getattr
-local setattr = nuts.setattr
-local getsubtype = nuts.getsubtype
-
-local hpack_list = nuts.hpack
-local vpack_list = nuts.vpack
-local list_dimensions = nuts.dimensions
-local traverse = nuts.traverse
-local find_node_tail = nuts.tail
-
-local nodecodes = nodes.nodecodes
-local skipcodes = nodes.skipcodes
-local listcodes = nodes.listcodes
-
-local hlist_code = nodecodes.hlist
-local vlist_code = nodecodes.vlist
-local glue_code = nodecodes.glue
-local glyph_code = nodecodes.glyph
-local rule_code = nodecodes.rule
-local dir_code = nodecodes.dir
-local localpar_code = nodecodes.localpar
-
-local leftskip_code = skipcodes.leftskip
-local rightskip_code = skipcodes.rightskip
-local parfillskip_code = skipcodes.parfillskip
-
-local line_code = listcodes.line
-
-local new_rule = nodepool.rule
-local new_kern = nodepool.kern
-
-local flush_node = nuts.flush
-
-local tosequence = nodes.tosequence
-
-local implement = interfaces.implement
+local allocate = utilities.storage.allocate, utilities.storage.mark
+local mark = utilities.storage.allocate, utilities.storage.mark
+
+local nodeinjections = backends.nodeinjections
+local codeinjections = backends.codeinjections
+
+local cleanupreferences = false
+local cleanupdestinations = true
+
+local transparencies = attributes.transparencies
+local colors = attributes.colors
+local references = structures.references
+local tasks = nodes.tasks
+
+local trace_references = false trackers.register("nodes.references", function(v) trace_references = v end)
+local trace_destinations = false trackers.register("nodes.destinations", function(v) trace_destinations = v end)
+local trace_areas = false trackers.register("nodes.areas", function(v) trace_areas = v end)
+local show_references = false trackers.register("nodes.references.show", function(v) show_references = tonumber(v) or (v and 2.25 or false) end)
+local show_destinations = false trackers.register("nodes.destinations.show", function(v) show_destinations = tonumber(v) or (v and 2.00 or false) end)
+
+local report_reference = logs.reporter("backend","references")
+local report_destination = logs.reporter("backend","destinations")
+local report_area = logs.reporter("backend","areas")
+
+local nuts = nodes.nuts
+local nodepool = nuts.pool
+
+local tonode = nuts.tonode
+local tonut = nuts.tonut
+
+local getfield = nuts.getfield
+local setfield = nuts.setfield
+local setlink = nuts.setlink
+local setnext = nuts.setnext
+local setprev = nuts.setprev
+local getnext = nuts.getnext
+local getprev = nuts.getprev
+local getid = nuts.getid
+local getlist = nuts.getlist
+local setlist = nuts.setlist
+local getattr = nuts.getattr
+local setattr = nuts.setattr
+local getsubtype = nuts.getsubtype
+
+local hpack_list = nuts.hpack
+local vpack_list = nuts.vpack
+local list_dimensions = nuts.dimensions
+local list_rangedimensions = nuts.rangedimensions
+local traverse = nuts.traverse
+local find_node_tail = nuts.tail
+
+local nodecodes = nodes.nodecodes
+local skipcodes = nodes.skipcodes
+local listcodes = nodes.listcodes
+
+local hlist_code = nodecodes.hlist
+local vlist_code = nodecodes.vlist
+local glue_code = nodecodes.glue
+local glyph_code = nodecodes.glyph
+local rule_code = nodecodes.rule
+local dir_code = nodecodes.dir
+local localpar_code = nodecodes.localpar
+
+local leftskip_code = skipcodes.leftskip
+local rightskip_code = skipcodes.rightskip
+local parfillskip_code = skipcodes.parfillskip
+
+local line_code = listcodes.line
+
+local new_rule = nodepool.rule
+local new_kern = nodepool.kern
+
+local flush_node = nuts.flush
+
+local tosequence = nodes.tosequence
+
+local implement = interfaces.implement
-- Normally a (destination) area is a box or a simple stretch if nodes but when it is
-- a paragraph we have a problem: we cannot calculate the height well. This happens
@@ -104,7 +105,7 @@ local implement = interfaces.implement
local function hlist_dimensions(start,stop,parent)
local last = stop and getnext(stop)
if parent then
- return list_dimensions(getfield(parent,"glue_set"),getfield(parent,"glue_sign"),getfield(parent,"glue_order"),start,last)
+ return list_rangedimensions(parent,start,last)
else
return list_dimensions(start,last)
end
diff --git a/tex/context/base/mkiv/node-rul.lua b/tex/context/base/mkiv/node-rul.lua
index b3caa5ccd..219aa5e26 100644
--- a/tex/context/base/mkiv/node-rul.lua
+++ b/tex/context/base/mkiv/node-rul.lua
@@ -37,6 +37,7 @@ local getfont = nuts.getfont
local getsubtype = nuts.getsubtype
local getlist = nuts.getlist
local setlist = nuts.setlist
+local flushlist = nuts.flush_list
local nodecodes = nodes.nodecodes
local tasks = nodes.tasks
@@ -107,7 +108,7 @@ local a_colormodel = attributes.private('colormodel')
local insert_node_before = nuts.insert_before
local insert_node_after = nuts.insert_after
-local list_dimensions = nuts.dimensions
+local list_dimensions = nuts.rangedimensions
local hpack_nodes = nuts.hpack
local striprange = nodes.striprange
@@ -357,8 +358,9 @@ local function flush_ruled(head,f,l,d,level,parent,strip) -- not that fast but a
if not f then
return head
end
- local w, ht, dp = list_dimensions(getfield(parent,"glue_set"),getfield(parent,"glue_sign"),getfield(parent,"glue_order"),f,getnext(l))
+ local w, ht, dp = list_dimensions(parent,f,getnext(l))
local method = d.method
+ local empty = d.empty == v_yes
local offset = d.offset
local continue = d.continue
local dy = d.dy
@@ -402,14 +404,22 @@ local function flush_ruled(head,f,l,d,level,parent,strip) -- not that fast but a
if layer then
setattr(r,a_viewerlayer,layer)
end
- local k = new_kern(-w)
- if foreground then
- insert_node_after(head,l,k)
- insert_node_after(head,k,r)
- l = r
- else
+ if empty then
head = insert_node_before(head,f,r)
- insert_node_after(head,r,k)
+ setlink(r,getnext(l))
+ setprev(f)
+ setnext(l)
+ flushlist(f)
+ else
+ local k = new_kern(-w)
+ if foreground then
+ insert_node_after(head,l,k)
+ insert_node_after(head,k,r)
+ l = r
+ else
+ head = insert_node_before(head,f,r)
+ insert_node_after(head,r,k)
+ end
end
if trace_ruled then
report_ruled("level %a, width %p, height %p, depth %p, nodes %a, text %a",
@@ -489,7 +499,7 @@ local function flush_shifted(head,first,last,data,level,parent,strip) -- not tha
local next = getnext(last)
setprev(first)
setnext(last)
- local width, height, depth = list_dimensions(getfield(parent,"glue_set"),getfield(parent,"glue_sign"),getfield(parent,"glue_order"),first,next)
+ local width, height, depth = list_dimensions(parent,first,next)
local list = hpack_nodes(first,width,"exactly")
if first == head then
head = list
@@ -541,13 +551,14 @@ implement {
{ "order" },
{ "method", "integer" },
{ "offset", "number" },
- { "rulethickness", "string" },
+ { "rulethickness" },
{ "dy", "number" },
{ "max", "number" },
{ "ma", "integer" },
{ "ca", "integer" },
{ "ta", "integer" },
- { "mp", "string" },
+ { "mp" },
+ { "empty" },
}
}
}
diff --git a/tex/context/base/mkiv/node-rul.mkiv b/tex/context/base/mkiv/node-rul.mkiv
index 0be4a0f4b..91b013937 100644
--- a/tex/context/base/mkiv/node-rul.mkiv
+++ b/tex/context/base/mkiv/node-rul.mkiv
@@ -124,6 +124,7 @@
ta \thetransparencyattribute\p_node_rules_color
offset \barparameter\c!offset\space % number
dy \barparameter\c!dy\space % number
+ empty {\barparameter\c!empty}%
\relax}}
\unexpanded\def\node_rules_redefine#1%
@@ -182,6 +183,7 @@
\setupbars
[\c!method=0, % new: 0=center nested, 1=stack nested
\c!continue=\v!no,
+ \c!empty=, % new: yes = hide text
\c!offset=0, % upwards, replaces: topoffset bottomoffset
\c!dy=0,
\c!max=3,
diff --git a/tex/context/base/mkiv/status-files.pdf b/tex/context/base/mkiv/status-files.pdf
index 5be73cee9..ad2f3bea9 100644
--- a/tex/context/base/mkiv/status-files.pdf
+++ b/tex/context/base/mkiv/status-files.pdf
Binary files differ
diff --git a/tex/context/base/mkiv/status-lua.pdf b/tex/context/base/mkiv/status-lua.pdf
index a39c6a930..273acc006 100644
--- a/tex/context/base/mkiv/status-lua.pdf
+++ b/tex/context/base/mkiv/status-lua.pdf
Binary files differ
diff --git a/tex/context/base/mkiv/strc-mat.mkiv b/tex/context/base/mkiv/strc-mat.mkiv
index b0e37f987..fba6b5ee2 100644
--- a/tex/context/base/mkiv/strc-mat.mkiv
+++ b/tex/context/base/mkiv/strc-mat.mkiv
@@ -226,7 +226,6 @@
\to \everyresetformulas
\newconditional\c_strc_formulas_handle_number
-\newconditional\c_strc_formulas_increment
\newconditional\c_strc_formulas_inside_place
\newconditional\c_strc_formulas_inside_place_sub
\newconditional\c_strc_formulas_inside_formulas
@@ -489,9 +488,6 @@
\let\math_native_leqno\leqno
\let\math_native_reqno\reqno
-\unexpanded\def\resetdisplaymatheq
- {\let\strc_formulas_place_number\relax}
-
\unexpanded\def\normaleqno#1{\writestatus\m!system{no native (l)eqno equation number support}}
\let\normalleqno\normaleqno
@@ -741,7 +737,7 @@
\d_strc_formulas_display_skip_left \leftskip
\d_strc_formulas_display_skip_right \rightskip
\d_strc_formulas_display_width \formulaparameter\c!width\relax
- \d_strc_formulas_display_margin_left \formulaparameter\c!leftmargin \relax
+ \d_strc_formulas_display_margin_left \formulaparameter\c!leftmargin\relax
\d_strc_formulas_display_margin_right\formulaparameter\c!rightmargin\relax
\edef\p_option{\formulaparameter\c!option}%
\ifsecondargument
@@ -817,65 +813,6 @@
%D \startformula x \stopformula % now has \noindent (in mkii we messed with baselineskip)
%D \stoptyping
-% \unexpanded\def\startdisplaymath
-% {\bgroup
-% \par
-% \informulatrue
-% \beforedisplayspace
-% \par
-% \ifvmode
-% \prevdepth-\maxdimen % texbook pagina 79-80
-% \fi
-% \noindent % else funny hlist with funny baselineskip
-% $$% \Ucheckedstartdisplaymath
-% \setdisplaydimensions
-% \startinnermath}
-%
-% \unexpanded\def\stopdisplaymath
-% {\stopinnermath
-% $$% \Ucheckedstopdisplaymath
-% \par
-% \afterdisplayspace
-% \par
-% \egroup}
-%
-% \unexpanded\def\startdisplaymath
-% {\bgroup
-% \par
-% \informulatrue
-% \beforedisplayspace
-% \par
-% \ifvmode
-% \ifcase\c_strc_formulas_space_model
-% % nothing
-% \or
-% % nothing yet
-% \or
-% \prevdepth-\maxdimen % texbook pagina 79-80
-% \fi
-% \fi
-% \noindent % else funny hlist with funny baselineskip
-% \Ucheckedstartdisplaymath
-% \setdisplaydimensions
-% \startinnermath}
-%
-% \unexpanded\def\stopdisplaymath
-% {\stopinnermath
-% \Ucheckedstopdisplaymath
-% \par
-% \ifvmode
-% \ifcase\c_strc_formulas_space_model
-% % nothing
-% \or
-% \prevdepth .5\strutdp
-% \or
-% \prevdepth\lineheight
-% \fi
-% \fi
-% \afterdisplayspace
-% \par
-% \egroup}
-
\unexpanded\def\startdisplaymath
{\bgroup
\informulatrue
@@ -1043,17 +980,14 @@
\unexpanded\def\strc_formulas_number_again[#1]%
{\def\currentformulareference{#1}%
- \glet\strc_formulas_place_number\relax
\strc_formulas_place_number_in_box}
\unexpanded\def\placeformula
{\global\settrue\c_strc_formulas_inside_place
- \settrue\c_strc_formulas_increment
\dosingleempty\strc_formulas_place}
\unexpanded\def\placesubformula
{\global\settrue\c_strc_formulas_inside_place_sub
- \setfalse\c_strc_formulas_increment
\dosingleempty\strc_formulas_place}
\unexpanded\def\strc_formulas_place[#1]%
@@ -1139,21 +1073,21 @@
\def\strc_formulas_place_number_nested_indeed#1#2%
{\def\currentnestedformulareference{#1}%
\def\currentnestedformulasuffix{#2}%
- \glet\strc_formulas_place_number\relax
\strc_formulas_check_reference\c_strc_formulas_nested_number_mode\currentnestedformulareference
\ifcase\c_strc_formulas_nested_number_mode
% nothing
\or
+ \glet\strc_formulas_place_number\relax
\expandafter\strc_formulas_number % hm, looks ahead for []
\or
% nothing
\or
+ \glet\strc_formulas_place_number\relax
\expandafter\strc_formulas_number % hm, looks ahead for []
\fi}
\def\strc_formulas_place_number_indeed
- {\glet\strc_formulas_place_number\relax
- \strc_formulas_place_number_in_box}
+ {\strc_formulas_place_number_in_box}
\def\strc_formulas_place_number_in_box
{\dostarttagged\t!formulacaption\empty
diff --git a/tex/context/base/mkiv/util-lua.lua b/tex/context/base/mkiv/util-lua.lua
index d4020a1e9..b3346006c 100644
--- a/tex/context/base/mkiv/util-lua.lua
+++ b/tex/context/base/mkiv/util-lua.lua
@@ -159,14 +159,20 @@ end
--
-- print(luautilities.datatype(lpeg.P("oeps")))
--- local finalizers = { }
---
--- function luautilities.registerfinalizer(f)
--- finalizers[#finalizers+1] = f
--- end
---
--- function luautilities.finalize()
--- for i=1,#finalizers do
--- pcall(finalizers[i])
--- end
--- end
+-- These finalizers will only be invoked when we have a proper lua_close
+-- call (which is not happening in luatex tex node yes) or finish with an
+-- os.exit(n,true).
+
+local finalizers = { }
+
+setmetatable(finalizers, {
+ __gc = function(t)
+ for i=1,#t do
+ pcall(t[i]) -- let's not crash
+ end
+ end
+} )
+
+function luautilities.registerfinalizer(f)
+ finalizers[#finalizers+1] = f
+end
diff --git a/tex/context/base/mkiv/util-sql-imp-client.lua b/tex/context/base/mkiv/util-sql-imp-client.lua
index 50b1e9dff..55c944ebb 100644
--- a/tex/context/base/mkiv/util-sql-imp-client.lua
+++ b/tex/context/base/mkiv/util-sql-imp-client.lua
@@ -26,6 +26,8 @@ local serialize = sql.serialize
local deserialize = sql.deserialize
local getserver = sql.getserver
+local osclock = os.gettimeofday
+
-- Experiments with an p/action demonstrated that there is not much gain. We could do a runtime
-- capture but creating all the small tables is not faster and it doesn't work well anyway.
@@ -172,7 +174,7 @@ local function datafetched(specification)
local t = osclock()
report_state("command: %s",command)
local okay = os.execute(command)
- report_state("fetchtime: %.3f sec",osclock()-t) -- not okay under linux
+ report_state("fetchtime: %.3f sec, return code: %i",osclock()-t,okay) -- not okay under linux
return okay == 0
else
return os.execute(command) == 0
diff --git a/tex/context/base/mkiv/util-sql-imp-sqlite.lua b/tex/context/base/mkiv/util-sql-imp-sqlite.lua
index 390e3aa29..bb789f648 100644
--- a/tex/context/base/mkiv/util-sql-imp-sqlite.lua
+++ b/tex/context/base/mkiv/util-sql-imp-sqlite.lua
@@ -6,18 +6,21 @@ if not modules then modules = { } end modules ['util-sql-imp-sqlite'] = {
license = "see context related readme files"
}
--- todo: make a converter
+local next = next
-require("util-sql")
+local sql = require("util-sql")
+----- sql = utilities.sql
+local sqlite = require("swiglib.sqlite.core")
+local swighelpers = require("swiglib.helpers.core")
+
+-- sql.sqlite = sqlite -- maybe in the module itself
-local rawset, setmetatable = rawset, setmetatable
-local P, S, V, C, Cs, Ct, Cc, Cg, Cf, patterns, lpegmatch = lpeg.P, lpeg.S, lpeg.V, lpeg.C, lpeg.Cs, lpeg.Ct, lpeg.Cc, lpeg.Cg, lpeg.Cf, lpeg.patterns, lpeg.match
+-- inspect(table.sortedkeys(sqlite))
local trace_sql = false trackers.register("sql.trace", function(v) trace_sql = v end)
local trace_queries = false trackers.register("sql.queries",function(v) trace_queries = v end)
local report_state = logs.reporter("sql","sqlite")
-local sql = utilities.sql
local helpers = sql.helpers
local methods = sql.methods
local validspecification = helpers.validspecification
@@ -28,32 +31,21 @@ local serialize = sql.serialize
local deserialize = sql.deserialize
local getserver = sql.getserver
-local sqlite = require("swiglib.sqlite.core")
-local swighelpers = require("swiglib.helpers.core")
-
-
--- we can have a cache
-
--- local preamble = t_preamble[getserver()] or t_preamble.mysql
--- if preamble then
--- preamble = replacetemplate(preamble,specification.variables,'sql')
--- query = preamble .. "\n" .. query
--- end
-
--- print(sqlite.sqlite3_errmsg(dbh))
+local setmetatable = setmetatable
+local formatters = string.formatters
-local get_list_item = sqlite.char_p_array_getitem
-local is_okay = sqlite.SQLITE_OK
-local execute_query = sqlite.sqlite3_exec_lua_callback
-local error_message = sqlite.sqlite3_errmsg
+local get_list_item = sqlite.char_p_array_getitem
+local is_okay = sqlite.SQLITE_OK
+local execute_query = sqlite.sqlite3_exec_lua_callback
+local error_message = sqlite.sqlite3_errmsg
-local new_db = sqlite.new_sqlite3_p_array
-local open_db = sqlite.sqlite3_open
-local get_db = sqlite.sqlite3_p_array_getitem
-local close_db = sqlite.sqlite3_close
-local dispose_db = sqlite.delete_sqlite3_p_array
+local new_db = sqlite.new_sqlite3_p_array
+local open_db = sqlite.sqlite3_open
+local get_db = sqlite.sqlite3_p_array_getitem
+local close_db = sqlite.sqlite3_close
+local dispose_db = sqlite.delete_sqlite3_p_array
-local cache = { }
+local cache = { }
setmetatable(cache, {
__gc = function(t)
@@ -67,6 +59,21 @@ setmetatable(cache, {
end
})
+-- synchronous journal_mode locking_mode 1000 logger inserts
+--
+-- normal normal normal 6.8
+-- off off normal 0.1
+-- normal off normal 2.1
+-- normal persist normal 5.8
+-- normal truncate normal 4.2
+-- normal truncate exclusive 4.1
+
+local f_preamble = formatters[ [[
+ATTACH `%s` AS `%s` ;
+PRAGMA `%s`.synchronous = normal ;
+PRAGMA journal_mode = truncate ;
+]] ]
+
local function execute(specification)
if trace_sql then
report_state("executing sqlite")
@@ -84,62 +91,88 @@ local function execute(specification)
report_state("no database specified")
return
end
- base = file.addsuffix(base,"db")
- local result = { }
- local keys = { }
- local id = specification.id
- local db = nil
- local dbh = nil
- local okay = false
+ local filename = file.addsuffix(base,"db")
+ local result = { }
+ local keys = { }
+ local id = specification.id
+ local db = nil
+ local dbh = nil
+ local okay = false
+ local preamble = nil
if id then
local session = cache[id]
if session then
dbh = session.dbh
okay = is_okay
else
- db = new_db(1)
- okay = open_db(base,db)
- dbh = get_db(db,0)
+ db = new_db(1)
+ okay = open_db(filename,db)
+ dbh = get_db(db,0)
+ preamble = f_preamble(filename,base,base)
if okay ~= is_okay then
report_state("no session database specified")
else
cache[id] = {
- name = base,
+ name = filename,
db = db,
dbh = dbh,
}
end
end
else
- db = new_db(1)
- okay = open_db(base,db)
- dbh = get_db(db,0)
+ db = new_db(1)
+ okay = open_db(filename,db)
+ dbh = get_db(db,0)
+ preamble = f_preamble(filename,base,base)
end
if okay ~= is_okay then
report_state("no database opened")
else
- local keysdone = false
- local nofresults = 0
- local callback = function(data,nofcolumns,values,fields)
- nofresults = nofresults + 1
- local r = { }
- for i=0,nofcolumns-1 do
- local field = get_list_item(fields,i)
- local value = get_list_item(values,i)
- r[field] = value
- if not keysdone then
- keys[i+1] = field
+ local converter = specification.converter
+ local keysdone = false
+ local nofrows = 0
+ local callback = nil
+ if preamble then
+ query = preamble .. query -- only needed in open
+ end
+ if converter then
+ converter = converter.sqlite
+ callback = function(data,nofcolumns,values,fields)
+ local column = { }
+ for i=0,nofcolumns-1 do
+ column[i+1] = get_list_item(values,i)
+ end
+ nofrows = nofrows + 1
+ result[nofrows] = converter(column)
+ return is_okay
+ end
+ --
+ -- callback = converter.sqlite
+ else
+ callback = function(data,nofcolumns,values,fields)
+ local column = { }
+ for i=0,nofcolumns-1 do
+ local field
+ if keysdone then
+ field = keys[i+1]
+ else
+ field = get_list_item(fields,i)
+ keys[i+1] = field
+ end
+ column[field] = get_list_item(values,i)
end
+ nofrows = nofrows + 1
+ keysdone = true
+ result[nofrows] = column
+ return is_okay
end
- keysdone = true
- result[nofresults] = r
- return is_okay
end
local okay = execute_query(dbh,query,callback,nil,nil)
if okay ~= is_okay then
- report_state(error_message(dbh))
+ report_state("error: %s",error_message(dbh))
+ -- elseif converter then
+ -- result = converter.sqlite(result)
end
-
end
if not id then
close_db(dbh)
@@ -158,20 +191,45 @@ local booleanstring = string.booleanstring
%s
-return function(data)
- local target = %s -- data or { }
- for i=1,#data do
- local cells = data[i]
- target[%s] = {
- %s
- }
- end
- return target
+return function(cells)
+ -- %s (not needed)
+ -- %s (not needed)
+ return {
+ %s
+ }
end
]]
local celltemplate = "cells[%s]"
+-- todo: how to deal with result ... pass via temp global .. bah .. or
+-- also pass the execute here ... not now
+--
+-- local wraptemplate = [[
+-- local converters = utilities.sql.converters
+-- local deserialize = utilities.sql.deserialize
+--
+-- local tostring = tostring
+-- local tonumber = tonumber
+-- local booleanstring = string.booleanstring
+--
+-- local get_list_item = utilities.sql.sqlite.char_p_array_getitem
+-- local is_okay = utilities.sql.sqlite.SQLITE_OK
+--
+-- %s
+--
+-- return function(data,nofcolumns,values,fields)
+-- -- no %s (data) needed
+-- -- no %s (i) needed
+-- local cells = { }
+-- for i=0,nofcolumns-1 do
+-- cells[i+1] = get_list_item(values,i)
+-- end
+-- result[#result+1] = { %s }
+-- return is_okay
+-- end
+-- ]]
+
methods.sqlite = {
execute = execute,
usesfiles = false,
diff --git a/tex/context/base/mkiv/util-sql-loggers.lua b/tex/context/base/mkiv/util-sql-loggers.lua
index ceb1ff75c..4473f8971 100644
--- a/tex/context/base/mkiv/util-sql-loggers.lua
+++ b/tex/context/base/mkiv/util-sql-loggers.lua
@@ -65,12 +65,21 @@ local template = [[
DEFAULT CHARSET = utf8 ;
]]
+local sqlite_template = [[
+ CREATE TABLE IF NOT EXISTS %basename% (
+ `id` INTEGER PRIMARY KEY AUTOINCREMENT,
+ `time` INTEGER NOT NULL,
+ `type` INTEGER NOT NULL,
+ `action` TEXT NOT NULL,
+ `data` TEXT
+ ) ;
+]]
+
function loggers.createdb(presets,datatable)
local db = checkeddb(presets,datatable)
-
db.execute {
- template = template,
+ template = db.usedmethod == "sqlite" and sqlite_template or template,
variables = {
basename = db.basename,
},
@@ -115,7 +124,11 @@ local template =[[
) ;
]]
-function loggers.save(db,data) -- beware, we pass type and action in the data (saves a table)
+-- beware, when we either pass a dat afield explicitly or we're using
+-- a flat table and then nill type and action in the data (which
+-- saves a table)
+
+function loggers.save(db,data)
if data then
@@ -123,8 +136,16 @@ function loggers.save(db,data) -- beware, we pass type and action in the data (s
local kind = totype[data.type]
local action = data.action or "unknown"
- data.type = nil
- data.action = nil
+ local extra = data.data
+
+ if extra then
+ -- we have a dedicated data table
+ data = extra
+ else
+ -- we have a flat table
+ data.type = nil
+ data.action = nil
+ end
db.execute {
template = template,
@@ -141,28 +162,49 @@ function loggers.save(db,data) -- beware, we pass type and action in the data (s
end
--- local template =[[
--- REMOVE FROM
--- %basename%
--- WHERE
--- `token` = '%token%' ;
--- ]]
---
--- function loggers.remove(db,token)
---
--- db.execute {
--- template = template,
--- variables = {
--- basename = db.basename,
--- token = token,
--- },
--- }
---
--- if trace_sql then
--- report("removed: %s",token)
--- end
---
--- end
+local template =[[
+ DELETE FROM %basename% %WHERE% ;
+]]
+
+function loggers.cleanup(db,specification)
+
+ specification = specification or { }
+
+ local today = os.date("*t")
+ local before = specification.before or today
+ local where = { }
+
+ if type(before) == "number" then
+ before = os.date(before)
+ end
+
+ before = os.time {
+ day = before.day or today.day,
+ month = before.month or today.month,
+ year = before.year or today.year,
+ hour = before.hour or 0,
+ minute = before.minute or 0,
+ second = before.second or 0,
+ isdst = true,
+ }
+
+ where[#where+1] = format("`time` < %s",before)
+
+ db.execute {
+ template = template,
+ variables = {
+ basename = db.basename,
+ WHERE = format("WHERE\n%s",concat(where," AND ")),
+ },
+ }
+
+ if db.usedmethod == "sqlite" then
+ db.execute {
+ template = "VACUUM ;",
+ }
+ end
+
+end
local template_nop =[[
SELECT
diff --git a/tex/context/base/mkiv/util-sql.lua b/tex/context/base/mkiv/util-sql.lua
index 023c7809a..a0578f086 100644
--- a/tex/context/base/mkiv/util-sql.lua
+++ b/tex/context/base/mkiv/util-sql.lua
@@ -311,15 +311,30 @@ sql.setserver("mysql")
-- helper:
+local sqlmethods = sql.methods
+
function sql.usedatabase(presets,datatable)
local name = datatable or presets.datatable
if name then
- local method = presets.method and sql.methods[presets.method] or sql.methods.client
+ local usedmethod = presets.method
+ local method = usedmethod and sqlmethods[usedmethod]
+ if not method then
+ usedmethod = currentmethod
+ method = usedmethod and sqlmethods[usedmethod]
+ end
+ if not method then
+ usedmethod = sql.methods.client
+ method = usedmethod and sqlmethods[usedmethod]
+ end
local base = presets.database or "test"
local basename = format("`%s`.`%s`",base,name)
local execute = nil
local m_execute = method.execute
- if method.usesfiles then
+ if not m_execute then
+ execute = function()
+ report_state("no valid execute handler")
+ end
+ elseif method.usesfiles then
local queryfile = presets.queryfile or format("%s-temp.sql",name)
local resultfile = presets.resultfile or format("%s-temp.dat",name)
execute = function(specification) -- variables template
@@ -347,6 +362,7 @@ function sql.usedatabase(presets,datatable)
end
end
return {
+ usedmethod = usedmethod,
presets = preset,
base = base,
name = name,
diff --git a/tex/context/interface/mkiv/i-context.pdf b/tex/context/interface/mkiv/i-context.pdf
index 301acb985..acd42b3c6 100644
--- a/tex/context/interface/mkiv/i-context.pdf
+++ b/tex/context/interface/mkiv/i-context.pdf
Binary files differ
diff --git a/tex/context/interface/mkiv/i-readme.pdf b/tex/context/interface/mkiv/i-readme.pdf
index ebaef2f9b..f5d105ac8 100644
--- a/tex/context/interface/mkiv/i-readme.pdf
+++ b/tex/context/interface/mkiv/i-readme.pdf
Binary files differ