From: Philipp Gesang <Philipp.Gesang@alumni.uni-heidelberg.de>
To: mailing list for ConTeXt users <ntg-context@ntg.nl>
Subject: Re: "Hiding" columns in m-database & TABLE
Date: Fri, 23 Nov 2012 13:38:35 +0100 [thread overview]
Message-ID: <20121123123835.GB8788@phlegethon.router_intern> (raw)
In-Reply-To: <50AE6708.5020109@wxs.nl>
[-- Attachment #1.1: Type: text/plain, Size: 5876 bytes --]
···<date: 2012-11-22, Thursday>···<from: Hans Hagen>···
> On 11/22/2012 3:36 PM, Marcin Borkowski wrote:
> >Dnia 2012-11-22, o godz. 13:26:52
> >Mojca Miklavec <mojca.miklavec.lists@gmail.com> napisał(a):
> >
> >>On Thu, Nov 22, 2012 at 12:57 PM, Marcin Borkowski wrote:
> >>>le) in order to
> >>>typeset a (nice) TABLE. However, I have a few columns I'd like to
> >>>omit. I can (of course) hand-edit the csv file; but is there a way
> >>>to do it automatically? Something like
> >>>
> >>>\setupTABLE[column][3,4,5][kill]
> >>>
> >>>I did [empty=yes,width=0pt] in place of [kill], and it worked, but
> >>>it seems like a hack (and I don't know whether it does actually
> >>>process the cells I'm omitting - which in my case wouldn't bother
> >>>me, but might be an additional layer of inelegance;)). And better
> >>>ideas?
> >>
> >>If you have up to 9 columns, you could use
> >>
> >> \def\ProcessingLine#1#2#3#4#5#6#7{%
> >> \bTR\bTD#1\eTD\bTD#2\eTD\bTD#6\eTD\bTD#7\eTD}
> >>
> >>and then [command=\ProcessingLine]
> >
> >Well, something like 20 columns (on A4 landscape). ;)
> >
> >It turns out that my method somehow doesn't work well without setting
> >also height=0pt; then it's fine, but I'm still wondering about a
> >cleaner way.
>
> I've added a splutter to the core:
>
> \startluacode
>
> local mycsvsplitter = utilities.parsers.csvsplitter {
> separator = ",",
> quote = '"',
> }
>
> local crap = [[
> "1","2","3","4"
> "a","b","c","d"
> ]]
>
> local mycrap = mycsvsplitter(crap)
>
> context.bTABLE()
> for i=1,#mycrap do
> context.bTR()
> local c = mycrap[i]
> for i=1,#c do
> context.bTD()
> context(c[i])
> context.eTD()
> end
> context.eTR()
> end
> context.eTABLE()
>
> \stopluacode
Hi Hans,
although csv is not a standard per se there is nevertheless an
rfc: <http://tools.ietf.org/html/rfc4180>. Can we have an
optional rfc-compliant parser as well? That entails interpreting
the first line as field header if it consists entirely of
unquoted fields -- neat feature as one can treat these as column
identifiers to query fields in a more natural fashion.
·································································
\starttext
\startluacode
local P, R, V, S, C, Ct, Cs, Carg, Cc, Cg, Cf = lpeg.P, lpeg.R, lpeg.V, lpeg.S, lpeg.C, lpeg.Ct, lpeg.Cs, lpeg.Carg, lpeg.Cc, lpeg.Cg, lpeg.Cf
local lpegmatch = lpeg.match
local patterns = lpeg.patterns
local newline = patterns.newline
-----------------------------------------------------------------------
-- RFC 4180 csv parser
-----------------------------------------------------------------------
-- based on http://tools.ietf.org/html/rfc4180
-- notable deviations from the RFC grammar:
-- · allow overriding “comma” and “quote” chars in spec
-- · the “textdata” rule is extrapolated to mean, basically,
-- “everything but the quote character”, not just the character
-- range as in the RFC
-- · newline from l-lpeg.lua instead of “crlf”
local rfc4180_spec = { separator = ",", quote = [["]] }
utilities.parsers.rfc4180_splitter = function (specification)
specification = specification or rfc4180_spec
local separator = specification.separator --> rfc: COMMA
local quotechar = P(specification.quote) --> DQUOTE
local dquotechar = quotechar * quotechar --> 2DQUOTE
/ specification.quote
local separator = S(separator ~= "" and separator or ",")
local escaped = quotechar
* Cs((dquotechar + (1 - quotechar))^0)
* quotechar
local non_escaped = C((1 - quotechar - newline - separator)^1)
local field = escaped + non_escaped
local record = Ct(field * (separator * field)^0)
local name = field -- sic!
local header = Cg(Ct(name * (separator * name)^0), "header")
local file = Ct((header * newline)^-1 -- optional header
* record
* (newline * record)^0
* newline^0)
return function (data) return lpegmatch (file, data) end
end
-----------------------------------------------------------------------
-- example writer (natural table)
-----------------------------------------------------------------------
local print_csv_table = function (tab)
local header = tab.header
context.setupTABLE({ frame = "off" })
context.setupTABLE({"header"}, { background = "screen" })
context.bTABLE()
if header then
context.bTABLEhead()
context.bTR()
for i=1,#header do
context.bTH()
context(header[i])
context.eTH()
end
context.eTR()
context.eTABLEhead()
end
context.bTABLEbody()
for i=1,#tab do
context.bTR()
local c = tab[i]
for i=1,#c do
context.bTD()
context(c[i])
context.eTD()
end
context.eTR()
end
context.eTABLEbody()
context.eTABLE()
end
-----------------------------------------------------------------------
-- usage
-----------------------------------------------------------------------
local mycsvsplitter = utilities.parsers.rfc4180_splitter ()
local crap = [[
first,second,third,fourth
"1","2","3","4"
"a","b","c","d"
"foo","bar""baz","boogie","xyzzy"
]]
local mycrap = mycsvsplitter(crap)
print_csv_table (mycrap)
-----------------------------------------------------------------------
\stopluacode
\stoptext
[-- Attachment #1.2: Type: application/pgp-signature, Size: 198 bytes --]
[-- Attachment #2: Type: text/plain, Size: 485 bytes --]
___________________________________________________________________________________
If your question is of interest to others as well, please add an entry to the Wiki!
maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context
webpage : http://www.pragma-ade.nl / http://tex.aanhet.net
archive : http://foundry.supelec.fr/projects/contextrev/
wiki : http://contextgarden.net
___________________________________________________________________________________
next prev parent reply other threads:[~2012-11-23 12:38 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-11-22 11:57 Marcin Borkowski
2012-11-22 12:26 ` Mojca Miklavec
2012-11-22 14:36 ` Marcin Borkowski
2012-11-22 16:12 ` Alan BRASLAU
2012-11-22 17:55 ` Hans Hagen
2012-11-23 12:38 ` Philipp Gesang [this message]
2012-11-23 16:40 ` Hans Hagen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20121123123835.GB8788@phlegethon.router_intern \
--to=philipp.gesang@alumni.uni-heidelberg.de \
--cc=ntg-context@ntg.nl \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).