summaryrefslogtreecommitdiff
path: root/script/parser/lines.lua
diff options
context:
space:
mode:
Diffstat (limited to 'script/parser/lines.lua')
-rw-r--r--script/parser/lines.lua69
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