diff options
Diffstat (limited to 'script/parser/lines.lua')
-rw-r--r-- | script/parser/lines.lua | 69 |
1 files changed, 29 insertions, 40 deletions
diff --git a/script/parser/lines.lua b/script/parser/lines.lua index ee6b4f41..1aba0ae5 100644 --- a/script/parser/lines.lua +++ b/script/parser/lines.lua @@ -1,45 +1,34 @@ -local m = require 'lpeglabel' - -_ENV = nil - -local function Line(start, line, range, finish) - line.start = start - line.finish = finish - 1 - line.range = range - 1 - return line -end - -local function Space(...) - local line = {...} - local sp = 0 - local tab = 0 - for i = 1, #line do - if line[i] == ' ' then - sp = sp + 1 - elseif line[i] == '\t' then - tab = tab + 1 - end - line[i] = nil - end - line.sp = sp - line.tab = tab - return line -end - -local parser = m.P{ -'Lines', -Lines = m.Ct(m.V'Line'^0 * m.V'LastLine'), -Line = m.Cp() * m.V'Indent' * (1 - m.V'Nl')^0 * m.Cp() * m.V'Nl' * m.Cp() / Line, -LastLine= m.Cp() * m.V'Indent' * (1 - m.V'Nl')^0 * m.Cp() * m.Cp() / Line, -Nl = m.P'\r\n' + m.S'\r\n', -Indent = m.C(m.S' \t')^0 / Space, -} +local sfind = string.find +local ssub = string.sub +---@param text string return function (self, text) - local lines, err = parser:match(text) - if not lines then - return nil, err + local current = 1 + local lines = {} + local i = 1 + while true do + local pos = sfind(text,'[\r\n]', current) + if not pos then + break + end + local line = { + start = current - 1, + range = pos - 1, + } + lines[i] = line + i = i + 1 + if ssub(text, pos, pos + 1) == '\r\n' then + current = pos + 2 + line.finish = pos + 1 + else + current = pos + 1 + line.finish = pos + end end - + lines[i] = { + start = current - 1, + finish = #text, + range = #text, + } return lines end |