From c24ba2a11124164cf7758004c161f6070f6da6a5 Mon Sep 17 00:00:00 2001 From: Matthijs Kooijman Date: Thu, 11 Jun 2009 15:47:55 +0200 Subject: [PATCH 1/1] Make pret-lam support superscripts. Both explicit superscripts, using _ and implicit by just appending a number are supported. --- pret-lam.lua | 37 ++++++++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 9 deletions(-) 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) -- 2.30.2