From 65095863d32b4d7913f92aa73919ae9f3b95604d Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Sat, 10 Aug 2019 21:19:47 +0000 Subject: csvmerge (10aug19) git-svn-id: svn://tug.org/texlive/trunk@51857 c570f23f-e606-0410-a88d-b1316a301751 --- Master/texmf-dist/tex/latex/csvmerge/csvmerge.sty | 300 ++++++++++++++++++++++ 1 file changed, 300 insertions(+) create mode 100644 Master/texmf-dist/tex/latex/csvmerge/csvmerge.sty (limited to 'Master/texmf-dist/tex/latex/csvmerge/csvmerge.sty') diff --git a/Master/texmf-dist/tex/latex/csvmerge/csvmerge.sty b/Master/texmf-dist/tex/latex/csvmerge/csvmerge.sty new file mode 100644 index 00000000000..06d97971930 --- /dev/null +++ b/Master/texmf-dist/tex/latex/csvmerge/csvmerge.sty @@ -0,0 +1,300 @@ +%% +%% This is file `csvmerge.sty', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% csvmerge.dtx (with options: `package') +%% This is a generated file. Copyright (C) 2019 by Laurence R Taylor +%% This file may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either +%% version 1.3 of this license or (at your option) any later +%% version. The latest version of this license is in: +%% http://www.latex-project.org/lppl.txt +%% and version 1.3 or later is part of all distributions of +%% LaTeX version 2005/12/01 or later. +\NeedsTeXFormat{LaTeX2e}[2005/12/01] +\ProvidesPackage{csvmerge} + [2019/07/17 v1.0 merges TeX code with csv data] + +\RequirePackage{stringstrings} +\RequirePackage{trimspaces} +\RequirePackage{etoolbox} + +\DeclareOption*{\xdef\@LRT@CO{\CurrentOption}} +\ProcessOptions\relax + +\makeatletter + +\newcommand{\@LRT@mergeFields}[1]{% +\gdef\@LRT@csv{}% +\gdef\@LRT@tex{}% +\gdef\@LRT@tmp{}% +\setcounter{\@LRT@macroPrefix Row}{2}\relax% +\gdef\@LRT@csvBlankLine{}% +\@LRT@getFilePaths#1=@% +\if@LRT@empty{\@LRT@csv}{\@LRT@missingArgumentMessage{csv}}{}% +\if@LRT@empty{\@LRT@tex}{\@LRT@missingArgumentMessage{tex}}{}% +\if@LRT@empty{\@LRT@tmp}% +{\global\let\@LRT@Input\@LRT@streaming}% +{\global\let\@LRT@Input\@LRT@storage}% +\if@LRT@empty{\@LRT@tmp}{}{% +\immediate\openout\@lrt@tmpFile=\@LRT@tmp\relax}% +\@LRT@mergeData% +\if@LRT@empty{\@LRT@tmp}{}{\immediate\closeout\@lrt@tmpFile\relax}% +} + +\gdef\@LRT@macroPrefix{@LRT@@} + +\def\@LRT@Field#1{% +\csname\@LRT@macroPrefix#1\endcsname% +} + +\long\gdef\@LRT@ifFieldEmpty#1#2#3{\ifbool{\@LRT@macroPrefix#1}{#2}{#3}} + +{{% +\gdef\@LRT@setDelimitersCommaQuote{ +\gdef\@LRT@fieldDelimiterBack{,} +\gdef\@LRT@getFieldDelimited##1,{\@LRT@getFirstArg{##1}} +\gdef\@LRT@textDelimiterFront{"} +\gdef\@LRT@getTextDelimited"##1",{\@LRT@getFirstArg{##1}} +\gdef\@LRT@blankFieldItem{,} +\gdef\@LRT@catcodes{} +}% +}} + +{{\catcode`\^^I12\relax% +\gdef\@LRT@setDelimitersTabQuote{ +\gdef\@LRT@fieldDelimiterBack{^^I} +\gdef\@LRT@getFieldDelimited##1^^I{\@LRT@getFirstArg{##1}} +\gdef\@LRT@textDelimiterFront{"} +\gdef\@LRT@getTextDelimited"##1"^^I{\@LRT@getFirstArg{##1}} +\gdef\@LRT@blankFieldItem{} +\gdef\@LRT@catcodes{\catcode`\^^I12\relax} +}% +}} + +\expandafter\gdef\csname1238LRTLRTsvbneLRT\endcsname{@LRT@} +\makeatother +\expandafter\gdef\csname\csname1238LRTLRTsvbneLRT\endcsname +makeMePublic\endcsname\@LRT@#1\becomes#2{\global\letcs{#2}{@LRT@#1}}% +\makeatletter + +\xdef\@LRT@Row{\noexpand\number\noexpand\value{\@LRT@macroPrefix Row}} + +\newcommand{\if@LRT@empty}[3]{\ifthenelse{\equal{#1}{}}{#2}{#3}} + +\gdef\@LRT@fieldName#1{% +\caselower[q]{#1}% +\convertchar[q]{\thestring}{ }{}% +\convertchar[q]{\thestring}{,}{}% +\xdef\@LRT@TheString{\thestring}% +} + +\gdef\@LRT@getFilePaths#1=#2@{% +\xdef\@LRT@hashKey{\trim@spaces{#1}}% +\if@LRT@empty{\@LRT@hashKey}{}{ +\def\@LRT@test{tex}\ifthenelse{\equal{\@LRT@hashKey}{\@LRT@test}}{}% +{\def\@LRT@test{csv}\ifthenelse{\equal{\@LRT@hashKey}{\@LRT@test}}{}% +{\def\@LRT@test{tmp}\ifthenelse{\equal{\@LRT@hashKey}{\@LRT@test}}{}% +{\@LRT@unknownArgumentMessage{#1}}}}% +\@LRT@extractKeyValue#2@% +\expandafter\@LRT@getFilePaths\@LRT@doWeStillHaveStuffToDo @}} + +\def\@LRT@extractKeyValue#1#2@{% +\edef\@LRT@hashValue{\trim@spaces{#1}}% +\xdef\@LRT@doWeStillHaveStuffToDo{\trim@spaces{#2}}% +\expandafter\xdef\csname @LRT@\@LRT@hashKey\endcsname{\@LRT@hashValue}% +} + +\newcommand{\@LRT@SecondifFieldEmpty}[3]{% +\edef\@LRT@fieldValue{#1}% +\ifx\@LRT@fieldValue\@empty\relax{#2}\else{#3}\fi\relax} + +\gdef\@LRT@getCommaFieldDelimited#1,{\@LRT@getFirstArg{#1}} + +\newcounter{\@LRT@macroPrefix Row} + +\newread\@lrt@csvFile% +\newread\@lrt@texFile% +\newwrite\@lrt@tmpFile% + +\gdef\@LRT@justProcessedMessage{% +\immediate\typeout{}% +\immediate\typeout{Just processed row % +\@LRT@Row\space of the data file.}% +\immediate\typeout{}% +\stepcounter{\@LRT@macroPrefix Row}\relax% +} + +\gdef\@LRT@failedToOpenMessage#1{% +\immediate\typeout{}% +\immediate\typeout{File #1 failed to open.}% +\immediate\typeout{}\fi% +\end{document}% +} + +\gdef\@LRT@NoMoreDataMessage{% +\immediate\typeout{No more data.}% +\immediate\typeout{}% +} + +\gdef\@LRT@missingArgumentMessage#1{ +\immediate\typeout{}% +\immediate\typeout{I was never given a path to the #1 file.}% +\immediate\typeout{}% +\end{document}% +} + +\gdef\@LRT@unknownArgumentMessage#1{ +\immediate\typeout{}% +\immediate\typeout{I do not recognize an argument of type #1.}% +\immediate\typeout{}% +} + +\gdef\@LRT@streaming{\input{\@LRT@tex}} + +\gdef\@LRT@catcodeMagic{% +\catcode`\^^M9\relax% +\catcode`\#12\relax +\catcode`\$12\relax +\catcode`\&12\relax +\catcode`\^12\relax +\catcode`\_12\relax +\catcode`\%12\relax +} + +\gdef\@LRT@texNotAtEOF#1{% +\ifeof\@lrt@texFile{\global\booltrue{@LRT@texEOF}}\else{#1}\fi% +} + +\gdef\@LRT@storage{{% +\@LRT@catcodeMagic% +\openin\@lrt@texFile=\@LRT@tex\relax% +\@LRT@texNotAtEOF{\global\boolfalse{@LRT@texEOF}}% +\unlessboolexpr{bool{@LRT@texEOF}}{% +\read\@lrt@texFile to \@LRT@preItem% +\@LRT@texNotAtEOF{% +\immediate\write\@lrt@tmpFile{\@LRT@preItem}\relax}% +}{}% +\immediate\closein\@lrt@texFile% +}} + +\gdef\@LRT@dataLineIterator{% +\expandafter\@ifnextchar\@LRT@textDelimiterFront% +{\@LRT@getTextDelimited}{\@LRT@getFieldDelimited}} + +\gdef\@LRT@getFirstArg#1{\gdef\@LRT@firstArg{#1}\@LRT@getSecondArg} +\gdef\@LRT@getSecondArg#1@{\gdef\@LRT@restArg{#1}} + +\gdef\@LRT@getLOFirstArg#1{\gdef\@LRT@ffirstArg{#1}\@LRT@getLOSecondArg} +\gdef\@LRT@getLOSecondArg#1@{\gdef\@LRT@frestArg{#1}} + +\gdef\@LRT@fieldNameIterator#1,{\@LRT@getLOFirstArg{#1}} + +\providebool{@LRT@iterator} +\gdef\@LRT@setFirstLineAndBlankLine#1{% +\gdef\@lrt@firstline{}% +\gdef\@LRT@csvBlankLine{} +\edef\@LRT@restArg{#1\@LRT@fieldDelimiterBack} +\booltrue{@LRT@iterator}% +\whileboolexpr{bool{@LRT@iterator}}{% +\expandafter\@LRT@dataLineIterator\@LRT@restArg @% +\@LRT@fieldName{\@LRT@firstArg}% +\xdef\@lrt@firstline{\@lrt@firstline\@LRT@TheString,}% +\if@LRT@empty{\@LRT@restArg}% +{\boolfalse{@LRT@iterator}}{\booltrue{@LRT@iterator}}% +\ifboolexpr{bool{@LRT@iterator}}% +{\xdef\@LRT@csvBlankLine{\@LRT@csvBlankLine\@LRT@blankFieldItem}}{}% +}{}% +} + +\gdef\@LRT@getAndProcessNextLine{% +\unlessboolexpr{bool{@LRT@csvEOF}}{% +{{% +\@LRT@catcodeMagic% +\@LRT@catcodes +\read\@lrt@csvFile to\@LRT@x@nextLine% +\ifeof\@lrt@csvFile\relax{\global\booltrue{@LRT@csvEOF}}\else% +{\global\boolfalse{@LRT@csvEOF}}\fi% +\xdef\@LRT@nextLine{\@LRT@x@nextLine}% +}}% +{{% +\if@LRT@empty{\@LRT@nextLine}% +{\global\let\@LRT@next\@LRT@exitGetAndProcessNextLine\relax}% +{\ifx\@LRT@csvBlankLine\@LRT@nextLine\relax% +{\global\let\@LRT@next\@LRT@exitGetAndProcessNextLine\relax}\else% +{\global\let\@LRT@next\@LRT@repeatGetAndProcessNextLine\relax}\fi}% +\@LRT@next% +}}% +}{}% +} + +\gdef\@LRT@exitGetAndProcessNextLine{% +\closein\@lrt@csvFile\relax\global\booltrue{@LRT@csvEOF}} + +\gdef\@LRT@repeatGetAndProcessNextLine{% +\@LRT@processNextLine{\@LRT@nextLine\@LRT@fieldDelimiterBack}} + +\gdef\@LRT@setMacrosForOneEntry#1#2{% +\expandafter\xdef\csname\@LRT@macroPrefix#1\endcsname{#2}% +\@LRT@SecondifFieldEmpty{#2}% +{\global\booltrue{\@LRT@macroPrefix#1}}% +{\global\boolfalse{\@LRT@macroPrefix#1}}% +} + +\gdef\@LRT@processNextLine#1{% +\edef\@LRT@restArg{#1}% +\edef\@LRT@frestArg{\@lrt@firstline}% +\booltrue{@LRT@iterator}% +\whileboolexpr{bool{@LRT@iterator}}{% +\expandafter\@LRT@fieldNameIterator\@LRT@frestArg @% +\edef\@LRT@restArgA{\@LRT@restArg\@LRT@fieldDelimiterBack} +\expandafter\@LRT@dataLineIterator\@LRT@restArgA @% +\@LRT@setMacrosForOneEntry{\@LRT@ffirstArg}{\@LRT@firstArg}% +\if@LRT@empty{\@LRT@frestArg}% +{\boolfalse{@LRT@iterator}}{\booltrue{@LRT@iterator}}% +}{}% +\@LRT@Input\relax% +\@LRT@justProcessedMessage% +} + +\gdef\@LRT@mergeData{% +\providebool{@LRT@texEOF}% +\immediate\openin\@lrt@csvFile=\@LRT@csv\relax% +\providebool{@LRT@csvEOF}% +\boolfalse{@LRT@csvEOF}% +\ifeof\@lrt@csvFile\@LRT@failedToOpenMessage{\@LRT@csv}\fi% +{{\@LRT@catcodes +\read\@lrt@csvFile to\@lrt@firstlineX% +\@LRT@setFirstLineAndBlankLine{\@lrt@firstlineX} +}}% +\booltrue{@LRT@iterator} +\edef\@LRT@restArg{\@lrt@firstline}% +\whileboolexpr{bool{@LRT@iterator}}{% +\expandafter\@LRT@getCommaFieldDelimited\@LRT@restArg @% +\providebool{\@LRT@macroPrefix\@LRT@firstArg}% +\if@LRT@empty{\@LRT@restArg}% +{\boolfalse{@LRT@iterator}}{\booltrue{@LRT@iterator}}% +}{}% +\@LRT@getAndProcessNextLine% +\@LRT@NoMoreDataMessage% +} + +\gdef\@LRT@weirdOption#1{\@ifundefined{@LRT@CO}% +{\global\csletcs{#1}{@LRT@#1}}{{\global\csletcs{\@LRT@CO #1}{@LRT@#1}}}% +} + +\@LRT@weirdOption{mergeFields}% +\@LRT@weirdOption{Field}% +\@LRT@weirdOption{ifFieldEmpty}% +\@LRT@weirdOption{setDelimitersCommaQuote}% +\@LRT@weirdOption{setDelimitersTabQuote}% +\@LRT@weirdOption{makeMePublic}% + +\@LRT@setDelimitersCommaQuote + +\makeatother +\endinput +%% +%% End of file `csvmerge.sty'. -- cgit v1.2.3