diff options
author | Hans Hagen <pragma@wxs.nl> | 2021-10-08 20:46:55 +0200 |
---|---|---|
committer | Context Git Mirror Bot <phg@phi-gamma.net> | 2021-10-08 20:46:55 +0200 |
commit | 778f381ba6a448ab00d67994a412dd4226d43238 (patch) | |
tree | d9dade45016a572e6c22521bfb165f9829ac3192 /tex/context/base/mkxl | |
parent | 2073fe5d88215dddd9a9e6421afaea7ab7db955a (diff) | |
download | context-778f381ba6a448ab00d67994a412dd4226d43238.tar.gz |
2021-10-08 20:07:00
Diffstat (limited to 'tex/context/base/mkxl')
-rw-r--r-- | tex/context/base/mkxl/cont-new.mkxl | 2 | ||||
-rw-r--r-- | tex/context/base/mkxl/context.mkxl | 2 | ||||
-rw-r--r-- | tex/context/base/mkxl/lang-ini.mkxl | 3 | ||||
-rw-r--r-- | tex/context/base/mkxl/lpdf-ini.lmt | 10 | ||||
-rw-r--r-- | tex/context/base/mkxl/lpdf-pde.lmt | 225 | ||||
-rw-r--r-- | tex/context/base/mkxl/mlib-lmp.lmt | 15 | ||||
-rw-r--r-- | tex/context/base/mkxl/mlib-pdf.lmt | 1 | ||||
-rw-r--r-- | tex/context/base/mkxl/page-mix.mkxl | 1 | ||||
-rw-r--r-- | tex/context/base/mkxl/spac-ali.mkxl | 3 | ||||
-rw-r--r-- | tex/context/base/mkxl/strc-itm.mklx | 30 | ||||
-rw-r--r-- | tex/context/base/mkxl/strc-mar.mkxl | 12 | ||||
-rw-r--r-- | tex/context/base/mkxl/strc-not.lmt | 6 | ||||
-rw-r--r-- | tex/context/base/mkxl/typo-drp.lmt | 13 |
13 files changed, 234 insertions, 89 deletions
diff --git a/tex/context/base/mkxl/cont-new.mkxl b/tex/context/base/mkxl/cont-new.mkxl index 5306b33b4..e81d6cc7b 100644 --- a/tex/context/base/mkxl/cont-new.mkxl +++ b/tex/context/base/mkxl/cont-new.mkxl @@ -13,7 +13,7 @@ % \normalend % uncomment this to get the real base runtime -\newcontextversion{2021.09.26 16:48} +\newcontextversion{2021.10.08 20:05} %D This file is loaded at runtime, thereby providing an excellent place for hacks, %D patches, extensions and new features. There can be local overloads in cont-loc diff --git a/tex/context/base/mkxl/context.mkxl b/tex/context/base/mkxl/context.mkxl index c2b8528c1..a5b9cc7f1 100644 --- a/tex/context/base/mkxl/context.mkxl +++ b/tex/context/base/mkxl/context.mkxl @@ -29,7 +29,7 @@ %D {YYYY.MM.DD HH:MM} format. \immutable\edef\contextformat {\jobname} -\immutable\edef\contextversion{2021.09.26 16:48} +\immutable\edef\contextversion{2021.10.08 20:05} %overloadmode 1 % check frozen / warning %overloadmode 2 % check frozen / error diff --git a/tex/context/base/mkxl/lang-ini.mkxl b/tex/context/base/mkxl/lang-ini.mkxl index 336dd5d69..2b7f34ef3 100644 --- a/tex/context/base/mkxl/lang-ini.mkxl +++ b/tex/context/base/mkxl/lang-ini.mkxl @@ -481,6 +481,9 @@ \permanent\protected\def\dohyphencollapsing{\hyphenationmode\bitwiseflip\hyphenationmode \collapsehyphenationcode} \permanent\protected\def\nohyphencollapsing{\hyphenationmode\bitwiseflip\hyphenationmode-\collapsehyphenationcode} +\permanent\protected\def\doexplicithyphens{\hyphenationmode\bitwiseflip\hyphenationmode \explicithyphenationcode} +\permanent\protected\def\noexplicithyphens{\hyphenationmode\bitwiseflip\hyphenationmode-\explicithyphenationcode} + \permanent\protected\def\usehyphensparameter#1% {\edef\p_hyphens{#1\c!hyphens}% \ifx\p_hyphens\v!no diff --git a/tex/context/base/mkxl/lpdf-ini.lmt b/tex/context/base/mkxl/lpdf-ini.lmt index ce679c08e..1ce7c5adc 100644 --- a/tex/context/base/mkxl/lpdf-ini.lmt +++ b/tex/context/base/mkxl/lpdf-ini.lmt @@ -69,7 +69,7 @@ local report_objects = logs.reporter("backend","objects") local report_finalizing = logs.reporter("backend","finalizing") local report_blocked = logs.reporter("backend","blocked") -local implement = interfaces.implement +local implement = interfaces and interfaces.implement local context = context @@ -83,7 +83,7 @@ local factor = number.dimenfactors.bp local codeinjections = { } local nodeinjections = { } -local backends = backends +local backends = backends or { } local pdfbackend = { comment = "backend for directly generating pdf output", @@ -241,8 +241,8 @@ do end end - local toregime = regimes.toregime - local fromregime = regimes.fromregime + local toregime = regimes and regimes.toregime + local fromregime = regimes and regimes.fromregime local escaped = Cs(Cc("(") * (S("\\()\n\r\t\b\f")/"\\%0" + P(1))^0 * Cc(")")) topdfdoc = function(str,default) @@ -746,6 +746,8 @@ lpdf.reference = pdfreference lpdf.verbose = pdfverbose lpdf.literal = pdfliteral +if not callbacks then return lpdf end + -- three priority levels, default=2 local pagefinalizers = { { }, { }, { } } diff --git a/tex/context/base/mkxl/lpdf-pde.lmt b/tex/context/base/mkxl/lpdf-pde.lmt index 58f5723a3..4483510d0 100644 --- a/tex/context/base/mkxl/lpdf-pde.lmt +++ b/tex/context/base/mkxl/lpdf-pde.lmt @@ -85,6 +85,7 @@ local arraytotable = pdfe.arraytotable local pagestotable = pdfe.pagestotable local readwholestream = pdfe.readwholestream local getfromreference = pdfe.getfromreference +local getfromobject = pdfe.getfromobject local report_epdf = logs.reporter("epdf") @@ -119,6 +120,8 @@ encryptioncodes = allocate(swapped(encryptioncodes,encryptioncodes) pdfe.objectcodes = objectcodes pdfe.encryptioncodes = encryptioncodes +-- lpdf_epdf.objectcodes = objectcodes + local null_object_code = objectcodes.null local reference_object_code = objectcodes.reference @@ -134,47 +137,6 @@ local dictionary_object_code = objectcodes.dictionary local stream_object_code = objectcodes.stream local reference_object_code = objectcodes.reference -local checked_access -local get_flagged -- from pdfe -> lpdf - -if lpdf.dictionary then - - -- we're in context - - local pdfdictionary = lpdf.dictionary - local pdfarray = lpdf.array - local pdfconstant = lpdf.constant - local pdfstring = lpdf.string - local pdfunicode = lpdf.unicode - - get_flagged = function(t,f,k) - local tk = t[k] -- triggers resolve - local fk = f[k] - if not fk then - return tk - elseif fk == "name" then - return pdfconstant(tk) - elseif fk == "array" then - return pdfarray(tk) - elseif fk == "dictionary" then - return pdfarray(tk) - elseif fk == "rawtext" then - return pdfstring(tk) - elseif fk == "unicode" then - return pdfunicode(tk) - else - return tk - end - end - -else - - get_flagged = function(t,f,k) - return t[k] - end - -end - -- We need to convert the string from utf16 although there is no way to -- check if we have a regular string starting with a bom. So, we have -- na dilemma here: a pdf doc encoded string can be invalid utf. @@ -196,6 +158,13 @@ local some_reference local some_string = lpdf.frombytes +function lpdf_epdf.objecttype(object) + if type(object) == "table" then + local kind = object.__type__ + return kind and objectcodes[kind] + end +end + local function get_value(document,t,key) if not key then return @@ -218,22 +187,131 @@ local function get_value(document,t,key) elseif kind == dictionary_object_code then return some_dictionary(value[2],document) elseif kind == stream_object_code then - return some_stream(value,document) + return some_stream(value,value[2],document) -- needs checking elseif kind == reference_object_code then return some_reference(value,document) end return value end +local checked_access +local get_flagged -- from pdfe -> lpdf + +if lpdf.dictionary then + + -- these are used in mtx-pdf.lua + + local pdfdictionary = lpdf.dictionary + local pdfarray = lpdf.array + local pdfconstant = lpdf.constant + local pdfreference = lpdf.reference + local pdfliteral = lpdf.literal + + local copy_array, copy_dictionary + + local function copyobject(object,key,value) + if not value then + value = object.__raw__[key] + end + local t = type(value) + if t == "string" then + return pdfconstant(value) + elseif t ~= "table" then + return value + end + local kind = value[1] + if kind == name_object_code then + return pdfconstant(value[2]) + elseif kind == string_object_code then + return pdfliteral(value[2],value[3]) + elseif kind == array_object_code then + return copyarray(object[key]) + elseif kind == dictionary_object_code then + return copydictionary(object[key]) + elseif kind == null_object_code then + return pdfnull() + elseif kind == reference_object_code then + return pdfreference(value[3]) + else + -- report("weird: %s", objecttypes[kind] or "?") + end + end + + copyarray = function(object) + local target = pdfarray() + local source = object.__raw__ + for i=1,#source do + target[i] = copyobject(object,i,source[i]) + end + return target + end + + copydictionary = function(object) + local target = pdfdictionary() + local source = object.__raw__ + for key, value in sortedhash(source) do + target[key] = copyobject(object,key,value) + end + return target + end + + get_flagged = function(t,f) + local kind = t.__type__ + if kind == name_object_code then + return pdfconstant(f) + elseif kind == array_object_code then + return copyarray(t) + elseif kind == dictionary_object_code then + return copydictionary(t) + elseif kind == stream_object_code then + return copydictionary(t) + elseif kind == string_object_code then + return pdfunicode(f) + elseif kind == null_object_code then + return pdfnull() + elseif kind == reference_object_code then + return pdfreference(t[3]) + else + return f + end + end + + function lpdf_epdf.verboseobject(document,n) + if document and n then + local object = document.objects[n] + if object then + local t = { n .. " 0 obj" } + if lpdf.epdf.objecttype(object) == "stream" then + t[#t+1] = object("dictionary")() + t[#t+1] = "stream" + t[#t+1] = tostring(object(true)) + t[#t+1] = "endstream" + else + t[#t+1] = tostring(object()) + end + t[#t+1] = "endobj" + return concat(t,"\n") + end + end + end + +else + + get_flagged = function(t,f) + return t[k] -- hm + end + +end + some_dictionary = function (d,document) local f = dictionarytotable(d,true) local t = setmetatable({ __raw__ = f, __type__ = dictionary_object_code }, { - __index = function(t,k) - return get_value(document,f,k) - end, - __call = function(t,k) - return get_flagged(t,f,k) - end, + __index = function(t,k) + return get_value(document,f,k) + end, + __call = function(t) + return get_flagged(t,f) + end, } ) return t, "dictionary" end @@ -245,8 +323,8 @@ some_array = function (a,document) __index = function(t,k) return get_value(document,f,k) end, - __call = function(t,k) - return get_flagged(t,f,k) + __call = function(t) + return get_flagged(t,f) end, __len = function(t,k) return n @@ -261,8 +339,10 @@ some_stream = function(s,d,document) __index = function(t,k) return get_value(document,f,k) end, - __call = function(t,raw) - if raw == false then + __call = function(t,how) + if how == "dictionary" then + return get_flagged(t,f) + elseif how == false then return readwholestream(s,false) -- original else return readwholestream(s,true) -- uncompressed @@ -293,6 +373,20 @@ some_reference = function(r,document) return cached end +local function some_object(document,n) + local kind, object, b, c = getfromobject(document.__data__,n) + if kind == dictionary_object_code then + return some_dictionary(object,document) + elseif kind == array_object_code then + return some_array(object,document) + elseif kind == stream_object_code then + return some_stream(object,b,document) + else + -- really cache this? + return { kind, object, b, c } + end +end + local resolvers = { } lpdf_epdf.resolvers = resolvers @@ -460,12 +554,14 @@ function lpdf_epdf.load(filename,userpassword,ownerpassword,fromstring) __data__ = false end if __data__ then + local __cache__ = { } + local __xrefs__ = { } document = { filename = filename, nofcopied = 0, copied = { }, - __cache__ = { }, - __xrefs__ = { }, + __cache__ = __cache__, + __xrefs__ = __xrefs__, __fonts__ = { }, __copied__ = { }, __data__ = __data__, @@ -479,6 +575,17 @@ function lpdf_epdf.load(filename,userpassword,ownerpassword,fromstring) document.majorversion, document.minorversion = getversion(__data__) -- document.nofpages = getnofpages(__data__) + -- we could also use cached but this proxy hides it + -- setmetatableindex(__cache__,function(t,objnum) + document.objects = setmetatableindex(function(t,objnum) + local cached = __cache__[objnum] + if not cached then + cached = some_object(document,objnum) + __cache__[objnum] = cached + __xrefs__[cached] = objnum + end + return cached + end) else document = false end @@ -1173,11 +1280,11 @@ if images then do end lpdf_epdf.image = { - open = openpdf, - close = closepdf, - new = newpdf, - query = querypdf, - copy = copypage, + open = openpdf, + close = closepdf, + new = newpdf, + query = querypdf, + copy = copypage, } -- lpdf.injectors.pdf = function(specification) diff --git a/tex/context/base/mkxl/mlib-lmp.lmt b/tex/context/base/mkxl/mlib-lmp.lmt index 5608488a3..01c72e4ba 100644 --- a/tex/context/base/mkxl/mlib-lmp.lmt +++ b/tex/context/base/mkxl/mlib-lmp.lmt @@ -403,6 +403,21 @@ do registerdirect("mode", function() injectboolean(modes [scanstring()] and true or false) end) registerdirect("systemmode", function() injectboolean(systemmodes[scanstring()] and true or false) end) + -- for compatibility reasons we keep this (metafun manual): + + local modes = tex.modes + local systemmodes = tex.systemmodes + + function mp.mode(s) + injectboolean(modes[s] and true or false) + end + + function mp.systemmode(s) + injectboolean(systemmodes[s] and true or false) + end + + mp.processingmode = mp.mode + end -- for alan's nodes: diff --git a/tex/context/base/mkxl/mlib-pdf.lmt b/tex/context/base/mkxl/mlib-pdf.lmt index ec13ef289..f537743aa 100644 --- a/tex/context/base/mkxl/mlib-pdf.lmt +++ b/tex/context/base/mkxl/mlib-pdf.lmt @@ -457,6 +457,7 @@ function metapost.flush(specification,result) local object = objects[o] if stack == object.stacking then local objecttype = object.type + -- print(i,o,stack,objecttype) if objecttype == "fill" or objecttype == "outline" then -- we use an indirect table as we want to overload -- entries but this is not possible in userdata diff --git a/tex/context/base/mkxl/page-mix.mkxl b/tex/context/base/mkxl/page-mix.mkxl index 446185e43..32af22114 100644 --- a/tex/context/base/mkxl/page-mix.mkxl +++ b/tex/context/base/mkxl/page-mix.mkxl @@ -580,6 +580,7 @@ \d_page_mix_max_width\dimexpr\d_page_mix_max_width-\leftskip-\rightskip\relax \d_page_mix_leftskip \leftskip \d_page_mix_rightskip\rightskip + % \frozen ? \leftskip \zeropoint \rightskip\zeropoint % diff --git a/tex/context/base/mkxl/spac-ali.mkxl b/tex/context/base/mkxl/spac-ali.mkxl index 3ad3dcb91..d6043b4da 100644 --- a/tex/context/base/mkxl/spac-ali.mkxl +++ b/tex/context/base/mkxl/spac-ali.mkxl @@ -718,6 +718,7 @@ \defcsname\??aligncommand\v!nothyphenated \endcsname{\toksapp\t_spac_align_collected{\nohyphens}} \defcsname\??aligncommand\v!collapsed \endcsname{\toksapp\t_spac_align_collected{\dohyphencollapsing}} \defcsname\??aligncommand\v!notcollapsed \endcsname{\toksapp\t_spac_align_collected{\nohyphencollapsing}} +\defcsname\??aligncommand\v!explicit \endcsname{\toksapp\t_spac_align_collected{\nohyphens\doexplicithyphens}} \defcsname\??aligncommand\v!tolerant \endcsname{\toksapp\t_spac_align_collected{\spac_align_set_tolerant}} \defcsname\??aligncommand\v!verytolerant \endcsname{\toksapp\t_spac_align_collected{\spac_align_set_very_tolerant}} @@ -872,7 +873,7 @@ \defcsname\??alignhorizontal\v!flushright\endcsname{\enforced\let\raggedbox\spac_align_horizontal_flushright} \defcsname\??alignhorizontal\v!center \endcsname{\enforced\let\raggedbox\spac_align_horizontal_center} -% The next one can be in use so we keep it around but oen should +% The next one can be in use so we keep it around but one should % be aware of possible interference. \permanent\protected\def\setraggedskips#1#2#3#4#5#6#7% never change this name (todo: inline this one .. less tracingall) diff --git a/tex/context/base/mkxl/strc-itm.mklx b/tex/context/base/mkxl/strc-itm.mklx index efead3d83..65df80f32 100644 --- a/tex/context/base/mkxl/strc-itm.mklx +++ b/tex/context/base/mkxl/strc-itm.mklx @@ -966,12 +966,12 @@ \let\startcollectitems\relax \let\stopcollectitems \relax -\letvalue{\??itemgroupalign\v!flushleft }\relax -\letvalue{\??itemgroupalign\v!right }\relax -\letvalue{\??itemgroupalign\v!flushright}\hfill -\letvalue{\??itemgroupalign\v!left }\hfill -\letvalue{\??itemgroupalign\v!middle }\hfil -\letvalue{\??itemgroupalign\v!center }\hfil +\letcsname\??itemgroupalign\v!flushleft \endcsname\relax +\letcsname\??itemgroupalign\v!right \endcsname\relax +\letcsname\??itemgroupalign\v!flushright\endcsname\hfill +\letcsname\??itemgroupalign\v!left \endcsname\hfill +\letcsname\??itemgroupalign\v!middle \endcsname\hfil +\letcsname\??itemgroupalign\v!center \endcsname\hfil \def\strc_itemgroups_left_sym_filler {\csname\??itemgroupalign\itemgroupparameter\c!symalign\endcsname} @@ -979,10 +979,10 @@ % symbols + states \def\strc_itemgroups_store_global_symbol#symbol% - {\letgvalue{\??itemgroupglobal\currentitemgroup:\currentitemlevel}#symbol} + {\gletcsname\??itemgroupglobal\currentitemgroup:\currentitemlevel\endcsname#symbol} \def\strc_itemgroups_store_local_symbol#symbol% - {\letgvalue{\??itemgrouplocal\currentitemgroup:\currentitemlevel}#symbol} + {\gletcsname\??itemgrouplocal\currentitemgroup:\currentitemlevel\endcsname#symbol} \def\strc_itemgroups_fetch_global_symbol {\csname\??itemgroupglobal\currentitemgroup:\currentitemlevel\endcsname} @@ -1336,13 +1336,13 @@ \protected\permanent\def\stopspecialitemgroupitem % todo: frozen {\stopitemgroupitem} -\letvalue{\??itemgroupstart\v!item}\strc_itemgroups_start_do_item -\letvalue{\??itemgroupstart\v!sub }\strc_itemgroups_start_subitem -\letvalue{\??itemgroupstart\v!sym }\strc_itemgroups_start_symbol -\letvalue{\??itemgroupstart\v!ran }\strc_itemgroups_start_edge -\letvalue{\??itemgroupstart\v!its }\strc_itemgroups_start_items -\letvalue{\??itemgroupstart\v!mar }\strc_itemgroups_start_margin -\letvalue{\??itemgroupstart\v!txt }\strc_itemgroups_start_text +\letcsname\??itemgroupstart\v!item\endcsname\strc_itemgroups_start_do_item +\letcsname\??itemgroupstart\v!sub \endcsname\strc_itemgroups_start_subitem +\letcsname\??itemgroupstart\v!sym \endcsname\strc_itemgroups_start_symbol +\letcsname\??itemgroupstart\v!ran \endcsname\strc_itemgroups_start_edge +\letcsname\??itemgroupstart\v!its \endcsname\strc_itemgroups_start_items +\letcsname\??itemgroupstart\v!mar \endcsname\strc_itemgroups_start_margin +\letcsname\??itemgroupstart\v!txt \endcsname\strc_itemgroups_start_text \def\strc_itemgroups_optimize_breaks {\ifcase\c_strc_itemgroups_column_depth diff --git a/tex/context/base/mkxl/strc-mar.mkxl b/tex/context/base/mkxl/strc-mar.mkxl index 9067b4924..fcce83173 100644 --- a/tex/context/base/mkxl/strc-mar.mkxl +++ b/tex/context/base/mkxl/strc-mar.mkxl @@ -93,14 +93,20 @@ {} \tolerant\def\strc_markings_get_yes[#1]#*[#2]#*[#3]% - {\ifcstok{\namedmarkingparameter{#1}\c!state}\v!start + {\ifarguments\orelse\ifcstok{\namedmarkingparameter{#1}\c!state}\v!start \begingroup \setsystemmode\v!marking \the\everymarking \ifparameter#3\or - \clf_getmarking{#1}{#2}{#3}% + \ifcstok{#2}\v!page + \markingcommand{#1}{\csname\??markingfilter#3\endcsname{#1}}% + \else + \markingcommand{#1}{\clf_getsynchronizedmarking\begincsname\??markingclass#1\endcsname{#2}{#3}}% + \fi + \orelse\ifparameter#2\or + \markingcommand{#1}{\csname\??markingfilter#2\endcsname{#1}}% \else - \clf_getmarking{#1}{\v!page}{#2}% + \markingcommand{#1}{\csname\??markingfilter\v!default\endcsname{#1}}% \fi \endgroup \fi} diff --git a/tex/context/base/mkxl/strc-not.lmt b/tex/context/base/mkxl/strc-not.lmt index df3b00d78..e05228b2b 100644 --- a/tex/context/base/mkxl/strc-not.lmt +++ b/tex/context/base/mkxl/strc-not.lmt @@ -509,9 +509,9 @@ local function check_spacing(index,slot) local pt = pn + pi local mt = mn + mi if trace_insert then - report_insert("%s %i: %p plus %p minus %p","always ",n,gn,pn,mn) - report_insert("%s %i: %p plus %p minus %p",i > 1 and "inbetween" or "before ",n,gi,pi,mi) - report_insert("%s %i: %p plus %p minus %p","effective",n,gt,pt,mt) + report_insert("%s %i: %p plus %p minus %p","always ",index,gn,pn,mn) + report_insert("%s %i: %p plus %p minus %p",slot > 1 and "inbetween" or "before ",index,gi,pi,mi) + report_insert("%s %i: %p plus %p minus %p","effective",index,gt,pt,mt) end return gt, pt, mt end diff --git a/tex/context/base/mkxl/typo-drp.lmt b/tex/context/base/mkxl/typo-drp.lmt index de65dd55d..c62b5e718 100644 --- a/tex/context/base/mkxl/typo-drp.lmt +++ b/tex/context/base/mkxl/typo-drp.lmt @@ -73,6 +73,7 @@ local v_default = variables.default local v_margin = variables.margin local v_auto = variables.auto local v_first = variables.first +local v_keep = variables.keep local v_last = variables.last local texget = tex.get @@ -130,6 +131,7 @@ interfaces.implement { -- a page so this has a low priority actions[v_default] = function(head,setting) + local skip = false -- begin of par local first = getnext(head) local indent = false @@ -193,6 +195,9 @@ actions[v_default] = function(head,setting) else -- keep quote etc with initial local next = getnext(first) + if next and method[v_keep] then + skip = first + end if not next then -- don't start with a quote or so return head @@ -242,7 +247,7 @@ actions[v_default] = function(head,setting) local id = getid(current) if id == kern_code then setkern(current,0) - elseif id == glyph_code then + elseif id == glyph_code and skip ~= current then local next = getnext(current) if font then setfont(current,font) @@ -289,7 +294,11 @@ actions[v_default] = function(head,setting) -- local hoffset = width + hoffset + distance + (indent and parindent or 0) for current in nextglyph, first do - setoffsets(current,-hoffset,-voffset) -- no longer - height here + if skip == current then + setoffsets(current,-hoffset,0) + else + setoffsets(current,-hoffset,-voffset) -- no longer - height here + end if current == last then break end |