X-Git-Url: https://git.stderr.nl/gitweb?p=matthijs%2Fmaster-project%2Freport.git;a=blobdiff_plain;f=pret-lam.lua;h=77fcc5dcda8fdab9b456ac95fcb61e65b4d2f5de;hp=b882196ed522070743b40959e36a51940d8f5aee;hb=c24ba2a11124164cf7758004c161f6070f6da6a5;hpb=1c6eecb8f77839e208982f450d0ad90bd19e1177 diff --git a/pret-lam.lua b/pret-lam.lua index b882196..77fcc5d 100644 --- a/pret-lam.lua +++ b/pret-lam.lua @@ -61,36 +61,55 @@ end -- Take a single word from str, if posible. Returns the rest of the string and -- the word taken. function buffers.visualizers.lam.take_word(str) - res, newstr = utf.match(str, "^(%a+)(.*)") + res, newstr = utf.match(str, "^(%a[%a%d_]+)(.*)") return res, newstr or str end +-- Tries to match each of the patterns and returns the captures of the first +-- matching pattern (up to 5 captures are supported). Returns nil when nothing +-- matches. +function buffers.visualizers.lam.match_mul(str, patterns) + for i, pat in ipairs(patterns) do + a, b, c, d, e = utf.match(str, pat) + if a then + return a, b, c, d, e + end + end + return nil +end + function buffers.visualizers.lam.flush_line(str,nested) local result, state = { }, 0 local finish, change = buffers.finish_state, buffers.change_state local take_symbol = buffers.visualizers.lam.take_symbol local take_word = buffers.visualizers.lam.take_word + local match_mul = buffers.visualizers.lam.match_mul -- Set the colorscheme, which is used by finish_state and change_state buffers.currentcolors = buffers.visualizers.lam.colors while str ~= "" do local found = false - local res + local word, symbol -- See if the next token is a word - res, str = take_word(str) - if res then + word, str = take_word(str) + if word then if buffers.visualizers.lam.keywords[res] then - -- Make all keywors bold - res = "{\\bold " .. res .. "}" + -- Make all keywords bold + word = "{\\bold " .. word .. "}" + else + -- Allow subscripts using _ or just appending a number. + base, sub = match_mul(res, {"^(.*)_([%a%d,]+)$", "^(.*[^%d])(%d*)$"}) + if sub then + word = base .. "\\low{" .. sub .. "}" + end end - -- All other words are unmodified else -- The next token is not a word, it must be a symbol - res, str = take_symbol(str) + symbol, str = take_symbol(str) end -- Append the resulting token - result[#result+1] = res + result[#result+1] = word or symbol end state = finish(state, result)