From e5fe63b87cc5c30d6c9ce8c7dcacbc9ac1a08d67 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Sat, 22 Oct 2016 22:05:00 +0000 Subject: context-inifile git-svn-id: svn://tug.org/texlive/trunk@42329 c570f23f-e606-0410-a88d-b1316a301751 --- .../doc/context/third/inifile/inifile-demo.pdf | Bin 0 -> 8844 bytes .../doc/context/third/inifile/inifile-doc.pdf | Bin 0 -> 79148 bytes .../tex/context/third/inifile/t-inifile.tex | 221 +++++++++++++++++++++ Master/tlpkg/bin/tlpkg-ctan-check | 2 +- Master/tlpkg/libexec/ctan2tds | 1 + Master/tlpkg/tlpsrc/collection-context.tlpsrc | 1 + Master/tlpkg/tlpsrc/context-inifile.tlpsrc | 2 + 7 files changed, 226 insertions(+), 1 deletion(-) create mode 100644 Master/texmf-dist/doc/context/third/inifile/inifile-demo.pdf create mode 100644 Master/texmf-dist/doc/context/third/inifile/inifile-doc.pdf create mode 100644 Master/texmf-dist/tex/context/third/inifile/t-inifile.tex create mode 100644 Master/tlpkg/tlpsrc/context-inifile.tlpsrc diff --git a/Master/texmf-dist/doc/context/third/inifile/inifile-demo.pdf b/Master/texmf-dist/doc/context/third/inifile/inifile-demo.pdf new file mode 100644 index 00000000000..94ee02ad2fb Binary files /dev/null and b/Master/texmf-dist/doc/context/third/inifile/inifile-demo.pdf differ diff --git a/Master/texmf-dist/doc/context/third/inifile/inifile-doc.pdf b/Master/texmf-dist/doc/context/third/inifile/inifile-doc.pdf new file mode 100644 index 00000000000..2dc6a2a5ec7 Binary files /dev/null and b/Master/texmf-dist/doc/context/third/inifile/inifile-doc.pdf differ diff --git a/Master/texmf-dist/tex/context/third/inifile/t-inifile.tex b/Master/texmf-dist/tex/context/third/inifile/t-inifile.tex new file mode 100644 index 00000000000..df1c8830803 --- /dev/null +++ b/Master/texmf-dist/tex/context/third/inifile/t-inifile.tex @@ -0,0 +1,221 @@ +%D \module +%D [ file=t-inifile, +%D version=2008.07.15, +%D title=\CONTEXT\ User Module, +%D subtitle=Formatting of ini-files, +%D author=Peter Münster, +%D date=\currentdate, +%D copyright={Peter Münster}] +%C This module is copyrighted by Peter Münster. +%C Please send any comments to pmrb at free.fr. +%C You can find the latest version of this module on +%C http://modules.contextgarden.net/ + +% This program is free software; you can redistribute it and/or +% modify it under the terms of the GNU General Public License +% as published by the Free Software Foundation; either version 2 +% of the License, or (at your option) any later version. + +% This program is distributed in the hope that it will be useful, +% but without any warranty; without even the implied warranty of +% merchantability or fitness for a particular purpose. See the +% GNU General Public License for more details. + +\writestatus{loading}{Formatting of ini-files} +\doifnotmode{mkiv}{\writestatus{error}{needs luatex}\wait\end} + +\unprotect + +\startluacode +-- namespace +thirddata = thirddata or { } +thirddata.inifile = {} + +-- sort the table +-- s1: primary key +-- s2: secondary key +-- s3: third key +local function sort_table(s1, s2, s3) + local function cmp(a, b) + if s2 ~= "" and a[s1] == b[s1] then + if s3 ~= "" and a[s2] == b[s2] then + return a[s3] < b[s3] + else + return a[s2] < b[s2] + end + else + return a[s1] < b[s1] + end + end + if s1 ~= "" then + table.sort(thirddata.inifile.t, cmp) + end +end + +-- write default values to table entry +-- d: the default values separated by commas +-- i: the index of the entry +local function write_defaults(d, i) + for k, v in string.gmatch(d, "[,%s]*(.-)=([^,]*)") do + thirddata.inifile.t[i][k] = v + end +end + +-- generate table from ini-file +-- d: default values for all entries +-- s1: primary sort-key +-- s2: secondary sort-key +-- s3: third sort-key +function thirddata.inifile.make_table(d, s1, s2, s3) + thirddata.inifile.t = {} + local i = 0 + local lastkey + while true do + local l = io.read() + if not l then + break + end + while true do + -- check for new entry: + key = string.match(l, "^%[(.+)%]$") + if key then + i = i + 1 + thirddata.inifile.t[i] = {} + thirddata.inifile.t[i]["key"] = key + thirddata.inifile.t[i]["n"] = i + write_defaults(d, i) + break -- continue ! + end + -- treat continued lines: + while string.match(l, "\\$") do + local c = io.read() + l = string.match(l, "^(.*)\\$") .. c + end + local c = string.match(l, "^%s+(.*)$") + if c then + thirddata.inifile.t[i][lastkey] = + thirddata.inifile.t[i][lastkey] .. " " .. c + end + -- get a new key value pair: + key, val = string.match(l, "^([%w_]+)%s*=%s(.*)$") + if key then + thirddata.inifile.t[i][key] = val + lastkey = key + end + break + end + end + sort_table(s1, s2, s3) + print(table.serialize(thirddata.inifile.t)) +end + +-- let ConTeXt print the sorted table with user defined formatting +-- c: the user supplied command to print one entry +function thirddata.inifile.print(c) + for i = 1,#thirddata.inifile.t do + tex.print(string.format("%s\\def\\IF@index{%d}%s\\%s", + "\\unprotect", i, "\\protect", c)) + end +end + +-- initialise the new entry, in general to be called in the beginning +-- of the user supplied formatting command +-- i: the index of the new entry +function thirddata.inifile.newentry(i) + for k, v in pairs(thirddata.inifile.t[i]) do + tex.print(string.format("\\def\\IF%s{%s}", k, v)) + end +end + +-- filter applied to values of a key +-- k: the key +-- s: the search pattern +-- r: the replace string +function thirddata.inifile.filter(k, s, r) + for i = 1,#thirddata.inifile.t do + thirddata.inifile.t[i][k] = + string.gsub(thirddata.inifile.t[i][k], s, r) + end +end +\stopluacode + +\getparameters[IF@][defaults=,sortA=,sortB=,sortC=,file=/dev/null] +\def\setupIniFile[#1]{ + \getparameters[IF@][#1] + \ctxlua{io.input("\IF@file")} + \ctxlua{thirddata.inifile.make_table("\IF@defaults", + "\IF@sortA", "\IF@sortB", "\IF@sortC")} +} +\def\IniFilePrint{\ctxlua{thirddata.inifile.print("\IF@command")}} +\def\IniFileNewEntry{\ctxlua{thirddata.inifile.newentry(\IF@index)}} +\def\IniFileFilter[#1][#2][#3]{\ctxlua{thirddata.inifile.filter("#1", + "#2", "#3")}} + +\protect + +\doifnotmode{demo}{\endinput} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%D Usage example: + +\startbuffer[thewho] +[p_t] +givenname = Peter +surname = Townshend +birthyear = 1945 +comment = 100 % with nobreakspace + +[r_d] +givenname = Roger +surname = Daltrey +comment = 100 % with thinspace + +[j_e] +givenname = John +surname = Entwistle +comment = very very very very + long line + +[k_m] +givenname = Keith +surname = Moon +birthyear = 1946 +comment = another very very very very \ + long line + +[k_j] +givenname = Kenney +surname = Jones +birthyear = 1948 +comment = yet another very very very very \ +long line +\stopbuffer +\savebuffer[thewho] + +\usemodule[inifile] + +\setupIniFile[defaults={birthyear=1944,comment=}, + sortA=birthyear,sortB=key,command=FormatMember,file=\jobname-thewho.tmp] +\IniFileFilter[comment][\%\% ][\\letterpercent\\space ] +\IniFileFilter[comment][\%\%][\\letterpercent ] + +\setupTABLE[frame=off,width=0.5\textwidth] +\nonknuthmode + +\def\IFbirthyear{} +\def\FormatMember{ + \edef\LastBirthyear{\IFbirthyear} + \IniFileNewEntry + \doifnot\IFbirthyear\LastBirthyear{\section{\IFbirthyear}} + \subsection{\WORD{\IFkey}} + \bTABLE\bTR + \bTD Given name: \IFgivenname\eTD\bTD Surname: \IFsurname\eTD + \eTR\eTABLE + \doifsomething\IFcomment{Comment to show the treatment of the percent + sign and multi-line values: \IFcomment}} + +\starttext +\title{The Who} +\IniFilePrint +\stoptext diff --git a/Master/tlpkg/bin/tlpkg-ctan-check b/Master/tlpkg/bin/tlpkg-ctan-check index c03dac753fb..3ea08269f9b 100755 --- a/Master/tlpkg/bin/tlpkg-ctan-check +++ b/Master/tlpkg/bin/tlpkg-ctan-check @@ -162,7 +162,7 @@ my @TLP_working = qw( context-construction-plan context-cyrillicnumbers context-degrade context-fancybreak context-filter context-french context-fullpage - context-gantt context-gnuplot + context-gantt context-gnuplot context-inifile context-letter context-lettrine context-mathsets context-notes-zh-cn context-rst context-ruby context-simplefonts context-simpleslides context-title diff --git a/Master/tlpkg/libexec/ctan2tds b/Master/tlpkg/libexec/ctan2tds index 4b167e3d7b2..e7ca89db3d7 100755 --- a/Master/tlpkg/libexec/ctan2tds +++ b/Master/tlpkg/libexec/ctan2tds @@ -286,6 +286,7 @@ chomp ($Build = `cd $Master/../Build/source && pwd`); 'context-games', "die 'skipping, obsolete per author'", 'context-gantt', "&MAKEcopy", 'context-gnuplot', "&MAKEcopy", + 'context-inifile', "&MAKEcopy", 'context-letter', "&MAKEcopy", 'context-lettrine', "&MAKEcopy", 'context-lilypond', "die 'skipping, obsolete per author'", diff --git a/Master/tlpkg/tlpsrc/collection-context.tlpsrc b/Master/tlpkg/tlpsrc/collection-context.tlpsrc index c484ecb3eb5..3da05cd5a6d 100644 --- a/Master/tlpkg/tlpsrc/collection-context.tlpsrc +++ b/Master/tlpkg/tlpsrc/collection-context.tlpsrc @@ -28,6 +28,7 @@ depend context-french depend context-fullpage depend context-gantt depend context-gnuplot +depend context-inifile depend context-letter depend context-lettrine depend context-mathsets diff --git a/Master/tlpkg/tlpsrc/context-inifile.tlpsrc b/Master/tlpkg/tlpsrc/context-inifile.tlpsrc new file mode 100644 index 00000000000..80e71c2e536 --- /dev/null +++ b/Master/tlpkg/tlpsrc/context-inifile.tlpsrc @@ -0,0 +1,2 @@ +category ConTeXt +depend context -- cgit v1.2.3