From 3a75fc96a5e7607afbead86fd9a3a9a8831494aa Mon Sep 17 00:00:00 2001 From: Hans Hagen Date: Sun, 13 Dec 2009 23:27:00 +0100 Subject: beta 2009.12.13 23:27 --- tex/context/base/attr-ini.mkiv | 1 + tex/context/base/bibl-tra.mkiv | 28 ++- tex/context/base/colo-ini.mkiv | 19 ++ tex/context/base/cont-new.mkiv | 2 + tex/context/base/cont-new.tex | 2 +- tex/context/base/context-base.lmx | 67 ++++++-- tex/context/base/context.mkiv | 4 +- tex/context/base/context.tex | 2 +- tex/context/base/core-job.mkiv | 3 +- tex/context/base/data-lua.lua | 84 ++++++++- tex/context/base/data-pre.lua | 10 ++ tex/context/base/data-res.lua | 9 +- tex/context/base/data-tmf.lua | 2 +- tex/context/base/font-syn.lua | 38 +++- tex/context/base/grph-inc.lua | 1 + tex/context/base/l-dir.lua | 29 ++++ tex/context/base/l-lpeg.lua | 2 + tex/context/base/l-os.lua | 111 ++++++------ tex/context/base/l-string.lua | 14 ++ tex/context/base/l-unicode.lua | 25 ++- tex/context/base/l-xml.lua | 12 +- tex/context/base/lpdf-ini.mkiv | 9 + tex/context/base/lxml-mis.lua | 2 +- tex/context/base/lxml-tex.lua | 11 +- tex/context/base/math-dim.lua | 5 +- tex/context/base/node-rul.mkiv | 13 +- tex/context/base/node-tra.lua | 11 +- tex/context/base/page-set.mkii | 7 +- tex/context/base/page-set.mkiv | 6 +- tex/context/base/spac-hor.mkiv | 2 +- tex/context/base/strc-pag.mkiv | 4 + tex/context/base/strc-ref.lua | 21 ++- tex/context/base/strc-ref.mkiv | 21 ++- tex/context/base/syst-ini.tex | 4 +- tex/context/base/trac-deb.lua | 53 ++---- tex/context/base/trac-lmx.lua | 258 +++++++++++++++++----------- tex/context/base/trac-tim.lua | 58 +++---- tex/context/base/typo-spa.lua | 2 +- tex/context/base/verb-eif.mkii | 2 +- tex/context/base/verb-ini.mkii | 25 +-- tex/context/base/verb-js.mkii | 2 +- tex/context/base/verb-jv.mkii | 2 +- tex/context/base/verb-pas.mkii | 2 +- tex/context/base/verb-raw.mkii | 6 +- tex/context/base/verb-sql.mkii | 2 +- tex/context/base/x-dir-05.mkii | 51 ++++++ tex/context/base/x-dir-05.mkiv | 72 ++++++++ tex/context/interface/cont-cs.xml | 5 + tex/context/interface/cont-de.xml | 5 + tex/context/interface/cont-en.xml | 5 + tex/context/interface/cont-fr.xml | 5 + tex/context/interface/cont-it.xml | 5 + tex/context/interface/cont-nl.xml | 5 + tex/context/interface/cont-pe.xml | 5 + tex/context/interface/cont-ro.xml | 5 + tex/generic/context/luatex-fonts-merged.lua | 18 +- 56 files changed, 828 insertions(+), 346 deletions(-) create mode 100644 tex/context/base/x-dir-05.mkii create mode 100644 tex/context/base/x-dir-05.mkiv (limited to 'tex') diff --git a/tex/context/base/attr-ini.mkiv b/tex/context/base/attr-ini.mkiv index 49a109e7d..b04282fb8 100644 --- a/tex/context/base/attr-ini.mkiv +++ b/tex/context/base/attr-ini.mkiv @@ -50,6 +50,7 @@ \definesystemattribute[reference] \chardef\referenceattribute \dogetattributeid{reference} \definesystemattribute[destination] \chardef\destinationattribute \dogetattributeid{destination} \definesystemattribute[graphicvadjust] \chardef\graphicvadjustattribute \dogetattributeid{graphicvadjust} +\definesystemattribute[ruled] \chardef\ruledattribute \dogetattributeid{ruled} % \definesystemattribute[ignore] % diff --git a/tex/context/base/bibl-tra.mkiv b/tex/context/base/bibl-tra.mkiv index 9648c068a..29a687025 100644 --- a/tex/context/base/bibl-tra.mkiv +++ b/tex/context/base/bibl-tra.mkiv @@ -288,7 +288,8 @@ {\showmessage\m!publications{1}{bibl-\@@pbalternative}}% \let\@@pbalternative\empty}% \getparameters[\??pb][#1]% as bibl-* can have set things back - \the\everysetuppublications} + \the\everysetuppublications + \ignorespaces} %D We can omit already shown references (\v!global) or use fresh %D lists each time (\v!local). @@ -334,11 +335,25 @@ \def\usepublications[#1]% {\processcommalist[#1]\dousepublications} +% \def\dousepublications#1% +% {\doonlyonce{#1.\f!bibextension} +% {\readfile{#1.\f!bibextension} +% {\showmessage\m!publications{4}{#1.\f!bibextension}} +% {\showmessage\m!publications{2}{#1.\f!bibextension}}}} + \def\dousepublications#1% - {\doonlyonce{#1.\f!bibextension} - {\readfile{#1.\f!bibextension} - {\showmessage\m!publications{4}{#1.\f!bibextension}} - {\showmessage\m!publications{2}{#1.\f!bibextension}}}} + {\doonlyonce{#1.\f!bibextension}{\dodousepublications{#1}}} + +\def\dodousepublications#1% + {\let\@@savedpar\par + \let\par\ignorespaces + \ifhmode\kern\zeropoint\fi + \readfile{#1.\f!bibextension} + {\showmessage\m!publications{4}{#1.\f!bibextension}} + {\showmessage\m!publications{2}{#1.\f!bibextension}}% + \ifhmode\removeunwantedspaces\fi + \let\par\@@savedpar} + %D \macros{setuppublicationlist} %D @@ -740,7 +755,8 @@ \@@pbo\noexpand\or \@@pbu\noexpand\or \normalunexpanded{#2}\noexpand\fi}% - \endgroup} + \endgroup + \ignorespaces} \def\bibgetvark#1{\csname pbd:#1\endcsname\plusone } \def\bibgetvara#1{\csname pbd:#1\endcsname\plustwo } diff --git a/tex/context/base/colo-ini.mkiv b/tex/context/base/colo-ini.mkiv index cde9f5820..68636a23c 100644 --- a/tex/context/base/colo-ini.mkiv +++ b/tex/context/base/colo-ini.mkiv @@ -159,6 +159,25 @@ \let\grey\graycolor +%D Stacking: + +% \colormodelattribute \colorattribute \transparencyattribute + +\newcount\currentcolornesting + +\unexpanded\def\pushcolor[#1]% + {\global\advance\currentcolornesting\plusone + \expandafter\edef\csname\??cl:s:\number\currentcolornesting\endcsname + {\attribute\colormodelattribute \the\colormodelattribute + \attribute\colorattribute \the\colorattribute + \attribute\transparencyattribute\the\transparencyattribute + \space}% stack + \doactivatecolor{#1}} + +\unexpanded\def\popcolor + {\csname\??on:s:\number\currentcolornesting\endcsname + \global\advance\currentcolornesting\minusone} + %D \macros %D {startcurrentcolor,stopcurrentcolor} diff --git a/tex/context/base/cont-new.mkiv b/tex/context/base/cont-new.mkiv index 93a1c17c2..fb5112020 100644 --- a/tex/context/base/cont-new.mkiv +++ b/tex/context/base/cont-new.mkiv @@ -29,6 +29,8 @@ \unprotect +\def\immediatemessage#1{\ctxlua{commands.writestatus("message","#1")}} + % % % % % % needs testing but saves runtime \let\checknotes\relax % probably not needed, checking already done diff --git a/tex/context/base/cont-new.tex b/tex/context/base/cont-new.tex index 67d2d13ac..0ffa84f19 100644 --- a/tex/context/base/cont-new.tex +++ b/tex/context/base/cont-new.tex @@ -11,7 +11,7 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -\newcontextversion{2009.12.01 17:09} +\newcontextversion{2009.12.13 23:27} %D This file is loaded at runtime, thereby providing an %D excellent place for hacks, patches, extensions and new diff --git a/tex/context/base/context-base.lmx b/tex/context/base/context-base.lmx index 5c96b4979..e84202cb3 100644 --- a/tex/context/base/context-base.lmx +++ b/tex/context/base/context-base.lmx @@ -14,25 +14,62 @@ <?lua pv('title') ?> + 0) and v('refreshurl') then ?> + + + +
+ -
- -
-
- -
- -
-
-
-
- -
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+ diff --git a/tex/context/base/context.mkiv b/tex/context/base/context.mkiv index 347beb0b3..51f5d92d4 100644 --- a/tex/context/base/context.mkiv +++ b/tex/context/base/context.mkiv @@ -20,8 +20,8 @@ \loadcorefile{syst-ini} -\ifnum\luatexversion<43 % also change message - \writestatus{!!!!}{Your luatex binary is way too old, you need at least version 0.43!} +\ifnum\luatexversion<47 % also change message + \writestatus{!!!!}{Your luatex binary is too old, you need at least version 0.47!} \expandafter\end \fi diff --git a/tex/context/base/context.tex b/tex/context/base/context.tex index 9c9b58f83..d6a4d6897 100644 --- a/tex/context/base/context.tex +++ b/tex/context/base/context.tex @@ -20,7 +20,7 @@ %D your styles an modules. \edef\contextformat {\jobname} -\edef\contextversion{2009.12.01 17:09} +\edef\contextversion{2009.12.13 23:27} %D For those who want to use this: diff --git a/tex/context/base/core-job.mkiv b/tex/context/base/core-job.mkiv index 4333b3c69..71d4e4d30 100644 --- a/tex/context/base/core-job.mkiv +++ b/tex/context/base/core-job.mkiv @@ -124,7 +124,8 @@ \def\stoptext {\global\advance\textlevel\minusone \ifnum\textlevel>\zerocount \else - \page[\v!last]\page % new, moved from everybye to here; flushes headers, colors etc etc etc + \flushfinallayoutpage % optional + \page % anyway \the\everystoptext %\the\everybye % %\the\everygoodbye % == \end (new) diff --git a/tex/context/base/data-lua.lua b/tex/context/base/data-lua.lua index d7f6fdcf5..3005d5176 100644 --- a/tex/context/base/data-lua.lua +++ b/tex/context/base/data-lua.lua @@ -14,43 +14,109 @@ local trace_locating = false trackers.register("resolvers.locating", function(v local gsub = string.gsub -local libformats = { 'luatexlibs', 'tex', 'texmfscripts', 'othertextfiles' } -local libpaths = file.split_path(package.path) +local libformats = { 'luatexlibs', 'tex', 'texmfscripts', 'othertextfiles' } -- 'luainputs' +local clibformats = { 'lib' } +local libpaths = file.split_path(package.path) +local clibpaths = file.split_path(package.cpath) + +local function thepath(...) + local t = { ... } t[#t+1] = "?.lua" + local path = file.join(unpack(t)) + if trace_locating then + logs.report("fileio","! appending '%s' to 'package.path'",path) + end + return path +end + +function package.append_libpath(...) + table.insert(libpaths,thepath(...)) +end + +function package.prepend_libpath(...) + table.insert(libpaths,1,thepath(...)) +end + +-- beware, we need to return a loadfile result ! package.loaders[2] = function(name) -- was [#package.loaders+1] ---~ package.loaders[#package.loaders+1] = function(name) -- was + if trace_locating then -- mode detail + logs.report("fileio","! locating '%s'",name) + end for i=1,#libformats do local format = libformats[i] local resolved = resolvers.find_file(name,format) or "" + if trace_locating then -- mode detail + logs.report("fileio","! checking for '%s' using 'libformat path': '%s'",name,format) + end if resolved ~= "" then if trace_locating then logs.report("fileio","! lib '%s' located via environment: '%s'",name,resolved) end - return function() return dofile(resolved) end + return loadfile(resolved) end end - local simple = file.removesuffix(name) + local simple = gsub(name,"%.lua$","") + local simple = gsub(simple,"%.","/") for i=1,#libpaths do -- package.path, might become option - local resolved = gsub(libpaths[i],"?",simple) + local libpath = libpaths[i] + local resolved = gsub(libpath,"?",simple) + if trace_locating then -- more detail + logs.report("fileio","! checking for '%s' on 'package.path': '%s'",simple,libpath) + end if resolvers.isreadable.file(resolved) then if trace_locating then logs.report("fileio","! lib '%s' located via 'package.path': '%s'",name,resolved) end - return function() return dofile(resolved) end + return loadfile(resolved) + end + end + local libname = file.addsuffix(simple,os.libsuffix) + for i=1,#clibformats do + -- better have a dedicated loop + local format = clibformats[i] + local paths = resolvers.expanded_path_list_from_var(format) + for p=1,#paths do + local path = paths[p] + local resolved = file.join(path,libname) + if trace_locating then -- mode detail + logs.report("fileio","! checking for '%s' using 'clibformat path': '%s'",libname,path) + end + if resolvers.isreadable.file(resolved) then + if trace_locating then + logs.report("fileio","! lib '%s' located via 'clibformat': '%s'",libname,resolved) + end + return package.loadlib(resolved,name) + end + end + end + for i=1,#clibpaths do -- package.path, might become option + local libpath = clibpaths[i] + local resolved = gsub(libpath,"?",simple) + if trace_locating then -- more detail + logs.report("fileio","! checking for '%s' on 'package.cpath': '%s'",simple,libpath) + end + if resolvers.isreadable.file(resolved) then + if trace_locating then + logs.report("fileio","! lib '%s' located via 'package.cpath': '%s'",name,resolved) + end + return package.loadlib(resolved,name) end end -- just in case the distribution is messed up + if trace_loading then -- more detail + logs.report("fileio","! checking for '%s' using 'luatexlibs': '%s'",name) + end local resolved = resolvers.find_file(file.basename(name),'luatexlibs') or "" if resolved ~= "" then if trace_locating then logs.report("fileio","! lib '%s' located by basename via environment: '%s'",name,resolved) end - return function() return dofile(resolved) end + return loadfile(resolved) end if trace_locating then logs.report("fileio",'? unable to locate lib: %s',name) end - return "unable to locate " .. name +-- return "unable to locate " .. name end resolvers.loadlualib = require diff --git a/tex/context/base/data-pre.lua b/tex/context/base/data-pre.lua index 26843d21c..9936cd508 100644 --- a/tex/context/base/data-pre.lua +++ b/tex/context/base/data-pre.lua @@ -66,6 +66,16 @@ prefixes.full = prefixes.locate prefixes.file = prefixes.filename prefixes.path = prefixes.pathname +function resolvers.allprefixes(separator) + local all = table.sortedkeys(prefixes) + if separator then + for i=1,#all do + all[i] = all[i] .. ":" + end + end + return all +end + local function _resolve_(method,target) if prefixes[method] then return prefixes[method](target) diff --git a/tex/context/base/data-res.lua b/tex/context/base/data-res.lua index 4305d0bed..d15046e80 100644 --- a/tex/context/base/data-res.lua +++ b/tex/context/base/data-res.lua @@ -124,6 +124,11 @@ formats ['sfd'] = 'SFDFONTS' suffixes ['sfd'] = { 'sfd' } alternatives['subfont definition files'] = 'sfd' +-- lib paths + +formats ['lib'] = 'CLUAINPUTS' -- new (needs checking) +suffixes['lib'] = (os.libsuffix and { os.libsuffix }) or { 'dll', 'so' } + -- In practice we will work within one tds tree, but i want to keep -- the option open to build tools that look at multiple trees, which is -- why we keep the tree specific data in a table. We used to pass the @@ -1343,9 +1348,9 @@ end function resolvers.expanded_path_list_from_var(str) -- brrr local tmp = resolvers.var_of_format_or_suffix(gsub(str,"%$","")) if tmp ~= "" then - return resolvers.expanded_path_list(str) - else return resolvers.expanded_path_list(tmp) + else + return resolvers.expanded_path_list(str) end end diff --git a/tex/context/base/data-tmf.lua b/tex/context/base/data-tmf.lua index 4ba8c388d..e02f7f866 100644 --- a/tex/context/base/data-tmf.lua +++ b/tex/context/base/data-tmf.lua @@ -11,7 +11,7 @@ if not modules then modules = { } end modules ['data-tmf'] = { function resolvers.check_environment(tree) logs.simpleline() os.setenv('TMP', os.getenv('TMP') or os.getenv('TEMP') or os.getenv('TMPDIR') or os.getenv('HOME')) - os.setenv('TEXOS', os.getenv('TEXOS') or ("texmf-" .. os.currentplatform())) + os.setenv('TEXOS', os.getenv('TEXOS') or ("texmf-" .. os.platform)) os.setenv('TEXPATH', (tree or "tex"):gsub("\/+$",'')) os.setenv('TEXMFOS', os.getenv('TEXPATH') .. "/" .. os.getenv('TEXOS')) logs.simpleline() diff --git a/tex/context/base/font-syn.lua b/tex/context/base/font-syn.lua index b59f1f6e8..c331d6065 100644 --- a/tex/context/base/font-syn.lua +++ b/tex/context/base/font-syn.lua @@ -651,6 +651,29 @@ local function analysefiles() data.statistics.readfiles, data.statistics.skippedfiles = totalnofread, totalnofskipped end +local function rejectclashes() -- just to be sure, so no explicit afm will be found then + local specifications, used, okay = names.data.specifications, { }, { } + for i=1,#specifications do + local s = specifications[i] + local f = s.fontname + if f then + local fnd, fnm = used[f], s.filename + if fnd then + logs.report("fontnames", "fontname '%s' clashes, rejecting '%s' in favor of '%s'",f,fnm,fnd) + else + used[f], okay[#okay+1] = fnm, s + end + else + okay[#okay+1] = s + end + end + local d = #specifications - #okay + if d > 0 then + logs.report("fontnames", "%s files rejected due to clashes",d) + end + names.data.specifications = okay +end + local function resetdata() local mappings, fallbacks = { }, { } for _, k in next, filters.list do @@ -670,12 +693,12 @@ end function names.identify() resetdata() analysefiles() + rejectclashes() collectstatistics() cleanupkeywords() collecthashes() checkduplicates() -- sorthashes() -- will be resorted when saved - --~ logs.report("fontnames", "%s files read, %s normal and %s extra entries added, %s rejected, %s valid",totalread,totalok,added,rejected,totalok+added-rejected) end @@ -838,7 +861,7 @@ local function foundname(name,sub) end end -function names.resolve(askedname,sub) +function names.resolvedspecification(askedname,sub) if askedname and askedname ~= "" and names.enabled then askedname = cleanname(askedname) names.load() @@ -846,9 +869,14 @@ function names.resolve(askedname,sub) if not found and is_reloaded() then found = foundname(askedname,sub) end - if found then - return found.filename, found.subfont and found.rawname - end + return found + end +end + +function names.resolve(askedname,sub) + local found = names.resolvedspecification(askedname,sub) + if found then + return found.filename, found.subfont and found.rawname end end diff --git a/tex/context/base/grph-inc.lua b/tex/context/base/grph-inc.lua index ff8a78f0f..25adcead5 100644 --- a/tex/context/base/grph-inc.lua +++ b/tex/context/base/grph-inc.lua @@ -666,6 +666,7 @@ function figures.includers.generic(data) end if figure then local n = figures.boxnumber + -- it looks like we have a leak in attributes here .. todo tex.box[n] = node.hpack(img.node(figure)) -- tex.box[n] = img.node(figure) -- img.write(figure) -- assigning img.node directly no longer valid tex.wd[n], tex.ht[n], tex.dp[n] = figure.width, figure.height, 0 -- new, hm, tricky, we need to do that in tex (yet) diff --git a/tex/context/base/l-dir.lua b/tex/context/base/l-dir.lua index db0737e5b..7ee565b30 100644 --- a/tex/context/base/l-dir.lua +++ b/tex/context/base/l-dir.lua @@ -41,6 +41,35 @@ end dir.glob_pattern = glob_pattern +local function collect_pattern(path,patt,recurse,result) + local ok, scanner + result = result or { } + if path == "/" then + ok, scanner = xpcall(function() return walkdir(path..".") end, function() end) -- kepler safe + else + ok, scanner = xpcall(function() return walkdir(path) end, function() end) -- kepler safe + end + if ok and type(scanner) == "function" then + if not find(path,"/$") then path = path .. '/' end + for name in scanner do + local full = path .. name + local attr = attributes(full) + local mode = attr.mode + if mode == 'file' then + if find(full,patt) then + result[name] = attr + end + elseif recurse and (mode == "directory") and (name ~= '.') and (name ~= "..") then + attr.list = collect_pattern(full,patt,recurse) + result[name] = attr + end + end + end + return result +end + +dir.collect_pattern = collect_pattern + local P, S, R, C, Cc, Cs, Ct, Cv, V = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.Cc, lpeg.Cs, lpeg.Ct, lpeg.Cv, lpeg.V local pattern = Ct { diff --git a/tex/context/base/l-lpeg.lua b/tex/context/base/l-lpeg.lua index afe941e9d..d1e0dfafb 100644 --- a/tex/context/base/l-lpeg.lua +++ b/tex/context/base/l-lpeg.lua @@ -6,6 +6,8 @@ if not modules then modules = { } end modules ['l-lpeg'] = { license = "see context related readme files" } +lpeg = require("lpeg") + local P, R, S, Ct, C, Cs, Cc = lpeg.P, lpeg.R, lpeg.S, lpeg.Ct, lpeg.C, lpeg.Cs, lpeg.Cc --~ l-lpeg.lua : diff --git a/tex/context/base/l-os.lua b/tex/context/base/l-os.lua index db8795253..dcf8d3e95 100644 --- a/tex/context/base/l-os.lua +++ b/tex/context/base/l-os.lua @@ -70,67 +70,74 @@ end --~ print(os.date("%H:%M:%S",os.gettimeofday())) --~ print(os.date("%H:%M:%S",os.time())) -os.arch = os.arch or function() - local a = os.resultof("uname -m") or "linux" +if os.arch then + -- okay +elseif os.platform == "windows" then os.arch = function() + local a = os.getenv("PROCESSOR_ARCHITECTURE") or "x86" + os.arch = function() + return a + end + return a + end +else + os.arch = function() + local a = os.getenv("PROCESSOR_ARCHITECTURE") or os.resultof("uname -m") or "x86" + os.arch = function() + return a + end return a end - return a end -local platform - -function os.currentplatform(name,default) - if not platform then - local name = os.name or os.platform or name -- os.name is built in, os.platform is mine - if not name then - platform = default or "linux" - elseif name == "windows" or name == "mswin" or name == "win32" or name == "msdos" then - if os.getenv("PROCESSOR_ARCHITECTURE") == "AMD64" then - platform = "mswin-64" - else - platform = "mswin" - end +-- no need for function anymore as we have more clever code and helpers now + +os.platform = os.name +os.libsuffix = 'so' + +local name = os.name + +if name == "windows" or name == "mswin" or name == "win32" or name == "msdos" then + if os.getenv("PROCESSOR_ARCHITECTURE") == "AMD64" then + os.platform = "mswin-64" + else + os.platform = "mswin" + end + os.libsuffix = 'dll' +else + local architecture = os.arch() + if name == "linux" then + if find(architecture,"x86_64") then + os.platform = "linux-64" + elseif find(architecture,"ppc") then + os.platform = "linux-ppc" + else + os.platform = "linux" + end + elseif name == "macosx" then + local architecture = os.resultof("echo $HOSTTYPE") + if find(architecture,"i386") then + os.platform = "osx-intel" + elseif find(architecture,"x86_64") then + os.platform = "osx-64" else - local architecture = os.arch() - if name == "linux" then - if find(architecture,"x86_64") then - platform = "linux-64" - elseif find(architecture,"ppc") then - platform = "linux-ppc" - else - platform = "linux" - end - elseif name == "macosx" then - local architecture = os.resultof("echo $HOSTTYPE") - if find(architecture,"i386") then - platform = "osx-intel" - elseif find(architecture,"x86_64") then - platform = "osx-64" - else - platform = "osx-ppc" - end - elseif name == "sunos" then - if find(architecture,"sparc") then - platform = "solaris-sparc" - else -- if architecture == 'i86pc' - platform = "solaris-intel" - end - elseif name == "freebsd" then - if find(architecture,"amd64") then - platform = "freebsd-amd64" - else - platform = "freebsd" - end - else - platform = default or name - end + os.platform = "osx-ppc" end - function os.currentplatform() - return platform + elseif name == "sunos" then + if find(architecture,"sparc") then + os.platform = "solaris-sparc" + else -- if architecture == 'i86pc' + os.platform = "solaris-intel" end + elseif name == "freebsd" then + if find(architecture,"amd64") then + os.platform = "freebsd-amd64" + else + os.platform = "freebsd" + end + else + os.platform = 'linux' end - return platform end -- beware, we set the randomseed diff --git a/tex/context/base/l-string.lua b/tex/context/base/l-string.lua index 0ee6d86d1..c27d7098f 100644 --- a/tex/context/base/l-string.lua +++ b/tex/context/base/l-string.lua @@ -194,6 +194,7 @@ end local simple_escapes = { ["-"] = "%-", ["."] = "%.", + ["?"] = ".", ["*"] = ".*", } @@ -255,3 +256,16 @@ function string:striplong() -- strips newlines and leading spaces self = gsub(self,"[\n\r]+ *","\n") return self end + +function string:topattern(lowercase,strict) + if lowercase then + self = self:lower() + end + self = gsub(self,".",simple_escapes) + if self == "" then + self = ".*" + elseif strict then + self = "^" .. self .. "$" + end + return self +end diff --git a/tex/context/base/l-unicode.lua b/tex/context/base/l-unicode.lua index a3b45028a..290234d56 100644 --- a/tex/context/base/l-unicode.lua +++ b/tex/context/base/l-unicode.lua @@ -6,13 +6,34 @@ if not modules then modules = { } end modules ['l-unicode'] = { license = "see context related readme files" } +if not unicode then + + unicode = { utf8 = { } } + + local floor, char = math.floor, string.char + + function unicode.utf8.utfchar(n) + if n < 0x80 then + return char(n) + elseif n < 0x800 then + return char(0xC0 + floor(n/0x40)) .. char(0x80 + (n % 0x40)) + elseif n < 0x10000 then + return char(0xE0 + floor(n/0x1000)) .. char(0x80 + (floor(n/0x40) % 0x40)) .. char(0x80 + (n % 0x40)) + elseif n < 0x40000 then + return char(0xF0 + floor(n/0x40000)) .. char(0x80 + floor(n/0x1000)) .. char(0x80 + (floor(n/0x40) % 0x40)) .. char(0x80 + (n % 0x40)) + else -- wrong: + -- return char(0xF1 + floor(n/0x1000000)) .. char(0x80 + floor(n/0x40000)) .. char(0x80 + floor(n/0x1000)) .. char(0x80 + (floor(n/0x40) % 0x40)) .. char(0x80 + (n % 0x40)) + return "?" + end + end + +end + utf = utf or unicode.utf8 local concat, utfchar, utfgsub = table.concat, utf.char, utf.gsub local char, byte, find, bytepairs = string.char, string.byte, string.find, string.bytepairs -unicode = unicode or { } - -- 0 EF BB BF UTF-8 -- 1 FF FE UTF-16-little-endian -- 2 FE FF UTF-16-big-endian diff --git a/tex/context/base/l-xml.lua b/tex/context/base/l-xml.lua index 921a4edb1..14e97337b 100644 --- a/tex/context/base/l-xml.lua +++ b/tex/context/base/l-xml.lua @@ -11,13 +11,13 @@ if not modules then modules = { } end modules ['l-xml'] = { -- all is taken care of. if not trackers then - require('trac-tra.lua') + require('trac-tra') end if not xml then - require('lxml-tab.lua') - require('lxml-lpt.lua') - require('lxml-mis.lua') - require('lxml-aux.lua') - require('lxml-xml.lua') + require('lxml-tab') + require('lxml-lpt') + require('lxml-mis') + require('lxml-aux') + require('lxml-xml') end diff --git a/tex/context/base/lpdf-ini.mkiv b/tex/context/base/lpdf-ini.mkiv index cfc416216..bea9a5404 100644 --- a/tex/context/base/lpdf-ini.mkiv +++ b/tex/context/base/lpdf-ini.mkiv @@ -258,4 +258,13 @@ \wd\scratchbox#1\ht\scratchbox#2\dp\scratchbox#3\box\scratchbox \egroup} +\unexpanded\def\pdfactualtext#1#2% + {\pdfliteral direct{/Span <> BDC}% + #1% + \pdfliteral direct{EMC}} + +% \starttext +% text \pdfactualtext{Meier}{Müller} text +% \stoptext + \protect \endinput diff --git a/tex/context/base/lxml-mis.lua b/tex/context/base/lxml-mis.lua index 74c264d0c..864ab75a1 100644 --- a/tex/context/base/lxml-mis.lua +++ b/tex/context/base/lxml-mis.lua @@ -11,7 +11,7 @@ local type, next, tonumber, tostring, setmetatable, loadstring = type, next, ton local format, gsub = string.format, string.gsub --[[ldx-- -

The following helper functions best belong to the lmxl-ini +

The following helper functions best belong to the lxml-ini module. Some are here because we need then in the mk document and other manuals, others came up when playing with this module. Since this module is also used in we've diff --git a/tex/context/base/lxml-tex.lua b/tex/context/base/lxml-tex.lua index 0305b889e..f5ff3b9c8 100644 --- a/tex/context/base/lxml-tex.lua +++ b/tex/context/base/lxml-tex.lua @@ -43,8 +43,6 @@ local trace_comments = false trackers.register("lxml.comments", function(v) tra lxml = lxml or { } lxml.loaded = lxml.loaded or { } -lxml.noffiles = 0 -lxml.nofconverted = 0 local loaded = lxml.loaded @@ -325,8 +323,7 @@ xml.originalload = xml.originalload or xml.load local noffiles, nofconverted = 0, 0 function xml.load(filename) - noffiles = noffiles + 1 - nofconverted = nofconverted + 1 + noffiles, nofconverted = noffiles + 1, nofconverted + 1 starttiming(xml) local ok, data = resolvers.loadbinfile(filename) local xmltable = xml.convert((ok and data) or "") @@ -357,6 +354,7 @@ function lxml.load(id,filename,compress,entities) if trace_loading then commands.writestatus("lxml","loading file '%s' as '%s'",filename,id) end + noffiles, nofconverted = noffiles + 1, nofconverted + 1 -- local xmltable = xml.load(filename) local ok, data = resolvers.loadbinfile(filename) local xmltable = lxml.convert(id,(ok and data) or "",compress,entities) @@ -1301,9 +1299,10 @@ statistics.register("xml load time", function() end) statistics.register("lxml preparation time", function() - if noffiles > 0 or nofconverted > 0 then + local calls, cached = xml.lpathcalls(), xml.lpathcached() + if calls > 0 or cached > 0 then return format("%s seconds, %s nodes, %s lpath calls, %s cached calls", - statistics.elapsedtime(lxml), nofindices, xml.lpathcalls(), xml.lpathcached()) + statistics.elapsedtime(lxml), nofindices, calls, cached) else return nil end diff --git a/tex/context/base/math-dim.lua b/tex/context/base/math-dim.lua index b1e9635ae..754ca8314 100644 --- a/tex/context/base/math-dim.lua +++ b/tex/context/base/math-dim.lua @@ -260,9 +260,8 @@ function mathematics.dimensions(dimens) FractionNumeratorGapMin = t . fraction_num_vgap . text_style, FractionNumeratorShiftUp = t . fraction_num_up . text_style, FractionRuleThickness = t . fraction_rule . text_style, ---~ not yet in my bin : ---~ FractionDelimiterSize = t . fraction_del_size . text_style, ---~ FractionDelimiterDisplayStyleSize = t . fraction_del_size . display_style, + FractionDelimiterSize = t . fraction_del_size . text_style, + FractionDelimiterDisplayStyleSize = t . fraction_del_size . display_style, LowerLimitBaselineDropMin = t . limit_below_bgap . text_style, LowerLimitGapMin = t . limit_below_vgap . text_style, OverbarExtraAscender = t . overbar_kern . text_style, diff --git a/tex/context/base/node-rul.mkiv b/tex/context/base/node-rul.mkiv index ba2f0aed3..0beae198c 100644 --- a/tex/context/base/node-rul.mkiv +++ b/tex/context/base/node-rul.mkiv @@ -1,5 +1,5 @@ %D \module -%D [ file=node-bar, +%D [ file=node-rul, %D version=2009.11.03, % 1995.10.10, %D title=\CONTEXT\ Core Macros, %D subtitle=Bars, @@ -57,8 +57,8 @@ \unprotect -\definesystemattribute[ruled] -\definesystemattribute[shifted] +%definesystemattribute[ruled] +%definesystemattribute[shifted] \registerctxluafile{node-rul}{1.001} @@ -137,15 +137,16 @@ \unexpanded\def\stopbar {\endgroup} -\newcount\currentbarnesting +\newcount\currentbarnesting % todo: same as colors \unexpanded\def\pushbar[#1]% {\global\advance\currentbarnesting\plusone - \setevalue{\??on:s:\number\currentbarnesting}{\dogetattribute{ruled}}% stack + \expandafter\edef\csname\??on:s:\number\currentbarnesting\endcsname + {\attribute\ruledattribute\the\ruledattribute}% stack \dodoruled{#1}} \unexpanded\def\popbar - {\dosetattribute{ruled}{\getvalue{\??on:s:\number\currentbarnesting}}% + {\csname\??on:s:\number\currentbarnesting\endcsname \global\advance\currentbarnesting\minusone} \def\setupbars diff --git a/tex/context/base/node-tra.lua b/tex/context/base/node-tra.lua index f243c9cd0..f709a8a6a 100644 --- a/tex/context/base/node-tra.lua +++ b/tex/context/base/node-tra.lua @@ -137,11 +137,12 @@ function nodes.tracers.characters.start() end function nodes.tracers.characters.stop() tracers.list['characters'] = list - lmx.set('title', 'ConTeXt Character Processing Information') - lmx.set('color-background-one', lmx.get('color-background-yellow')) - lmx.set('color-background-two', lmx.get('color-background-purple')) - lmx.show('context-characters.lmx') - lmx.restore() + local variables = { + ['title'] = 'ConTeXt Character Processing Information', + ['color-background-one'] = lmx.get('color-background-yellow'), + ['color-background-two'] = lmx.get('color-background-purple'), + } + lmx.show('context-characters.lmx',variables) nodes.process_characters = npc tasks.restart("processors", "characters") end diff --git a/tex/context/base/page-set.mkii b/tex/context/base/page-set.mkii index 6724ca979..eb01799ae 100644 --- a/tex/context/base/page-set.mkii +++ b/tex/context/base/page-set.mkii @@ -2277,6 +2277,7 @@ \v!right=>\doglobal\addtocommalist{#1}\columnrightareas]% \getparameters[\??mt#1#2] [\c!x=1,\c!y=1,\c!nx=1,\c!ny=1,\c!clipoffset=2\lineheight, + \c!leftoffset=\zeropoint,\c!rightoffset=\zeropoint, \c!offset=\v!overlay,\c!strut=\v!no,\c!frame=\v!off, \c!type=#2,\c!page=1,\c!state=\v!stop,#3]}}% \else @@ -2427,7 +2428,8 @@ %\c!bottomoffset=\columntextareaparameter\c!clipoffset,% %\c!leftoffset=\columntextareaparameter\c!clipoffset,% \c!offset=\columntextareaparameter\c!clipoffset,% - \c!rightoffset=\zeropoint,% + \c!offset=\columntextareaparameter\c!clipoffset,% + \c!rightoffset=\columntextareaparameter\c!rightoffset,% \c!width=\!!widthb,% \c!height=\!!heighta]% {\copy\scratchbox}% @@ -2444,7 +2446,8 @@ %\c!bottomoffset=\columntextareaparameter\c!clipoffset,% %\c!rightoffset=\columntextareaparameter\c!clipoffset,% \c!offset=\columntextareaparameter\c!clipoffset,% - \c!leftoffset=\zeropoint,% + \c!offset=\columntextareaparameter\c!clipoffset,% + \c!leftoffset=\columntextareaparameter\c!leftoffset,% \c!width=\!!widtha,% \c!height=\!!heighta,% \c!hoffset=\!!widthb]% diff --git a/tex/context/base/page-set.mkiv b/tex/context/base/page-set.mkiv index 7e825d76d..ca256d97c 100644 --- a/tex/context/base/page-set.mkiv +++ b/tex/context/base/page-set.mkiv @@ -2183,6 +2183,7 @@ \v!right=>\doglobal\addtocommalist{#1}\columnrightareas]% \getparameters[\??mt#1#2] [\c!x=1,\c!y=1,\c!nx=1,\c!ny=1,\c!clipoffset=2\lineheight, + \c!leftoffset=\zeropoint,\c!rightoffset=\zeropoint, \c!offset=\v!overlay,\c!strut=\v!no,\c!frame=\v!off, \c!type=#2,\c!page=1,\c!state=\v!stop,#3]}}% \else @@ -2333,7 +2334,8 @@ %\c!bottomoffset=\columntextareaparameter\c!clipoffset,% %\c!leftoffset=\columntextareaparameter\c!clipoffset,% \c!offset=\columntextareaparameter\c!clipoffset,% - \c!rightoffset=\zeropoint,% + \c!offset=\columntextareaparameter\c!clipoffset,% + \c!rightoffset=\columntextareaparameter\c!rightoffset,% \c!width=\!!widthb,% \c!height=\!!heighta]% {\copy\scratchbox}% @@ -2350,7 +2352,7 @@ %\c!bottomoffset=\columntextareaparameter\c!clipoffset,% %\c!rightoffset=\columntextareaparameter\c!clipoffset,% \c!offset=\columntextareaparameter\c!clipoffset,% - \c!leftoffset=\zeropoint,% + \c!leftoffset=\columntextareaparameter\c!leftoffset,% \c!width=\!!widtha,% \c!height=\!!heighta,% \c!hoffset=\!!widthb]% diff --git a/tex/context/base/spac-hor.mkiv b/tex/context/base/spac-hor.mkiv index fb3a9e794..fca5624ec 100644 --- a/tex/context/base/spac-hor.mkiv +++ b/tex/context/base/spac-hor.mkiv @@ -156,7 +156,7 @@ \noindent\hskip\parindent \fi \fi} -\def\toggleindentation +\def\toggleindentation % does not play well with noindentation {\ifcase\indentingtoggle % nothing \or diff --git a/tex/context/base/strc-pag.mkiv b/tex/context/base/strc-pag.mkiv index b21ae8bc4..4bcee80ea 100644 --- a/tex/context/base/strc-pag.mkiv +++ b/tex/context/base/strc-pag.mkiv @@ -317,6 +317,9 @@ \ifdefined \recalculatebackgrounds \recalculatebackgrounds \fi \to \everysetuppagenumbering +\def\flushfinallayoutpage + {\doifsomething\@@nmpage{\doifnot\@@nmpage\v!no{\page[\@@nmpage]}}} + % The numbered location handler is there because we need to be downward % compatible. So, in fact there can be multiple handlers active at the % same time, but only the current one does something. @@ -441,6 +444,7 @@ \c!width=, % in geval van \v!marginedge \c!left=, \c!right=, + \c!page=\v!last, \c!textseparator=\tfskip, \c!state=\v!start, \c!command=, diff --git a/tex/context/base/strc-ref.lua b/tex/context/base/strc-ref.lua index 42118436e..8cc63d50e 100644 --- a/tex/context/base/strc-ref.lua +++ b/tex/context/base/strc-ref.lua @@ -198,7 +198,7 @@ local function register_from_lists(collected,derived) local t = { kind, i } for s in gmatch(reference,"%s*([^,]+)") do if trace_referencing then - logs.report("referencing","list entry %s provides %s reference '%s' on realpage %s)",i,kind,s,realpage) + logs.report("referencing","list entry %s provides %s reference '%s' on realpage %s",i,kind,s,realpage) end d[s] = t -- share them end @@ -860,15 +860,17 @@ function jobreferences.filter(name,...) -- number page title ... local filter = filters[kind] or filters.generic filter = filter and (filter[name] or filter.unknown or filters.generic[name] or filters.generic.unknown) if filter then + logs.report("referencing","name '%s', kind '%s', using dedicated filter",name,kind) +--~ print(table.serialize {...}) filter(data,name,...) elseif trace_referencing then - logs.report("referencing","no (generic) filter.name for '%s'",name) + logs.report("referencing","name '%s', kind '%s', using generic filter",name,kind) end elseif trace_referencing then - logs.report("referencing","no metadata.kind for '%s'",name) + logs.report("referencing","name '%s', unknown kind",name) end elseif trace_referencing then - logs.report("referencing","no current reference for '%s'",name) + logs.report("referencing","name '%s', no reference",name) end end @@ -892,12 +894,13 @@ function filters.generic.text(data) end end -function filters.generic.number(data,what,...) -- todo: spec and then no stopper +function filters.generic.number(data,what,prefixspec) -- todo: spec and then no stopper if data then local numberdata = data.numberdata if numberdata then - helpers.prefix(data,...) - sections.typesetnumber(numberdata,"number",numberdata or false) +--~ print(table.serialize(prefixspec)) + helpers.prefix(data,prefixspec) + sections.typesetnumber(numberdata,"number",numberdata) else local useddata = data.useddata if useddata and useddsta.number then @@ -964,11 +967,11 @@ end filters.section = { } -function filters.section.number(data) -- todo: spec and then no stopper +function filters.section.number(data,what,prefixspec) if data then local numberdata = data.numberdata if numberdata then - sections.typesetnumber(numberdata,"number",numberdata or false) + sections.typesetnumber(numberdata,"number",prefixspec,numberdata) else local useddata = data.useddata if useddata and useddata.number then diff --git a/tex/context/base/strc-ref.mkiv b/tex/context/base/strc-ref.mkiv index d54d75207..cbed71d68 100644 --- a/tex/context/base/strc-ref.mkiv +++ b/tex/context/base/strc-ref.mkiv @@ -13,14 +13,17 @@ % todo: (1) configure references, (2) rendering => with presets % -% \starttext -% \definestructureconversionset[default][Character,number,Romannumerals,Character][number] -% \definestructureseparatorset [default][.,.,--][.] -% \setupstructurehead[subsection][sectionstopper=),sectionsegments=4:4] - -% \setupreferencing[sectionsegments=3:4] -% \section {One} \subsection[sec:test]{Two} See \in[sec:test] -% \stoptext +% \definestructureconversionset[default][Character,number,Romannumerals,Character][number] +% \definestructureseparatorset [default][.,.,--][.] +% \setupstructurehead[subsection][sectionstopper=),sectionsegments=4:4] +% \setupreferencestructureprefix[default][prefixsegments=2:4] +% \setupreferencestructureprefix[figure][default][prefixsegments=3:4] +% \chapter {One} +% \section {One} +% \subsection[sec:test]{Two} +% See \in[sec:test] and \in[fig:xx] and \in[fig:yy] +% \placefigure[here][fig:xx]{}{} +% \placefigure[here][fig:yy]{}{} \writestatus{loading}{ConTeXt Structure Macros / Cross Referencing} @@ -1780,7 +1783,7 @@ % {\ctxlua{jobreferences.get_current_metadata("name")}} % {#1}} % \def\currentreferencedefault -% {\ctxlua{jobreferences.filter("default",\referencestructureprefixspec\v!default)}} +% {\ctxlua{jobreferences.filter("default",\getreferencestructureprefixspec\v!default)}} % % this is shortcut for: diff --git a/tex/context/base/syst-ini.tex b/tex/context/base/syst-ini.tex index 0c3770294..51e78e67b 100644 --- a/tex/context/base/syst-ini.tex +++ b/tex/context/base/syst-ini.tex @@ -805,8 +805,8 @@ \ifdefined\pdfgentounicode \else \newcount\pdfgentounicode \fi \pdfgentounicode\plusone \def\nopdfcompression {\pdfobjcompresslevel\zerocount \pdfcompresslevel\zerocount} - \def\maximumpdfcompression{\pdfobjcompresslevel\plusone \pdfcompresslevel\plusnine } - \def\normalpdfcompression {\pdfobjcompresslevel\plusone \pdfcompresslevel\plusthree} + \def\maximumpdfcompression{\pdfobjcompresslevel\plusnine \pdfcompresslevel\plusnine } + \def\normalpdfcompression {\pdfobjcompresslevel\plusthree \pdfcompresslevel\plusthree} \normalpdfcompression diff --git a/tex/context/base/trac-deb.lua b/tex/context/base/trac-deb.lua index 4cd324922..08252c6c9 100644 --- a/tex/context/base/trac-deb.lua +++ b/tex/context/base/trac-deb.lua @@ -9,19 +9,6 @@ if not modules then modules = { } end modules ['trac-deb'] = { if not lmx then lmx = { } end if not lmx.variables then lmx.variables = { } end -lmx.variables['color-background-green'] = '#4F6F6F' -lmx.variables['color-background-blue'] = '#6F6F8F' -lmx.variables['color-background-yellow'] = '#8F8F6F' -lmx.variables['color-background-purple'] = '#8F6F8F' - -lmx.variables['color-background-body'] = '#808080' -lmx.variables['color-background-main'] = '#3F3F3F' -lmx.variables['color-background-one'] = lmx.variables['color-background-green'] -lmx.variables['color-background-two'] = lmx.variables['color-background-blue'] - -lmx.variables['title-default'] = 'ConTeXt Status Information' -lmx.variables['title'] = lmx.variables['title-default'] - lmx.htmfile = function(name) return environment.jobname .. "-status.html" end lmx.lmxfile = function(name) return resolvers.find_file(name,'tex') end @@ -82,30 +69,30 @@ function tracers.knownlist(name) end function tracers.showdebuginfo() - lmx.set('title', 'ConTeXt Debug Information') - lmx.set('color-background-one', lmx.get('color-background-green')) - lmx.set('color-background-two', lmx.get('color-background-blue')) - lmx.show('context-debug.lmx') - lmx.restore() + local variables = { + ['title'] = 'ConTeXt Debug Information', + ['color-background-one'] = lmx.get('color-background-green'), + ['color-background-two'] = lmx.get('color-background-blue'), + } + lmx.show('context-debug.lmx',variables) end function tracers.showerror() - lmx.set('title', 'ConTeXt Error Information') - lmx.set('errormessage', status.lasterrorstring) - lmx.set('linenumber', status.linenumber) - lmx.set('color-background-one', lmx.get('color-background-yellow')) - lmx.set('color-background-two', lmx.get('color-background-purple')) local filename = status.filename local linenumber = tonumber(status.linenumber or "0") + local variables = { + ['title'] = 'ConTeXt Error Information', + ['errormessage'] = status.lasterrorstring, + ['linenumber'] = status.linenumber, + ['color-background-one'] = lmx.get('color-background-yellow'), + ['color-background-two'] = lmx.get('color-background-purple'), + } if not filename then - lmx.set('filename', 'unknown') - lmx.set('errorcontext', 'error in filename') + variables.filename, variables.errorcontext = 'unknown', 'error in filename' elseif type(filename) == "number" then - lmx.set('filename', "") - lmx.set('errorcontext', 'unknown error') + variables.filename, variables.errorcontext = "", 'unknown error' elseif io.exists(filename) then -- todo: use an input opener so that we also catch utf16 an reencoding - lmx.set('filename', filename) lines = io.lines(filename) if lines then local context = { } @@ -124,16 +111,14 @@ function tracers.showerror() end n = n + 1 end - lmx.set('errorcontext', table.concat(context,"\n")) + variables.filename, variables.errorcontext = filename, table.concat(context,"\n") else - lmx.set('errorcontext', "") + variables.filename, variables.errorcontext = filename, "" end else - lmx.set('filename', filename) - lmx.set('errorcontext', 'file not found') + variables.filename, variables.errorcontext = filename, 'file not found' end - lmx.show('context-error.lmx') - lmx.restore() + lmx.show('context-error.lmx',variables) end function tracers.overloaderror() diff --git a/tex/context/base/trac-lmx.lua b/tex/context/base/trac-lmx.lua index a39e3fe4e..a272564de 100644 --- a/tex/context/base/trac-lmx.lua +++ b/tex/context/base/trac-lmx.lua @@ -1,72 +1,128 @@ if not modules then modules = { } end modules ['trac-lmx'] = { - version = 1.001, + version = 1.002, comment = "companion to trac-lmx.mkiv", author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", copyright = "PRAGMA ADE / ConTeXt Development Team", license = "see context related readme files" } -local gsub, format, concat = string.gsub, string.format, table.concat +-- todo: use lpeg instead (although not really needed) --- we can now use l-xml, and we can also use lpeg +local gsub, format, concat, byte = string.gsub, string.format, table.concat, string.byte lmx = lmx or { } -lmx.escapes = { +local escapes = { ['&'] = '&', ['<'] = '<', ['>'] = '>', ['"'] = '"' } --- local function p -> ends up in lmx.p, so we need to cast - -lmx.variables = { } - -lmx.variables['title-default'] = 'LMX File' -lmx.variables['title'] = lmx.variables['title-default'] - --- demonstrates: local, *all, gsub using tables, nil or value, loadstring - -function lmx.loadedfile(filename) - return io.loaddata(resolvers.find_file(filename)) -end - -lmx.converting = false - -local templates = { } - -function lmx.convert(template,result) -- todo: use lpeg instead - if not lmx.converting then -- else, if error then again tex error and loop - local data = templates[template] - if not data then - data = lmx.loadedfile(template) - templates[template] = data - end - local text = { } - function lmx.print(...) - text[#text+1] = concat({...}) - end - function lmx.variable(str) - return lmx.variables[str] or "" - end - function lmx.escape(str) - str = tostring(str) - str = gsub(str,'&','&') - str = gsub(str,'[<>"]',lmx.escapes) - return str - end - function lmx.type(str) - if str then lmx.print("" .. lmx.escape(str) .. "") end - end - function lmx.pv(str) - lmx.print(lmx.variable(str)) - end - function lmx.tv(str) - lmx.type(lmx.variable(str)) - end +-- variables + +lmx.variables = { } -- global, shared + +local lmxvariables = lmx.variables + +lmxvariables['title-default'] = 'ConTeXt LMX File' +lmxvariables['title'] = lmx.variables['title-default'] +lmxvariables['color-background-green'] = '#4F6F6F' +lmxvariables['color-background-blue'] = '#6F6F8F' +lmxvariables['color-background-yellow'] = '#8F8F6F' +lmxvariables['color-background-purple'] = '#8F6F8F' +lmxvariables['color-background-body'] = '#808080' +lmxvariables['color-background-main'] = '#3F3F3F' +lmxvariables['color-background-one'] = lmxvariables['color-background-green'] +lmxvariables['color-background-two'] = lmxvariables['color-background-blue'] + +function lmx.set(key, value) + lmxvariables[key] = value +end + +function lmx.get(key) + return lmxvariables[key] or "" +end + +-- helpers + +local variables, result = { } -- we assume no nesting + +local function do_print(one,two,...) + if two then + result[#result+1] = concat { one, two, ... } + else + result[#result+1] = one + end +end + +local function do_escape(str) + str = tostring(str) + str = gsub(str,'&','&') + str = gsub(str,'[<>"]',escapes) + return str +end + +local function do_urlescaped(str) + return (gsub(str,"[^%a%d]",format("%%0x",byte("%1")))) +end + +function do_type(str) + if str then do_print("" .. do_escape(str) .. "") end +end + +local function do_variable(str) + return variables[str] or lmxvariables[str] -- or format("",str or "?") +end + +function lmx.loadedfile(name) + name = (resolvers and resolvers.find_file and resolvers.find_file(name)) or name + return io.loaddata(name) +end + +local function do_include(filename) + local stylepath = do_variable('includepath') + local data = lmx.loadedfile(filename) + if (not data or data == "") and stylepath ~= "" then + data = lmx.loadedfile(file.join(stylepath,filename)) + end + if not data or data == "" then + data = format("",filename) + end + return data +end + +lmx.print = do_print +lmx.type = do_type +lmx.escape = do_escape +lmx.urlescape = do_escape +lmx.variable = do_variable +lmx.include = do_include + +function lmx.pv(str) + do_print(do_variable(str) or "") +end + +function lmx.tv(str) + lmx.type(do_variable(str) or "") +end + +local template = [[ + local definitions = { } + local p, v, e, t, pv, tv = lmx.print, lmx.variable, lmx.escape, lmx.type, lmx.pv, lmx.tv + %s +]] + +local cache = { } + +local trace = false + +function lmx.new(data,variables) + local known = cache[data] + if not known then + local definitions = { } data = gsub(data,"<%?lmx%-include%s+(.-)%s-%?>", function(filename) - return lmx.loadedfile(filename) + return lmx.include(filename) end) local definitions = { } data = gsub(data,"<%?lmx%-define%-begin%s+(%S-)%s-%?>(.-)<%?lmx%-define%-end%s-%?>", function(tag,content) @@ -76,33 +132,60 @@ function lmx.convert(template,result) -- todo: use lpeg instead data = gsub(data,"<%?lmx%-resolve%s+(%S-)%s-%?>", function(tag) return definitions[tag] or "" end) - data = gsub(data,"%c%s-(<%?lua .-%?>)%s-%c", function(lua) - return "\n" .. lua .. " " - end) - data = gsub(data .. "","(.-)<%?lua%s+(.-)%?>", function(txt, lua) - txt = gsub(txt,"%c+", "\\n") - txt = gsub(txt,'"' , '\\"') - txt = gsub(txt,"'" , "\\'") - -- txt = gsub(txt,"([\'\"])", { ["'"] = '\\"', ['"'] = "\\'" } ) - return "p(\"" .. txt .. "\")\n" .. lua .. "\n" + data = gsub(data .. "","(.-)<%?lua%s+(.-)%s*%?>", function(txt,lua) + txt = gsub(txt,"%c+","\n") + return format("p(%q)%s ",txt,lua) -- nb! space end) - lmx.converting = true - data = "local p,v,e,t,pv,tv = lmx.print,lmx.variable,lmx.escape,lmx.type,lmx.pv,lmx.tv " .. data - assert(loadstring(data))() - lmx.converting = false - text = concat(text) - if result then - io.savedata(result,text) - else - return text - end + data = format(template,data) + known = { + data = trace and data, + variables = variables or { }, + converter = loadstring(data), + } + elseif variables then + known.variables = variables + end + return known, known.variables +end + +function lmx.reset(self) + self.variables = { } +end + +function lmx.result(self) + if trace then + return self.data + else + variables, result = self.variables, { } + self.converter() + return concat(result) + end +end + +-- file converter + +local loaded = { } + +function lmx.convert(templatefile,resultfile,variables) + local data = loaded[templatefile] + if not data then + data = lmx.new(lmx.loadedfile(templatefile),variables) + loaded[template] = data + elseif variables then + data.variables = variables + end + local result = lmx.result(data) + if resultfile then + io.savedata(resultfile,result) + else + return lmx.result(data,result) end end -- these can be overloaded; we assume that the os handles filename associations -lmx.lmxfile = function(filename) return filename end -lmx.htmfile = function(filename) return filename end +lmx.lmxfile = function(filename) return filename end -- beware, these can be set! +lmx.htmfile = function(filename) return filename end -- beware, these can be set! if os.platform == "windows" then lmx.popupfile = function(filename) os.execute("start " .. filename) end @@ -110,44 +193,25 @@ else lmx.popupfile = function(filename) os.execute(filename) end end -function lmx.make(name) +function lmx.make(name,variables) local lmxfile = lmx.lmxfile(name) local htmfile = lmx.htmfile(name) if lmxfile == htmfile then htmfile = gsub(lmxfile, "%.%a+$", "html") end - lmx.convert(lmxfile, htmfile) + lmx.convert(lmxfile,htmfile,variables) return htmfile end -function lmx.show(name) - local htmfile = lmx.make(name) +function lmx.show(name,variables) + local htmfile = lmx.make(name,variables) lmx.popupfile(htmfile) return htmfile end --- kind of private - -lmx.restorables = { } - -function lmx.set(key, value) - if not lmx.restorables[key] then - table.insert(lmx.restorables, key) - lmx.variables['@@' .. key] = lmx.variables[key] - end - lmx.variables[key] = value -end - -function lmx.get(key) - return lmx.variables[key] or "" -end +-- test -function lmx.restore() - for _,key in pairs(lmx.restorables) do - lmx.variables[key] = lmx.variables['@@' .. key] - end - lmx.restorables = { } -end +--~ print(lmx.result(lmx.new(io.loaddata("t:/sources/context-timing.lmx")))) -- command line diff --git a/tex/context/base/trac-tim.lua b/tex/context/base/trac-tim.lua index 82c03f4c7..a896d767f 100644 --- a/tex/context/base/trac-tim.lua +++ b/tex/context/base/trac-tim.lua @@ -26,7 +26,7 @@ local params = { "pdf_mem_ptr", "pdf_mem_size", "pdf_os_cntr", - "pool_ptr", +-- "pool_ptr", -- obsolete "str_ptr", } @@ -36,12 +36,8 @@ local last = os.clock() local data = { } function progress.save() - local f = io.open((name or progress.defaultfilename) .. ".lut","w") - if f then - f:write(table.serialize(data,true)) - f:close() - data = { } - end + io.savedata((name or progress.defaultfilename) .. ".lut",table.serialize(data,true)) + data = { } end function progress.store() @@ -61,32 +57,7 @@ end local processed = { } -function progress.bot(name,tag) - local d = progress.convert(name) - return d.bot[tag] or 0 -end -function progress.top(name,tag) - local d = progress.convert(name) - return d.top[tag] or 0 -end -function progress.pages(name,tag) - local d = progress.convert(name) - return d.pages or 0 -end -function progress.path(name,tag) - local d = progress.convert(name) - return d.paths[tag] or "origin" -end -function progress.nodes(name) - local d = progress.convert(name) - return d.names or { } -end -function progress.parameters(name) - local d = progress.convert(name) - return params -- shared -end - -function progress.convert(name) +local function convert(name) name = ((name ~= "") and name) or progress.defaultfilename if not processed[name] then local names, top, bot, pages, paths, keys = { }, { }, { }, 0, { }, { } @@ -161,3 +132,24 @@ function progress.convert(name) end return processed[name] end + +progress.convert = convert + +function progress.bot(name,tag) + return convert(name).bot[tag] or 0 +end +function progress.top(name,tag) + return convert(name).top[tag] or 0 +end +function progress.pages(name,tag) + return convert(name).pages or 0 +end +function progress.path(name,tag) + return convert(name).paths[tag] or "origin" +end +function progress.nodes(name) + return convert(name).names or { } +end +function progress.parameters(name) + return params -- shared +end diff --git a/tex/context/base/typo-spa.lua b/tex/context/base/typo-spa.lua index 56ce36a05..d9ded1cfa 100644 --- a/tex/context/base/typo-spa.lua +++ b/tex/context/base/typo-spa.lua @@ -56,7 +56,7 @@ function spacings.process(namespace,attribute,head) local map = mapping[attr] if map then map = map[start.char] - unset_attribute(start,attribute) + unset_attribute(start,attribute) -- needed? if map then local left, right, alternative = map.left, map.right, map.alternative local quad = fontdata[start.font].parameters.quad diff --git a/tex/context/base/verb-eif.mkii b/tex/context/base/verb-eif.mkii index 5904abc6e..68c84d4be 100644 --- a/tex/context/base/verb-eif.mkii +++ b/tex/context/base/verb-eif.mkii @@ -64,7 +64,7 @@ %D We borrow most of the macros from the \PERL\ driver. -\ifx\undefined\setupprettyPLtype \input verb-pl \relax \fi +\ifdefined\setupprettyPLtype \else \loadmarkfile{verb-pl} \fi \unprotect diff --git a/tex/context/base/verb-ini.mkii b/tex/context/base/verb-ini.mkii index 4726d0eac..829e10fd8 100644 --- a/tex/context/base/verb-ini.mkii +++ b/tex/context/base/verb-ini.mkii @@ -1455,11 +1455,8 @@ \ifCONTEXT \else - \input verb-tex - \input verb-mp - \input verb-pl - \input verb-jv - \input verb-sql + \input verb-tex.mkii + \input verb-mp.mkii \def\startTEX {\bgroup \everypar{}% @@ -1471,26 +1468,8 @@ \let\obeycharacters\setupprettyMPtype \processdisplayverbatim{\stopMP}} - \def\startPL - {\bgroup \everypar{}% - \let\obeycharacters\setupprettyPLtype - \processdisplayverbatim{\stopPL}} - - \def\startJV - {\bgroup \everypar{}% - \let\obeycharacters\setupprettyJVtype - \processdisplayverbatim{\stopJV}} - - \def\startSQL - {\bgroup \everypar{}% - \let\obeycharacters\setupprettySQLtype - \processdisplayverbatim{\stopSQL}} - \let\stopTEX=\egroup \let\stopMP =\egroup - \let\stopPL =\egroup - \let\stopJV =\egroup - \let\stopSQL=\egroup \fi diff --git a/tex/context/base/verb-js.mkii b/tex/context/base/verb-js.mkii index 3d1b69f8b..e497e475b 100644 --- a/tex/context/base/verb-js.mkii +++ b/tex/context/base/verb-js.mkii @@ -32,7 +32,7 @@ %D a slightly adapted \PERL\ visualization. First we load the %D \PERL\ module: -\ifx\undefined\setupprettyPLtype \input verb-pl \relax \fi +\ifdefined\setupprettyPLtype \else \loadmarkfile{verb-pl} \fi \unprotect diff --git a/tex/context/base/verb-jv.mkii b/tex/context/base/verb-jv.mkii index 197b37ee7..ee79e5c03 100644 --- a/tex/context/base/verb-jv.mkii +++ b/tex/context/base/verb-jv.mkii @@ -22,7 +22,7 @@ %D driver looks much like the \JAVASCRIPT\ one, we don't %D comment it extensively. -\ifx\undefined\setupprettyPLtype \input verb-pl \relax \fi +\ifdefined\setupprettyPLtype \else \loadmarkfile{verb-pl} \fi \unprotect diff --git a/tex/context/base/verb-pas.mkii b/tex/context/base/verb-pas.mkii index 0c9850abf..71c0b5a12 100644 --- a/tex/context/base/verb-pas.mkii +++ b/tex/context/base/verb-pas.mkii @@ -36,7 +36,7 @@ %D [palet=,icommand=\bf,vcommand=,ccommand=\it] %D \stopbuffer -\ifx\undefined\setupprettyPLtype \input verb-pl \relax \fi +\ifdefined\setupprettyPLtype \else \loadmarkfile{verb-pl} \fi \unprotect diff --git a/tex/context/base/verb-raw.mkii b/tex/context/base/verb-raw.mkii index 32903db77..43a0891a0 100644 --- a/tex/context/base/verb-raw.mkii +++ b/tex/context/base/verb-raw.mkii @@ -1,7 +1,7 @@ -\ifx\undefined\setupprettyTEXtype \input verb-tex \relax \fi +\ifdefined\setupprettyPLtype \else \loadmarkfile{verb-pl} \fi \gdef\setupprettyRAWtype% {\setupprettyTEXtype \def\prettyidentifier{RAW}} - -\endinput + +\endinput diff --git a/tex/context/base/verb-sql.mkii b/tex/context/base/verb-sql.mkii index a00841d73..f145607f8 100644 --- a/tex/context/base/verb-sql.mkii +++ b/tex/context/base/verb-sql.mkii @@ -49,7 +49,7 @@ %D Like we did with the \JAVASCRIPT\ driver, we will borrow %D most of the macros from the \PERL\ driver. -\ifx\undefined\setupprettyPLtype \input verb-pl \relax \fi +\ifdefined\setupprettyPLtype \else \loadmarkfile{verb-pl} \fi \unprotect diff --git a/tex/context/base/x-dir-05.mkii b/tex/context/base/x-dir-05.mkii new file mode 100644 index 000000000..0d0edd832 --- /dev/null +++ b/tex/context/base/x-dir-05.mkii @@ -0,0 +1,51 @@ +%D \module +%D [ file=x-dir-05, +%D version=2003.05.10, % around that time -) +%D title=\CONTEXT\ Directory Handling, +%D subtitle=Access, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\setvariables + [filestate] + [name=,base=,type=,size=,permissions=,date=] + +\def\savefilestate + {\dodoubleargument\dosavefilestate} + +\def\dosavefilestate[#1][#2]% + {\startnointerference + \setxvariables + [#1] + [name=#2,base=,type=,size=,permissions=,date=] + \executesystemcommand{texmfstart xmltools.rb --dir --pattern=\getvariable{#1}{name} --output=xmldir.tmp} + \defineXMLprocess [files] + \defineXMLprocess [directory] + \defineXMLenvironment [file] + {\defineXMLsave [base] + \defineXMLsave [type] + \defineXMLsave [size] + \defineXMLsave [permissions] + \defineXMLsave [date]} + {\setxvariables + [#1] + [name=\XMLop{name}, + base=\XMLflush{base}, + type=\XMLflush{type}, + size=\XMLflush{size}, + permissions=\XMLflush{permissions}, + date=\XMLflush{date}]} + \startXMLignore + \processXMLfile{xmldir.tmp} + \stopXMLignore + \stopnointerference} + +\def\getfilestate#1% old one + {\savefilestate[filestate][#1]} + +\endinput diff --git a/tex/context/base/x-dir-05.mkiv b/tex/context/base/x-dir-05.mkiv new file mode 100644 index 000000000..c29c9ea2a --- /dev/null +++ b/tex/context/base/x-dir-05.mkiv @@ -0,0 +1,72 @@ +%D \module +%D [ file=x-dir-05, +%D version=2003.05.10, % around that time -) +%D title=\CONTEXT\ Directory Handling, +%D subtitle=Access, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\setvariables + [filestate] + [name=, + base=, + type=, + size=, + permissions=, + date=] + +% \savefilestate[zip-latest][context/latest/cont-#2.zip]% + +\startluacode + local filestates = { } + function commands.savefilestate(tag,name) + if not filestates[tag] then + local attr = lfs.attributes(name) + if attr then attr.name = name end + filestates[tag] = attr + end + end + function commands.getfilestatevariable(tag,name) + local fs = filestates[tag] + if fs then + local value + if name == "base" then + value = file.basename(fs.name) + elseif name == "type" then + value = file.extname(fs.name) + elseif name == "date" then + value = os.date("%Y-%m-%d %H:%M",fs.modification) + else + value = fs[name] or "" + end + tex.sprint(tex.vrbcatcodes,value) + end + end +\stopluacode + +\def\getfilestatevariable#1#2% + {\ctxlua{commands.getfilestatevariable("#1","#2")}} + +\def\savefilestate + {\dodoubleargument\dosavefilestate} + +\def\dosavefilestate[#1][#2]% + {\ctxlua{commands.savefilestate("#1","#2")}% + \setxvariables + [#1] + [name={#2}, + base=\getfilestatevariable{#1}{base}, + type=\getfilestatevariable{#1}{type}, + size=\getfilestatevariable{#1}{size}, + date=\getfilestatevariable{#1}{date}, + permissions=\getfilestatevariable{#1}{permissions}]} + +\def\getfilestate#1% old one + {\savefilestate[filestate][#1]} + +\endinput diff --git a/tex/context/interface/cont-cs.xml b/tex/context/interface/cont-cs.xml index c50d3c5d5..98e0111e0 100644 --- a/tex/context/interface/cont-cs.xml +++ b/tex/context/interface/cont-cs.xml @@ -4209,6 +4209,11 @@ + + + + + diff --git a/tex/context/interface/cont-de.xml b/tex/context/interface/cont-de.xml index 2aa738ed1..5b39c628a 100644 --- a/tex/context/interface/cont-de.xml +++ b/tex/context/interface/cont-de.xml @@ -4209,6 +4209,11 @@ + + + + + diff --git a/tex/context/interface/cont-en.xml b/tex/context/interface/cont-en.xml index f2cf7f7b8..cf1a59085 100644 --- a/tex/context/interface/cont-en.xml +++ b/tex/context/interface/cont-en.xml @@ -4209,6 +4209,11 @@ + + + + + diff --git a/tex/context/interface/cont-fr.xml b/tex/context/interface/cont-fr.xml index 81baacff3..be4a19280 100644 --- a/tex/context/interface/cont-fr.xml +++ b/tex/context/interface/cont-fr.xml @@ -4209,6 +4209,11 @@ + + + + + diff --git a/tex/context/interface/cont-it.xml b/tex/context/interface/cont-it.xml index 058e71735..e167f22f2 100644 --- a/tex/context/interface/cont-it.xml +++ b/tex/context/interface/cont-it.xml @@ -4209,6 +4209,11 @@ + + + + + diff --git a/tex/context/interface/cont-nl.xml b/tex/context/interface/cont-nl.xml index ebb29402f..dff677cd2 100644 --- a/tex/context/interface/cont-nl.xml +++ b/tex/context/interface/cont-nl.xml @@ -4209,6 +4209,11 @@ + + + + + diff --git a/tex/context/interface/cont-pe.xml b/tex/context/interface/cont-pe.xml index 5a86933a8..228cae2e8 100644 --- a/tex/context/interface/cont-pe.xml +++ b/tex/context/interface/cont-pe.xml @@ -4209,6 +4209,11 @@ + + + + + diff --git a/tex/context/interface/cont-ro.xml b/tex/context/interface/cont-ro.xml index 17e914725..74003dd5c 100644 --- a/tex/context/interface/cont-ro.xml +++ b/tex/context/interface/cont-ro.xml @@ -4209,6 +4209,11 @@ + + + + + diff --git a/tex/generic/context/luatex-fonts-merged.lua b/tex/generic/context/luatex-fonts-merged.lua index e9a57d93b..c03196d1b 100644 --- a/tex/generic/context/luatex-fonts-merged.lua +++ b/tex/generic/context/luatex-fonts-merged.lua @@ -1,6 +1,6 @@ -- merged file : c:/data/develop/context/texmf/tex/generic/context/luatex-fonts-merged.lua -- parent file : c:/data/develop/context/texmf/tex/generic/context/luatex-fonts.lua --- merge date : 12/01/09 17:16:42 +-- merge date : 12/13/09 23:30:54 do -- begin closure to overcome local limits and interference @@ -200,6 +200,7 @@ end local simple_escapes = { ["-"] = "%-", ["."] = "%.", + ["?"] = ".", ["*"] = ".*", } @@ -262,6 +263,19 @@ function string:striplong() -- strips newlines and leading spaces return self end +function string:topattern(lowercase,strict) + if lowercase then + self = self:lower() + end + self = gsub(self,".",simple_escapes) + if self == "" then + self = ".*" + elseif strict then + self = "^" .. self .. "$" + end + return self +end + end -- closure do -- begin closure to overcome local limits and interference @@ -274,6 +288,8 @@ if not modules then modules = { } end modules ['l-lpeg'] = { license = "see context related readme files" } +lpeg = require("lpeg") + local P, R, S, Ct, C, Cs, Cc = lpeg.P, lpeg.R, lpeg.S, lpeg.Ct, lpeg.C, lpeg.Cs, lpeg.Cc --~ l-lpeg.lua : -- cgit v1.2.3