summaryrefslogtreecommitdiff
path: root/script-beta/parser/lines.lua
diff options
context:
space:
mode:
Diffstat (limited to 'script-beta/parser/lines.lua')
-rw-r--r--script-beta/parser/lines.lua46
1 files changed, 46 insertions, 0 deletions
diff --git a/script-beta/parser/lines.lua b/script-beta/parser/lines.lua
new file mode 100644
index 00000000..c7961d13
--- /dev/null
+++ b/script-beta/parser/lines.lua
@@ -0,0 +1,46 @@
+local m = require 'lpeglabel'
+local utf8Len = utf8.len
+
+_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,
+}
+
+return function (self, text)
+ local lines, err = parser:match(text)
+ if not lines then
+ return nil, err
+ end
+
+ return lines
+end