elisp2any 0.0.5 → 0.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +15 -0
- data/LICENSE.txt +674 -202
- data/README.md +31 -7
- data/Rakefile +5 -52
- data/exe/elisp2any +27 -17
- data/lib/elisp/comment.rb +32 -0
- data/lib/elisp/default.css +11 -0
- data/lib/elisp/doc_string_parser.rb +96 -0
- data/lib/elisp/heading.rb +31 -0
- data/lib/elisp/parser.rb +161 -0
- data/lib/elisp/version.rb +18 -0
- data/lib/elisp.rb +99 -0
- metadata +12 -96
- data/.document +0 -4
- data/.envrc +0 -3
- data/.rdoc_options +0 -2
- data/.rubocop.yml +0 -11
- data/lib/elisp2any/asciidoc_renderer/index.adoc.erb +0 -15
- data/lib/elisp2any/asciidoc_renderer.rb +0 -57
- data/lib/elisp2any/aside.rb +0 -23
- data/lib/elisp2any/blanklines.rb +0 -20
- data/lib/elisp2any/code.rb +0 -49
- data/lib/elisp2any/codeblock.rb +0 -56
- data/lib/elisp2any/comment.rb +0 -19
- data/lib/elisp2any/commentary.rb +0 -32
- data/lib/elisp2any/expression.rb +0 -90
- data/lib/elisp2any/file.rb +0 -63
- data/lib/elisp2any/footer_line.rb +0 -28
- data/lib/elisp2any/header_line.rb +0 -80
- data/lib/elisp2any/heading.rb +0 -68
- data/lib/elisp2any/html_renderer/index.html.erb +0 -23
- data/lib/elisp2any/html_renderer.erb +0 -22
- data/lib/elisp2any/html_renderer.rb +0 -149
- data/lib/elisp2any/inline_code.rb +0 -10
- data/lib/elisp2any/line.rb +0 -52
- data/lib/elisp2any/node.rb +0 -67
- data/lib/elisp2any/paragraph.rb +0 -37
- data/lib/elisp2any/section.rb +0 -49
- data/lib/elisp2any/text.rb +0 -33
- data/lib/elisp2any/tree_sitter_parser.rb +0 -36
- data/lib/elisp2any/version.rb +0 -4
- data/lib/elisp2any.rb +0 -27
- data/manifest.scm +0 -87
- data/sig/elisp2any.gen.rbs +0 -112
- data/sig/elisp2any.rbs +0 -4
metadata
CHANGED
|
@@ -1,43 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: elisp2any
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.0.
|
|
4
|
+
version: 0.0.7
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- gemmaro
|
|
8
|
-
autorequire:
|
|
9
8
|
bindir: exe
|
|
10
9
|
cert_chain: []
|
|
11
|
-
date:
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
12
11
|
dependencies:
|
|
13
|
-
- !ruby/object:Gem::Dependency
|
|
14
|
-
name: ruby_tree_sitter
|
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
|
16
|
-
requirements:
|
|
17
|
-
- - "~>"
|
|
18
|
-
- !ruby/object:Gem::Version
|
|
19
|
-
version: 0.20.8.1
|
|
20
|
-
type: :runtime
|
|
21
|
-
prerelease: false
|
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
-
requirements:
|
|
24
|
-
- - "~>"
|
|
25
|
-
- !ruby/object:Gem::Version
|
|
26
|
-
version: 0.20.8.1
|
|
27
|
-
- !ruby/object:Gem::Dependency
|
|
28
|
-
name: asciidoctor
|
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
|
30
|
-
requirements:
|
|
31
|
-
- - ">="
|
|
32
|
-
- !ruby/object:Gem::Version
|
|
33
|
-
version: '0'
|
|
34
|
-
type: :development
|
|
35
|
-
prerelease: false
|
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
-
requirements:
|
|
38
|
-
- - ">="
|
|
39
|
-
- !ruby/object:Gem::Version
|
|
40
|
-
version: '0'
|
|
41
12
|
- !ruby/object:Gem::Dependency
|
|
42
13
|
name: rake
|
|
43
14
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -52,20 +23,6 @@ dependencies:
|
|
|
52
23
|
- - "~>"
|
|
53
24
|
- !ruby/object:Gem::Version
|
|
54
25
|
version: '13.0'
|
|
55
|
-
- !ruby/object:Gem::Dependency
|
|
56
|
-
name: rubocop
|
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
|
58
|
-
requirements:
|
|
59
|
-
- - "~>"
|
|
60
|
-
- !ruby/object:Gem::Version
|
|
61
|
-
version: '1.21'
|
|
62
|
-
type: :development
|
|
63
|
-
prerelease: false
|
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
-
requirements:
|
|
66
|
-
- - "~>"
|
|
67
|
-
- !ruby/object:Gem::Version
|
|
68
|
-
version: '1.21'
|
|
69
26
|
- !ruby/object:Gem::Dependency
|
|
70
27
|
name: test-unit
|
|
71
28
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -80,22 +37,8 @@ dependencies:
|
|
|
80
37
|
- - "~>"
|
|
81
38
|
- !ruby/object:Gem::Version
|
|
82
39
|
version: '3.0'
|
|
83
|
-
- !ruby/object:Gem::Dependency
|
|
84
|
-
name: webrick
|
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
|
86
|
-
requirements:
|
|
87
|
-
- - ">="
|
|
88
|
-
- !ruby/object:Gem::Version
|
|
89
|
-
version: '0'
|
|
90
|
-
type: :development
|
|
91
|
-
prerelease: false
|
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
93
|
-
requirements:
|
|
94
|
-
- - ">="
|
|
95
|
-
- !ruby/object:Gem::Version
|
|
96
|
-
version: '0'
|
|
97
40
|
description: elisp2any is a command line tool and library for converting Emacs Lisp
|
|
98
|
-
source to some document markup, such as HTML
|
|
41
|
+
source to some document markup, such as HTML.
|
|
99
42
|
email:
|
|
100
43
|
- gemmaro.dev@gmail.com
|
|
101
44
|
executables:
|
|
@@ -103,10 +46,6 @@ executables:
|
|
|
103
46
|
extensions: []
|
|
104
47
|
extra_rdoc_files: []
|
|
105
48
|
files:
|
|
106
|
-
- ".document"
|
|
107
|
-
- ".envrc"
|
|
108
|
-
- ".rdoc_options"
|
|
109
|
-
- ".rubocop.yml"
|
|
110
49
|
- CHANGELOG.md
|
|
111
50
|
- Gemfile
|
|
112
51
|
- LICENSE.txt
|
|
@@ -114,37 +53,16 @@ files:
|
|
|
114
53
|
- Rakefile
|
|
115
54
|
- exe/elisp2any
|
|
116
55
|
- fixtures/init.el
|
|
117
|
-
- lib/
|
|
118
|
-
- lib/
|
|
119
|
-
- lib/
|
|
120
|
-
- lib/
|
|
121
|
-
- lib/
|
|
122
|
-
- lib/
|
|
123
|
-
- lib/
|
|
124
|
-
- lib/elisp2any/comment.rb
|
|
125
|
-
- lib/elisp2any/commentary.rb
|
|
126
|
-
- lib/elisp2any/expression.rb
|
|
127
|
-
- lib/elisp2any/file.rb
|
|
128
|
-
- lib/elisp2any/footer_line.rb
|
|
129
|
-
- lib/elisp2any/header_line.rb
|
|
130
|
-
- lib/elisp2any/heading.rb
|
|
131
|
-
- lib/elisp2any/html_renderer.erb
|
|
132
|
-
- lib/elisp2any/html_renderer.rb
|
|
133
|
-
- lib/elisp2any/html_renderer/index.html.erb
|
|
134
|
-
- lib/elisp2any/inline_code.rb
|
|
135
|
-
- lib/elisp2any/line.rb
|
|
136
|
-
- lib/elisp2any/node.rb
|
|
137
|
-
- lib/elisp2any/paragraph.rb
|
|
138
|
-
- lib/elisp2any/section.rb
|
|
139
|
-
- lib/elisp2any/text.rb
|
|
140
|
-
- lib/elisp2any/tree_sitter_parser.rb
|
|
141
|
-
- lib/elisp2any/version.rb
|
|
142
|
-
- manifest.scm
|
|
143
|
-
- sig/elisp2any.gen.rbs
|
|
144
|
-
- sig/elisp2any.rbs
|
|
56
|
+
- lib/elisp.rb
|
|
57
|
+
- lib/elisp/comment.rb
|
|
58
|
+
- lib/elisp/default.css
|
|
59
|
+
- lib/elisp/doc_string_parser.rb
|
|
60
|
+
- lib/elisp/heading.rb
|
|
61
|
+
- lib/elisp/parser.rb
|
|
62
|
+
- lib/elisp/version.rb
|
|
145
63
|
homepage: https://codeberg.org/gemmaro/elisp2any
|
|
146
64
|
licenses:
|
|
147
|
-
-
|
|
65
|
+
- GPL-3.0-or-later
|
|
148
66
|
metadata:
|
|
149
67
|
rubygems_mfa_required: 'true'
|
|
150
68
|
bug_tracker_uri: https://codeberg.org/gemmaro/elisp2any/issues
|
|
@@ -153,7 +71,6 @@ metadata:
|
|
|
153
71
|
homepage_uri: https://codeberg.org/gemmaro/elisp2any
|
|
154
72
|
source_code_uri: https://codeberg.org/gemmaro/elisp2any
|
|
155
73
|
wiki_uri: https://codeberg.org/gemmaro/elisp2any/wiki
|
|
156
|
-
post_install_message:
|
|
157
74
|
rdoc_options: []
|
|
158
75
|
require_paths:
|
|
159
76
|
- lib
|
|
@@ -168,8 +85,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
168
85
|
- !ruby/object:Gem::Version
|
|
169
86
|
version: '0'
|
|
170
87
|
requirements: []
|
|
171
|
-
rubygems_version:
|
|
172
|
-
signing_key:
|
|
88
|
+
rubygems_version: 4.0.10
|
|
173
89
|
specification_version: 4
|
|
174
90
|
summary: Converter from Emacs Lisp to some document markup
|
|
175
91
|
test_files: []
|
data/.document
DELETED
data/.envrc
DELETED
data/.rdoc_options
DELETED
data/.rubocop.yml
DELETED
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
require 'forwardable'
|
|
2
|
-
|
|
3
|
-
module Elisp2any
|
|
4
|
-
# This renderer is experimental.
|
|
5
|
-
class AsciiDocRenderer
|
|
6
|
-
def initialize(file)
|
|
7
|
-
@file = file
|
|
8
|
-
end
|
|
9
|
-
|
|
10
|
-
def render
|
|
11
|
-
erb_renderer('index.adoc.erb')
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
private
|
|
15
|
-
|
|
16
|
-
def render_paragraph(paragraph)
|
|
17
|
-
adoc = ''
|
|
18
|
-
paragraph.each do |line|
|
|
19
|
-
line.each do |chunk|
|
|
20
|
-
case chunk
|
|
21
|
-
when InlineCode
|
|
22
|
-
adoc << "``#{chunk.content}``"
|
|
23
|
-
when String
|
|
24
|
-
adoc << chunk
|
|
25
|
-
end
|
|
26
|
-
end
|
|
27
|
-
end
|
|
28
|
-
adoc
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
def render_block(block, level:)
|
|
32
|
-
adoc = ''
|
|
33
|
-
case block
|
|
34
|
-
when Heading
|
|
35
|
-
prefix = '=' * (level + block.level - 1)
|
|
36
|
-
adoc << "#{prefix} #{block.content}"
|
|
37
|
-
when Paragraph
|
|
38
|
-
adoc << render_paragraph(block)
|
|
39
|
-
when CodeBlock
|
|
40
|
-
adoc << <<~ADOC
|
|
41
|
-
----
|
|
42
|
-
#{block.content}
|
|
43
|
-
----
|
|
44
|
-
ADOC
|
|
45
|
-
end
|
|
46
|
-
adoc
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
def erb_renderer(path)
|
|
50
|
-
source = ::File.read(::File.join(__dir__, 'asciidoc_renderer', path))
|
|
51
|
-
ERB.new(source).result(binding)
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
extend Forwardable # :nodoc:
|
|
55
|
-
def_delegators :@file, :name, :synopsis, :commentary, :code
|
|
56
|
-
end
|
|
57
|
-
end
|
data/lib/elisp2any/aside.rb
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
require "elisp2any/comment"
|
|
2
|
-
|
|
3
|
-
module Elisp2any
|
|
4
|
-
class Aside
|
|
5
|
-
def self.scan(scanner)
|
|
6
|
-
pos = scanner.pos
|
|
7
|
-
com = Comment.scan(scanner) or return
|
|
8
|
-
unless com.colons == 1
|
|
9
|
-
scanner.pos = pos
|
|
10
|
-
return
|
|
11
|
-
end
|
|
12
|
-
new(com.content)
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
def source
|
|
16
|
-
";#{@content}\n"
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
def initialize(content)
|
|
20
|
-
@content = content
|
|
21
|
-
end
|
|
22
|
-
end
|
|
23
|
-
end
|
data/lib/elisp2any/blanklines.rb
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
require "forwardable"
|
|
2
|
-
|
|
3
|
-
module Elisp2any
|
|
4
|
-
class Blanklines
|
|
5
|
-
def self.scan(scanner)
|
|
6
|
-
scanner = StringScanner.new(scanner) unless scanner.respond_to?(:skip)
|
|
7
|
-
count = 0
|
|
8
|
-
count += 1 while !scanner.eos? && scanner.skip(/ *\n/)
|
|
9
|
-
count.zero? and return
|
|
10
|
-
new(count)
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
def initialize(count) # :nodoc:
|
|
14
|
-
@count = count
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
extend Forwardable # :nodoc:
|
|
18
|
-
def_delegator :@count, :to_i
|
|
19
|
-
end
|
|
20
|
-
end
|
data/lib/elisp2any/code.rb
DELETED
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
require "forwardable"
|
|
2
|
-
require "elisp2any/paragraph"
|
|
3
|
-
require "elisp2any/blanklines"
|
|
4
|
-
require "elisp2any/section"
|
|
5
|
-
|
|
6
|
-
module Elisp2any
|
|
7
|
-
class Code
|
|
8
|
-
def self.scan(scanner)
|
|
9
|
-
pos = scanner.pos
|
|
10
|
-
heading = Elisp2any.scan_top_heading(scanner) or return
|
|
11
|
-
unless heading == "Code:"
|
|
12
|
-
scanner.pos = pos
|
|
13
|
-
return
|
|
14
|
-
end
|
|
15
|
-
Blanklines.scan(scanner) # optional
|
|
16
|
-
paragraphs = []
|
|
17
|
-
while (par = Paragraph.scan(scanner))
|
|
18
|
-
paragraphs << par
|
|
19
|
-
Blanklines.scan(scanner) # optional
|
|
20
|
-
end
|
|
21
|
-
blocks = [paragraphs]
|
|
22
|
-
pos = scanner.pos
|
|
23
|
-
while (section = Section.scan(scanner))
|
|
24
|
-
if section.heading.level == 1
|
|
25
|
-
blocks << section
|
|
26
|
-
pos = scanner.pos
|
|
27
|
-
else
|
|
28
|
-
scanner.pos = pos
|
|
29
|
-
break
|
|
30
|
-
end
|
|
31
|
-
end
|
|
32
|
-
new(blocks)
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
def initialize(blocks)
|
|
36
|
-
@blocks = blocks
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
def sections
|
|
40
|
-
@blocks.drop(1)
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
extend Forwardable # :nodoc:
|
|
44
|
-
def_delegator :@blocks, :first, :paragraphs
|
|
45
|
-
def_delegator :@blocks, :each
|
|
46
|
-
|
|
47
|
-
include Enumerable
|
|
48
|
-
end
|
|
49
|
-
end
|
data/lib/elisp2any/codeblock.rb
DELETED
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
require "forwardable"
|
|
2
|
-
require "elisp2any/expression"
|
|
3
|
-
require "elisp2any/blanklines"
|
|
4
|
-
require "elisp2any/aside"
|
|
5
|
-
|
|
6
|
-
module Elisp2any
|
|
7
|
-
class Codeblock # :nodoc:
|
|
8
|
-
def self.scan(scanner)
|
|
9
|
-
scanner = StringScanner.new(scanner) unless scanner.respond_to?(:skip)
|
|
10
|
-
expressions = []
|
|
11
|
-
while (exp = Expression.scan(scanner) ||
|
|
12
|
-
scanner.scan(/[ \n]+/) ||
|
|
13
|
-
Aside.scan(scanner))
|
|
14
|
-
expressions << exp
|
|
15
|
-
end
|
|
16
|
-
expressions.empty? and return
|
|
17
|
-
Blanklines.scan(scanner) # optional
|
|
18
|
-
new(:TODO, expressions:)
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
def source
|
|
22
|
-
@expressions.sum(+"") do |exp|
|
|
23
|
-
case exp
|
|
24
|
-
in String
|
|
25
|
-
exp
|
|
26
|
-
else
|
|
27
|
-
exp.source
|
|
28
|
-
end
|
|
29
|
-
end
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
# TODO: delete node
|
|
33
|
-
# TODO: Remove default empty array
|
|
34
|
-
def initialize(node, expressions: []) # :nodoc:
|
|
35
|
-
@node = node
|
|
36
|
-
@expressions = expressions
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
def append(source, end_byte) # :nodoc:
|
|
40
|
-
@node.append(source, end_byte)
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
def content
|
|
44
|
-
if @node.respond_to?(:content)
|
|
45
|
-
@node.content
|
|
46
|
-
else
|
|
47
|
-
@expressions
|
|
48
|
-
end
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
extend Forwardable # :nodoc:
|
|
52
|
-
def_delegator :@expressions, :each
|
|
53
|
-
|
|
54
|
-
include Enumerable
|
|
55
|
-
end
|
|
56
|
-
end
|
data/lib/elisp2any/comment.rb
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
module Elisp2any
|
|
2
|
-
class Comment
|
|
3
|
-
attr_reader :colons, :content, :padding
|
|
4
|
-
|
|
5
|
-
def self.scan(scanner)
|
|
6
|
-
scanner = StringScanner.new(scanner) unless scanner.respond_to?(:skip)
|
|
7
|
-
scanner.skip(/(?<colons>;+)(?<padding> *)(?<content>.*)\n?/) or return
|
|
8
|
-
new(colons: scanner[:colons].size,
|
|
9
|
-
content: scanner[:content],
|
|
10
|
-
padding: scanner[:padding])
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
def initialize(colons:, content:, padding:)
|
|
14
|
-
@colons = colons
|
|
15
|
-
@content = content
|
|
16
|
-
@padding = padding
|
|
17
|
-
end
|
|
18
|
-
end
|
|
19
|
-
end
|
data/lib/elisp2any/commentary.rb
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
require "forwardable"
|
|
2
|
-
require "elisp2any/paragraph"
|
|
3
|
-
require "elisp2any/blanklines"
|
|
4
|
-
|
|
5
|
-
module Elisp2any
|
|
6
|
-
class Commentary
|
|
7
|
-
def self.scan(scanner)
|
|
8
|
-
pos = scanner.pos
|
|
9
|
-
heading = Elisp2any.scan_top_heading(scanner) or return
|
|
10
|
-
unless heading == "Commentary:"
|
|
11
|
-
scanner.pos = pos
|
|
12
|
-
return
|
|
13
|
-
end
|
|
14
|
-
Blanklines.scan(scanner) # optional
|
|
15
|
-
paragraphs = []
|
|
16
|
-
while (par = Paragraph.scan(scanner))
|
|
17
|
-
paragraphs << par
|
|
18
|
-
Blanklines.scan(scanner) # optional
|
|
19
|
-
end
|
|
20
|
-
new(paragraphs)
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
def initialize(paragraphs)
|
|
24
|
-
@paragraphs = paragraphs
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
extend Forwardable # :nodoc:
|
|
28
|
-
def_delegators :@paragraphs, :each, :size
|
|
29
|
-
|
|
30
|
-
include Enumerable
|
|
31
|
-
end
|
|
32
|
-
end
|
data/lib/elisp2any/expression.rb
DELETED
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
require "strscan"
|
|
2
|
-
|
|
3
|
-
module Elisp2any
|
|
4
|
-
class Expression
|
|
5
|
-
def self.scan(scanner)
|
|
6
|
-
scanner = StringScanner.new(scanner) unless scanner.respond_to?(:skip)
|
|
7
|
-
if scanner.skip("(")
|
|
8
|
-
exps = []
|
|
9
|
-
while (exp = scan(scanner))
|
|
10
|
-
exps << exp
|
|
11
|
-
spaces = scanner.scan(/[ \n]+/)
|
|
12
|
-
exps << spaces if spaces
|
|
13
|
-
end
|
|
14
|
-
scanner.skip(")") or raise Error, scanner.inspect
|
|
15
|
-
new(exps)
|
|
16
|
-
elsif scanner.skip("'")
|
|
17
|
-
exp = scan(scanner) or raise Error, scanner.inspect
|
|
18
|
-
new({ quoted: exp })
|
|
19
|
-
elsif scanner.skip("\"")
|
|
20
|
-
content = +""
|
|
21
|
-
while !scanner.eos? && !scanner.match?("\\") && !scanner.match?('"')
|
|
22
|
-
content << scanner.getch
|
|
23
|
-
end
|
|
24
|
-
scanner.skip('"') or raise Error, scanner.inspect
|
|
25
|
-
new(content)
|
|
26
|
-
elsif scanner.skip("#'")
|
|
27
|
-
exp = scan(scanner) or raise Error, scanner.inspect
|
|
28
|
-
new({ function: exp })
|
|
29
|
-
else
|
|
30
|
-
name = scanner.scan(/[a-z0-9_?.:-]+/) or return
|
|
31
|
-
new(name.to_sym)
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
def source
|
|
36
|
-
case @content
|
|
37
|
-
in { quoted: }
|
|
38
|
-
"'#{self.class.source(quoted)}"
|
|
39
|
-
in String
|
|
40
|
-
@content
|
|
41
|
-
in { function: }
|
|
42
|
-
"#'#{self.class.source(function)}"
|
|
43
|
-
in Array
|
|
44
|
-
result = +"("
|
|
45
|
-
@content.each { |exp| result << self.class.source(exp) }
|
|
46
|
-
"#{result})"
|
|
47
|
-
in Symbol
|
|
48
|
-
@content.to_s
|
|
49
|
-
end
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
def self.source(arg)
|
|
53
|
-
case arg
|
|
54
|
-
in Symbol
|
|
55
|
-
arg.to_s
|
|
56
|
-
in Array
|
|
57
|
-
result = +"("
|
|
58
|
-
arg.sum { |ele| result << source(ele) }
|
|
59
|
-
"#{result})"
|
|
60
|
-
in Expression
|
|
61
|
-
arg.source
|
|
62
|
-
in String
|
|
63
|
-
arg
|
|
64
|
-
else
|
|
65
|
-
raise arg.inspect
|
|
66
|
-
end
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
def deconstruct_keys(*keys)
|
|
70
|
-
result = {}
|
|
71
|
-
keys => [keys]
|
|
72
|
-
keys.each do |key|
|
|
73
|
-
case key
|
|
74
|
-
in :content
|
|
75
|
-
result[:content] = @content
|
|
76
|
-
else # nop
|
|
77
|
-
end
|
|
78
|
-
end
|
|
79
|
-
result
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
def deconstruct
|
|
83
|
-
[*@content]
|
|
84
|
-
end
|
|
85
|
-
|
|
86
|
-
def initialize(content)
|
|
87
|
-
@content = content
|
|
88
|
-
end
|
|
89
|
-
end
|
|
90
|
-
end
|
data/lib/elisp2any/file.rb
DELETED
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
require_relative 'node'
|
|
2
|
-
require_relative 'tree_sitter_parser'
|
|
3
|
-
require "elisp2any/header_line"
|
|
4
|
-
require "elisp2any/blanklines"
|
|
5
|
-
require "elisp2any/commentary"
|
|
6
|
-
require "elisp2any/code"
|
|
7
|
-
require "elisp2any/footer_line"
|
|
8
|
-
|
|
9
|
-
module Elisp2any
|
|
10
|
-
class File
|
|
11
|
-
attr_reader :name, # TODO: filename
|
|
12
|
-
:synopsis, # TODO: header_line, including description
|
|
13
|
-
:commentary, :code, :header_line
|
|
14
|
-
|
|
15
|
-
def self.scan(scanner)
|
|
16
|
-
scanner = scanner.read if scanner.respond_to?(:read)
|
|
17
|
-
scanner = StringScanner.new(scanner) unless scanner.respond_to?(:skip)
|
|
18
|
-
line = HeaderLine.scan(scanner) or return # TODO: header line
|
|
19
|
-
Blanklines.scan(scanner) # optional
|
|
20
|
-
commentary = Commentary.scan(scanner)
|
|
21
|
-
Blanklines.scan(scanner) # optional
|
|
22
|
-
code = Code.scan(scanner)
|
|
23
|
-
footer_line = FooterLine.scan(scanner)
|
|
24
|
-
footer_line == line.filename or raise Error, "header and footer filename is not same: #{line.filename} and #{footer_line.filename}"
|
|
25
|
-
Blanklines.scan(scanner) # optional
|
|
26
|
-
scanner.eos? or raise Error, "extra content after footer line"
|
|
27
|
-
new(name: line.filename,
|
|
28
|
-
synopsis: line.description,
|
|
29
|
-
commentary:,
|
|
30
|
-
code:,
|
|
31
|
-
header_line: line)
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
def self.parse(source)
|
|
35
|
-
source = source.respond_to?(:read) ? source.read : source
|
|
36
|
-
ts_node = TreeSitterParser.parse(source)
|
|
37
|
-
first_heading, second_heading, *nodes, last_heading = Node.from_tree_sitter(source, ts_node)
|
|
38
|
-
name, synopsis = first_heading.name_and_synopsis
|
|
39
|
-
second_heading.commentary? or raise Error, "no commentary heading: #{second_heading.inspect}"
|
|
40
|
-
commentary = []
|
|
41
|
-
until nodes.empty?
|
|
42
|
-
(node = nodes.shift).code? and break
|
|
43
|
-
commentary << node
|
|
44
|
-
end
|
|
45
|
-
code = nodes
|
|
46
|
-
last_heading.final_name == name or raise Error, 'different names'
|
|
47
|
-
new(name: name, synopsis: synopsis, commentary: commentary, code: code)
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
# TODO: Remove nil default from footer line
|
|
51
|
-
def initialize(name:,
|
|
52
|
-
synopsis:,
|
|
53
|
-
commentary:,
|
|
54
|
-
code:,
|
|
55
|
-
header_line: nil) # :nodoc:
|
|
56
|
-
@name = name
|
|
57
|
-
@synopsis = synopsis
|
|
58
|
-
@commentary = commentary
|
|
59
|
-
@code = code
|
|
60
|
-
@header_line = header_line
|
|
61
|
-
end
|
|
62
|
-
end
|
|
63
|
-
end
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
require "forwardable"
|
|
2
|
-
|
|
3
|
-
module Elisp2any
|
|
4
|
-
class FooterLine
|
|
5
|
-
def self.scan(scanner)
|
|
6
|
-
scanner = StringScanner.new(scanner) unless scanner.respond_to?(:pos)
|
|
7
|
-
pos = scanner.pos
|
|
8
|
-
heading = Elisp2any.scan_top_heading(scanner) or return
|
|
9
|
-
cscanner = StringScanner.new(heading)
|
|
10
|
-
unless (filename = Elisp2any.scan_filename(cscanner))
|
|
11
|
-
scanner.pos = pos
|
|
12
|
-
return
|
|
13
|
-
end
|
|
14
|
-
unless cscanner.skip(/ ends here\n?/)
|
|
15
|
-
scanner.pos = pos
|
|
16
|
-
return
|
|
17
|
-
end
|
|
18
|
-
new(filename)
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
def initialize(filename)
|
|
22
|
-
@filename = filename
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
extend Forwardable # :nodoc:
|
|
26
|
-
def_delegator :@filename, :==
|
|
27
|
-
end
|
|
28
|
-
end
|