X-Git-Url: https://git.stderr.nl/gitweb?p=matthijs%2Fmaster-project%2Freport.git;a=blobdiff_plain;f=pret-lam.lua;h=43e8c8cc25f305ecf44b10e7d5a9b3b4311ca0ea;hp=ba3829c2a7bc77fdc50f63bbbc3b1cde67788eeb;hb=898bdb75483e570effe1a926592fc938419d83e9;hpb=2632b37c704f17c78b1dd023e9c9688918b7ee31 diff --git a/pret-lam.lua b/pret-lam.lua index ba3829c..43e8c8c 100644 --- a/pret-lam.lua +++ b/pret-lam.lua @@ -28,7 +28,6 @@ local symbols = { ['*'] = {repr = '\\ast'}, ['~'] = {repr = '\\HDLine[width=.20 * \\the\\textwidth]'}, ['|'] = {repr = '\\char' .. utf.byte('|')}, - ['$'] = {repr = '\\char' .. utf.byte('$')}, -- Use ▶ from our roman font, since Iwona doesn't have the glyph ['▶'] = {repr = '{\\rm{}▶}'}, } @@ -50,6 +49,15 @@ local bases = {} -- Store the last line for each indent level local indentlines = {} +function array_concat(a1, a2) + local res = a1 + for k,v in ipairs(a2) do + table.insert(res, v) + end + return res +end + + -- See if str starts with a symbol, and return the remaining string and that -- symbol. If no symbol from the table is matched, just returns the first -- character. We can do a lookup directly, since symbols can be different in @@ -198,7 +206,7 @@ function vis.begin_of_display() if in_block == 0 then -- Initially allow subscripts using _ or just appending a number (later, -- we will add extra patterns here. - submatches = {"^(%a*)_([%a%d,]+)$", "^(%a+)([%d,]+)$"} + submatches = {"^(%a*)_([%a%d,]+)$", "^(%a+)(%d[%d,]+)$"} -- This stores all the bases we've encountered so far (to prevent -- duplicates). For each of them there will be a pattern in submatches -- above. @@ -213,38 +221,58 @@ vis.begin_of_inline = vis.begin_of_display vis.end_of_inline = vis.end_of_display function vis.flush_line(str,nested) - local result, state = { }, 0 - local finish, change = buffers.finish_state, buffers.change_state - str = do_indent(str) - -- Set the colorscheme, which is used by finish_state and change_state - buffers.currentcolors = colors + buffers.flush_result(vis.do_line(str, false), nested) +end + +function vis.do_line(str, no_indent) + local result = {} + if not no_indent then + -- Allow ignore of the indentation stuff when we're calling ourselves + -- for a partial line. + str = do_indent(str) + end while str ~= "" do local found = false local word, symbol - -- See if the next token is a word - word, str = take_word(str) - if word then - if keywords[res] then - -- Make all keywords bold - word = "{\\bold " .. word .. "}" - if keywords[res].small then - word = "\\small" .. word -- Curlies were added above + local text, rest = utf.match(str, "^%-%-(.-)%-%-(.*)") + if text then + table.insert(result, '\\strikethrough{') + -- Recursively call ourselves to handle spaces gracefully. + result = array_concat(result, vis.do_line(text, true)) + table.insert(result, '}') + -- Eat the processed characters + str = rest + elseif utf.match(str, "^%-%-") then + table.insert(result, '{\\italic{--') + -- Recursively call ourselves to handle spaces gracefully. + result = array_concat(result, vis.do_line(utf.sub(str, 3), true)) + table.insert(result, '}}') + -- Done with this line + str = '' + else + -- See if the next token is a word + word, str = take_word(str) + if word then + if keywords[res] then + -- Make all keywords bold + word = "{\\bold " .. word .. "}" + if keywords[res].small then + word = "\\small" .. word -- Curlies were added above + end + else + -- Process any subscripts in the word + word = do_subscripts(word) end + table.insert(result, word) else - -- Process any subscripts in the word - word = do_subscripts(word) + -- The next token is not a word, it must be a symbol + symbol, str = take_symbol(str) + table.insert(result, symbol) end - else - -- The next token is not a word, it must be a symbol - symbol, str = take_symbol(str) end - - -- Append the resulting token - result[#result+1] = word or symbol end - - state = finish(state, result) - buffers.flush_result(result,nested) + + return result end -- vim: set sw=4 sts=4 expandtab ai: