elisp2any 0.0.5 → 0.0.6
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 +4 -0
- data/LICENSE.txt +674 -202
- data/README.md +15 -5
- data/Rakefile +1 -46
- data/exe/elisp2any +2 -16
- data/lib/elisp/comment.rb +93 -0
- data/lib/elisp/parser.rb +188 -0
- data/lib/elisp.rb +142 -0
- data/lib/elisp2any/version.rb +1 -1
- data/lib/elisp2any.rb +0 -1
- metadata +8 -73
- 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/file.rb +0 -63
- data/lib/elisp2any/node.rb +0 -67
- data/lib/elisp2any/tree_sitter_parser.rb +0 -36
- data/manifest.scm +0 -87
- data/sig/elisp2any.gen.rbs +0 -112
- data/sig/elisp2any.rbs +0 -4
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/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
|
data/lib/elisp2any/node.rb
DELETED
@@ -1,67 +0,0 @@
|
|
1
|
-
require_relative 'codeblock'
|
2
|
-
require_relative 'line'
|
3
|
-
require_relative 'heading'
|
4
|
-
require_relative 'paragraph'
|
5
|
-
require 'strscan'
|
6
|
-
|
7
|
-
module Elisp2any
|
8
|
-
# TODO: delete
|
9
|
-
class Node
|
10
|
-
attr_reader :range # :nodoc:
|
11
|
-
attr_reader :content
|
12
|
-
|
13
|
-
def self.from_tree_sitter(source, ts_node) #:nodoc:
|
14
|
-
nodes = []
|
15
|
-
(0 ... ts_node.child_count).map { |index| ts_node[index] }.each do |top_level_node|
|
16
|
-
range = top_level_node.start_byte .. top_level_node.end_byte
|
17
|
-
content = source.byteslice(range)
|
18
|
-
node = Node.new(content, range)
|
19
|
-
case top_level_node.type
|
20
|
-
when :comment
|
21
|
-
scanner = StringScanner.new(content)
|
22
|
-
scanner.skip(';') or raise Error, 'no semicolon for comment'
|
23
|
-
scanner.skip(';') or
|
24
|
-
begin
|
25
|
-
(last_node = nodes.last) && last_node.is_a?(Codeblock) or raise Error, 'no prior code for single semicolon comment'
|
26
|
-
last_node.append(source, range.end)
|
27
|
-
next
|
28
|
-
end
|
29
|
-
|
30
|
-
if (level = scanner.skip(/;+/))
|
31
|
-
scanner.skip(' ') or raise Error, 'no space after heading semicolons'
|
32
|
-
nodes << Heading.new(node, level, scanner.rest.chomp)
|
33
|
-
next
|
34
|
-
elsif scanner.skip("\n")
|
35
|
-
next
|
36
|
-
end
|
37
|
-
|
38
|
-
scanner.skip(' ') or raise Error, "no space after semicolons: #{scanner.inspect}"
|
39
|
-
line = Line.parse(scanner.rest)
|
40
|
-
if (last_node = nodes.last) && last_node.is_a?(Paragraph) && last_node.end_row + 1 == top_level_node.start_point.row
|
41
|
-
last_node << line
|
42
|
-
else
|
43
|
-
paragraph = Paragraph.new(node, [line], top_level_node.end_point.row)
|
44
|
-
nodes << paragraph
|
45
|
-
end
|
46
|
-
else
|
47
|
-
if (last_node = nodes.last) && last_node.is_a?(Codeblock)
|
48
|
-
last_node.append(source, range.end)
|
49
|
-
else
|
50
|
-
nodes << Codeblock.new(node)
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
nodes
|
55
|
-
end
|
56
|
-
|
57
|
-
def append(source, end_byte) # :nodoc:
|
58
|
-
@range = range = @range.begin .. end_byte
|
59
|
-
@content = source.byteslice(range)
|
60
|
-
end
|
61
|
-
|
62
|
-
def initialize(content, range) # :nodoc:
|
63
|
-
@content = content
|
64
|
-
@range = range
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
@@ -1,36 +0,0 @@
|
|
1
|
-
require 'tree_sitter'
|
2
|
-
|
3
|
-
module Elisp2any
|
4
|
-
class TreeSitterParser # :nodoc:
|
5
|
-
def self.parse(source)
|
6
|
-
new(source).parse
|
7
|
-
end
|
8
|
-
|
9
|
-
def parse
|
10
|
-
@node = parser.parse_string(nil, @source).root_node
|
11
|
-
end
|
12
|
-
|
13
|
-
private
|
14
|
-
|
15
|
-
def initialize(source)
|
16
|
-
@source = source
|
17
|
-
end
|
18
|
-
|
19
|
-
def parser
|
20
|
-
TreeSitter::Parser.new.tap do |p|
|
21
|
-
p.language = TreeSitter::Language.load('elisp', elisp_library)
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
def elisp_library
|
26
|
-
shared_object = 'libtree-sitter-elisp.so'
|
27
|
-
|
28
|
-
# Set this env var for Guix shell environment or shared object file is not found
|
29
|
-
if ENV['ELISP2ANY_GUIX_USE_PROFILE_PATH']
|
30
|
-
shared_object = ::File.join(ENV["GUIX_ENVIRONMENT"], "lib/tree-sitter", shared_object)
|
31
|
-
end
|
32
|
-
|
33
|
-
shared_object
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
data/manifest.scm
DELETED
@@ -1,87 +0,0 @@
|
|
1
|
-
(use-modules (guix packages)
|
2
|
-
((guix licenses) #:prefix license:)
|
3
|
-
(guix git-download)
|
4
|
-
(guix build-system ruby)
|
5
|
-
(guix build-system tree-sitter)
|
6
|
-
(gnu packages tree-sitter)
|
7
|
-
(gnu packages ruby))
|
8
|
-
|
9
|
-
(define-public ruby-tree-sitter
|
10
|
-
(let ((commit "2c56b04283f2a8cfed7d6c527ca36b8e1127ee8c")
|
11
|
-
(revision "0"))
|
12
|
-
(package
|
13
|
-
(name "ruby-tree-sitter")
|
14
|
-
(version (git-version "0.20.8.1" revision commit))
|
15
|
-
(source
|
16
|
-
(origin
|
17
|
-
(method git-fetch)
|
18
|
-
(uri (git-reference
|
19
|
-
(url "https://github.com/Faveod/ruby-tree-sitter")
|
20
|
-
(commit commit)))
|
21
|
-
(file-name (git-file-name name version))
|
22
|
-
(sha256
|
23
|
-
(base32 "144kp0ya4rl03bgwpix17bgq2ak2kqk63pwniy6sfxfjqp5yzr7f"))))
|
24
|
-
(build-system ruby-build-system)
|
25
|
-
(arguments
|
26
|
-
(list
|
27
|
-
#:phases #~(modify-phases %standard-phases
|
28
|
-
(add-after 'extract-gemspec 'remove-depends
|
29
|
-
(lambda _
|
30
|
-
(substitute* "tree_sitter.gemspec"
|
31
|
-
((".*minitest-color.*")
|
32
|
-
"\n")
|
33
|
-
((".*pry.*")
|
34
|
-
"\n")
|
35
|
-
((".*rake.*")
|
36
|
-
"\n"))
|
37
|
-
(substitute* "test/test_helper.rb"
|
38
|
-
((".*minitest/color.*")
|
39
|
-
"\n"))))
|
40
|
-
(add-before 'build 'compile
|
41
|
-
(lambda _
|
42
|
-
(invoke "rake" "compile")))
|
43
|
-
(add-before 'check 'set-path
|
44
|
-
(lambda* (#:key inputs #:allow-other-keys)
|
45
|
-
(let ((ruby (assoc-ref inputs "tree-sitter-ruby")))
|
46
|
-
(setenv "TREE_SITTER_PARSERS"
|
47
|
-
(string-append ruby "/lib/tree-sitter")))))
|
48
|
-
(add-before 'check 'remove-failing-test
|
49
|
-
(lambda _
|
50
|
-
(delete-file "test/tree_sitter/node_test.rb"))))))
|
51
|
-
(native-inputs (list ruby-minitest ruby-rake-compiler
|
52
|
-
ruby-rake-compiler-dock ruby-ruby-memcheck
|
53
|
-
tree-sitter-ruby))
|
54
|
-
(inputs (list tree-sitter))
|
55
|
-
(synopsis "Ruby bindings for Tree-Sitter")
|
56
|
-
(description "Ruby bindings for Tree-Sitter")
|
57
|
-
(home-page "https://www.github.com/Faveod/ruby-tree-sitter")
|
58
|
-
(license license:expat))))
|
59
|
-
|
60
|
-
(define-public tree-sitter-elisp
|
61
|
-
(let ((commit "e5524fdccf8c22fc726474a910e4ade976dfc7bb")
|
62
|
-
(revision "0"))
|
63
|
-
(package
|
64
|
-
(name "tree-sitter-elisp")
|
65
|
-
(version (git-version "0.1.4" revision commit))
|
66
|
-
(source
|
67
|
-
(origin
|
68
|
-
(method git-fetch)
|
69
|
-
(uri (git-reference
|
70
|
-
(url "https://github.com/Wilfred/tree-sitter-elisp")
|
71
|
-
(commit commit)))
|
72
|
-
(file-name (git-file-name name version))
|
73
|
-
(sha256
|
74
|
-
(base32 "1wyzfb27zgpvm4110jgv0sl598mxv5dkrg2cwjw3p9g2bq9mav5d"))))
|
75
|
-
(build-system tree-sitter-build-system)
|
76
|
-
(home-page "https://github.com/Wilfred/tree-sitter-elisp")
|
77
|
-
(synopsis "Tree-sitter grammar for Emacs Lisp")
|
78
|
-
(description "This package provides an Emacs Lisp grammar for the Tree-sitter library.")
|
79
|
-
(license license:expat))))
|
80
|
-
|
81
|
-
(concatenate-manifests
|
82
|
-
(list
|
83
|
-
(packages->manifest (list ruby-tree-sitter tree-sitter-elisp))
|
84
|
-
(specifications->manifest (list "ruby@3.1"
|
85
|
-
"ruby-webrick"
|
86
|
-
"ruby-rubocop"
|
87
|
-
"ruby-asciidoctor"))))
|
data/sig/elisp2any.gen.rbs
DELETED
@@ -1,112 +0,0 @@
|
|
1
|
-
# TypeProf 0.21.3
|
2
|
-
|
3
|
-
# Classes
|
4
|
-
module Elisp2any
|
5
|
-
VERSION: String
|
6
|
-
|
7
|
-
class AsciiDocRenderer
|
8
|
-
extend Forwardable
|
9
|
-
@file: untyped
|
10
|
-
|
11
|
-
def initialize: (untyped file) -> void
|
12
|
-
def render: -> untyped
|
13
|
-
|
14
|
-
private
|
15
|
-
def render_paragraph: (untyped paragraph) -> String
|
16
|
-
def render_block: (untyped block, level: untyped) -> String
|
17
|
-
def erb_renderer: (String path) -> untyped
|
18
|
-
end
|
19
|
-
|
20
|
-
class CodeBlock
|
21
|
-
extend Forwardable
|
22
|
-
@node: Node
|
23
|
-
|
24
|
-
def initialize: (Node node) -> void
|
25
|
-
def append: (untyped source, untyped end_byte) -> untyped
|
26
|
-
end
|
27
|
-
|
28
|
-
class InlineCode
|
29
|
-
attr_reader content: untyped
|
30
|
-
def initialize: (untyped content) -> void
|
31
|
-
end
|
32
|
-
|
33
|
-
class Line
|
34
|
-
extend Forwardable
|
35
|
-
include Enumerable
|
36
|
-
@chunks: Array[(InlineCode | String)?]
|
37
|
-
|
38
|
-
def initialize: (Array[(InlineCode | String)?] chunks) -> void
|
39
|
-
def self.parse: (String string) -> Line
|
40
|
-
end
|
41
|
-
|
42
|
-
class Heading
|
43
|
-
extend Forwardable
|
44
|
-
@node: Node
|
45
|
-
|
46
|
-
attr_reader level: Integer
|
47
|
-
attr_reader content: String
|
48
|
-
def initialize: (Node node, Integer level, String content) -> void
|
49
|
-
def name_and_synopsis: -> [untyped, untyped]?
|
50
|
-
def commentary?: -> bool
|
51
|
-
def code?: -> bool
|
52
|
-
def final_name: -> String?
|
53
|
-
end
|
54
|
-
|
55
|
-
class Paragraph
|
56
|
-
extend Forwardable
|
57
|
-
include Enumerable
|
58
|
-
@node: Node
|
59
|
-
@lines: [Line]
|
60
|
-
|
61
|
-
attr_reader end_row: untyped
|
62
|
-
def initialize: (Node node, [Line] lines, untyped end_row) -> void
|
63
|
-
def code?: -> false
|
64
|
-
end
|
65
|
-
|
66
|
-
class Node
|
67
|
-
attr_reader range: Range
|
68
|
-
attr_reader content: untyped
|
69
|
-
def self.from_tree_sitter: (untyped source, untyped ts_node) -> (Array[CodeBlock | Heading | Paragraph])
|
70
|
-
def append: (untyped source, untyped end_byte) -> untyped
|
71
|
-
def initialize: (untyped content, Range range) -> void
|
72
|
-
end
|
73
|
-
|
74
|
-
class TreeSitterParser
|
75
|
-
@source: untyped
|
76
|
-
@node: untyped
|
77
|
-
|
78
|
-
def self.parse: (untyped source) -> untyped
|
79
|
-
def parse: -> untyped
|
80
|
-
|
81
|
-
private
|
82
|
-
def initialize: (untyped source) -> void
|
83
|
-
def parser: -> untyped
|
84
|
-
def elisp_library: -> String
|
85
|
-
end
|
86
|
-
|
87
|
-
class File
|
88
|
-
attr_reader name: nil
|
89
|
-
attr_reader synopsis: nil
|
90
|
-
attr_reader commentary: Array[(CodeBlock | Heading | Paragraph)?]
|
91
|
-
attr_reader code: Array[CodeBlock | Heading | Paragraph]
|
92
|
-
def self.parse: (untyped source) -> File
|
93
|
-
def initialize: (name: nil, synopsis: nil, commentary: Array[(CodeBlock | Heading | Paragraph)?], code: Array[CodeBlock | Heading | Paragraph]) -> void
|
94
|
-
end
|
95
|
-
|
96
|
-
class HTMLRenderer
|
97
|
-
extend Forwardable
|
98
|
-
@file: untyped
|
99
|
-
|
100
|
-
def initialize: (untyped file) -> void
|
101
|
-
def render: -> String
|
102
|
-
|
103
|
-
private
|
104
|
-
def render_paragraph: (untyped paragraph) -> String
|
105
|
-
def render_block: (untyped block, level: untyped) -> String
|
106
|
-
def erb_render: (String path) -> String
|
107
|
-
def h: (untyped string) -> String
|
108
|
-
end
|
109
|
-
|
110
|
-
class Error < StandardError
|
111
|
-
end
|
112
|
-
end
|
data/sig/elisp2any.rbs
DELETED