local lpeg = require("lpeg")
local types = {
"Bi", "Bi","CSR", "Vs", "VI", "VI", "VI", "VI",
"VI", "C", "C", "C", "VI", "VI", "VI", "C",
"C", "C", "C", "C", "C", "C", "C", "C",
"C", "C", "C", "C", "C", "C", "C", "C",
"C", "C", "C", "C", "C", "C", "C", "C",
"C", "C", "C", "C", "C", "C", "C", "C",
"C", "C", "C", "N", "M", "M", "M", "M",
"M", "M", "M", "M", "M", "CS", "CM", "CM",
"V", "x", "x", "x", "x", "x", "x", "x",
"x", "x", "x", "x", "x", "x", "x", "x",
"Nd", "Nd", "Nd", "Nd", "Nd", "Nd", "Nd", "Nd",
"Nd", "Nd", "x", "x", "x", "x", "x", "x"
}
local jv = {}
local P8 = function (c) return lpeg.P(luautf8.char(c)) end
for i = 1, #types do
local cp = i - 1 + 0xA980
local match = P8(cp)
jv[types[i]] = jv[types[i]] and (jv[types[i]]+match) or match
end
jv.medial_ra = P8(0xA9BF)
jv.medial_ya = P8(0xA9BE)
jv.tarung = P8(0xA9B4)
jv.consonant = ((jv.C * jv.N) + jv.C + jv.VI)
jv.consonant_sign = jv.Bi + jv.CSR + jv.Vs + jv.CM
jv.syllable = (jv.consonant * jv.V)^-1 * jv.consonant *
((jv.medial_ra^-1) * jv.medial_ya)^-1 *
(jv.M * jv.tarung^-1)^-1 *
jv.consonant_sign^0
SILE.nodeMakers.jv = pl.class(SILE.nodeMakers.unicode)
function SILE.nodeMakers.jv:iterator (items)
return coroutine.wrap(function ()
local chunk = ""
for i = 1, #items do
local char = items[i].text
chunk = chunk .. char
end
local i = 1
local total = 0
while total < #chunk do
local syll = (lpeg.P(total) * lpeg.C(jv.syllable)):match(chunk)
if syll then
while i < #items do
if items[i].index >= total + #syll then break end
self:addToken(items[i].text, items[i])
i = i + 1
end
total = total + #syll
self:makeToken()
self:makePenalty(0)
else
self:dealWith(items[i])
i = i + 1
if i > #items then break end
total = items[i].index
end
end
self:makeToken()
end)
end