%D \module %D [ file=m-ipsum, %D version=2012.07.19, %D title=\CONTEXT\ Extra Modules, %D subtitle=Ipsum, %D author=Hans Hagen, %D date=\currentdate, %D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] %C %C This module is part of the \CONTEXT\ macro||package and is %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. %D After some discussing on the mailing list I made this example of %D an implementation. Of course there can be alternatives as it's a %D nice exercise in module writing. \startluacode local patterns = lpeg.patterns local variables = interfaces.variables local v_random = variables.random local lowercase = characters.lower local ipsum = { } moduledata.ipsum = ipsum local data = { } local function getfiledata(settings) local filename = settings.filename or "" local filedata = data[filename] if not filedata then local text = resolvers.loadtexfile(filename) or "" local paragraphs = lpeg.match(patterns.paragraphs,text) or { } local sentences = lpeg.match(patterns.sentences, text) or { } local words = lpeg.match(patterns.words, text) or { } for i=1,#words do words[i] = lowercase(words[i]) end filedata = { -- [variables.paragraphs] = paragraphs, [variables.paragraph] = paragraphs, [variables.lines] = sentences, [variables.line] = sentences, [variables.words] = words, [variables.word] = words, } -- inspect(filedata) data[filename] = filedata end local d = filedata[settings.alternative or v_paragraph] or filedata[v_paragraph] or { } local nd = #d local n = settings.n if n ~= v_random then n = tonumber(n) or 0 if n == 0 then n = nd end end return d, n, nd end function moduledata.ipsum.typeset(settings) local d, n, nd = getfiledata(settings) if nd > 0 then context(settings.before) if n == v_random then context(settings.left) context(d[math.random(1,nd)]) context(settings.right) else for i=1,n do context(settings.left) context(d[i]) context(settings.right) if i < n then context(settings.inbetween) end end end context(settings.after) end end function moduledata.ipsum.direct(settings) local d, n, nd = getfiledata(settings) if nd == 0 then -- nothing elseif n == v_random then context(d[math.random(1,nd)]) else for i=1,n do context(d[i]) if i < n then context(settings.separator) end end end end interfaces.implement { name = "ipsum", protected = true, actions = moduledata.ipsum.typeset, arguments = { { { "alternative" }, { "filename" }, { "n" }, { "left" }, { "right" }, { "before" }, { "after" }, { "inbetween" }, { "separator" }, } }, } \stopluacode \unprotect \installnamespace {ipsum} \installcommandhandler \????ipsum {ipsum} \????ipsum \setupipsum [\c!file=lorem, \c!alternative=\v!paragraph, %\c!language=, %\c!styl=, %\c!color=, \c!n=0, \c!left=, \c!right=, \c!before=, \c!after=, \c!separator=, \c!inbetween=] \installactionhandler{ipsum} % grouped \startsetups[handler:action:ipsum] \useipsumstyleandcolor\c!style\c!color % hm, also changes dates \uselanguageparameter\ipsumparameter \clf_ipsum alternative {\ipsumparameter\c!alternative} filename {\ipsumparameter\c!file} n {\ipsumparameter\c!n} left {\ipsumparameter\c!left} right {\ipsumparameter\c!right} before {\ipsumparameter\c!before} after {\ipsumparameter\c!after} inbetween {\ipsumparameter\c!inbetween} \relax \stopsetups \def\directipsum#1% only one argument, expanded {\clf_ipsum alternative {\namedipsumparameter{#1}\c!alternative} filename {\namedipsumparameter{#1}\c!file} n {\namedipsumparameter{#1}\c!n} separator {\ipsumparameter\c!separator} \relax} \protect \continueifinputfile{m-ipsum.mkiv} \setupbodyfont[dejavu,11pt] \starttext \ipsum[alternative=paragraph,before=\blank,after=\blank,language=la] \ipsum[alternative=lines,n=2,right=\par,before=\blank,after=\blank,language=la] \ipsum[alternative=lines,n=random,before=\blank,after=\blank,language=la] \ipsum[alternative=lines,before=\startitemize,after=\stopitemize,left=\startitem,right=\stopitem,language=la] \ipsum[alternative=words,left=(,right=),inbetween=\space,language=la] \page \defineipsum [ward] [file=ward, before=\blank, after=\blank] \defineipsum [ward:itemize] [ward] [alternative=lines, before={\startitemize[packed]}, after=\stopitemize, left=\startitem, right=\stopitem] \defineipsum [ward:title] [ward] [alternative=lines, n=random] \subject{\directipsum{ward:title}} \ipsum[ward] \ipsum[ward:itemize] \stoptext