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.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +15 -0
  3. data/LICENSE.txt +674 -202
  4. data/README.md +31 -7
  5. data/Rakefile +5 -52
  6. data/exe/elisp2any +27 -17
  7. data/lib/elisp/comment.rb +32 -0
  8. data/lib/elisp/default.css +11 -0
  9. data/lib/elisp/doc_string_parser.rb +96 -0
  10. data/lib/elisp/heading.rb +31 -0
  11. data/lib/elisp/parser.rb +161 -0
  12. data/lib/elisp/version.rb +18 -0
  13. data/lib/elisp.rb +99 -0
  14. metadata +12 -96
  15. data/.document +0 -4
  16. data/.envrc +0 -3
  17. data/.rdoc_options +0 -2
  18. data/.rubocop.yml +0 -11
  19. data/lib/elisp2any/asciidoc_renderer/index.adoc.erb +0 -15
  20. data/lib/elisp2any/asciidoc_renderer.rb +0 -57
  21. data/lib/elisp2any/aside.rb +0 -23
  22. data/lib/elisp2any/blanklines.rb +0 -20
  23. data/lib/elisp2any/code.rb +0 -49
  24. data/lib/elisp2any/codeblock.rb +0 -56
  25. data/lib/elisp2any/comment.rb +0 -19
  26. data/lib/elisp2any/commentary.rb +0 -32
  27. data/lib/elisp2any/expression.rb +0 -90
  28. data/lib/elisp2any/file.rb +0 -63
  29. data/lib/elisp2any/footer_line.rb +0 -28
  30. data/lib/elisp2any/header_line.rb +0 -80
  31. data/lib/elisp2any/heading.rb +0 -68
  32. data/lib/elisp2any/html_renderer/index.html.erb +0 -23
  33. data/lib/elisp2any/html_renderer.erb +0 -22
  34. data/lib/elisp2any/html_renderer.rb +0 -149
  35. data/lib/elisp2any/inline_code.rb +0 -10
  36. data/lib/elisp2any/line.rb +0 -52
  37. data/lib/elisp2any/node.rb +0 -67
  38. data/lib/elisp2any/paragraph.rb +0 -37
  39. data/lib/elisp2any/section.rb +0 -49
  40. data/lib/elisp2any/text.rb +0 -33
  41. data/lib/elisp2any/tree_sitter_parser.rb +0 -36
  42. data/lib/elisp2any/version.rb +0 -4
  43. data/lib/elisp2any.rb +0 -27
  44. data/manifest.scm +0 -87
  45. data/sig/elisp2any.gen.rbs +0 -112
  46. 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.5
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: 2025-02-10 00:00:00.000000000 Z
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 or AsciiDoc.
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/elisp2any.rb
118
- - lib/elisp2any/asciidoc_renderer.rb
119
- - lib/elisp2any/asciidoc_renderer/index.adoc.erb
120
- - lib/elisp2any/aside.rb
121
- - lib/elisp2any/blanklines.rb
122
- - lib/elisp2any/code.rb
123
- - lib/elisp2any/codeblock.rb
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
- - Apache-2.0
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: 3.5.11
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
@@ -1,4 +0,0 @@
1
- README.md
2
- lib/**/*.rb
3
- CHANGELOG.md
4
- LICENSE.txt
data/.envrc DELETED
@@ -1,3 +0,0 @@
1
- watch_file manifest.scm
2
- export ELISP2ANY_GUIX_USE_PROFILE_PATH=yes
3
- use guix
data/.rdoc_options DELETED
@@ -1,2 +0,0 @@
1
- main_page: README.md
2
- op_dir: html
data/.rubocop.yml DELETED
@@ -1,11 +0,0 @@
1
- AllCops:
2
- TargetRubyVersion: 3.1
3
- NewCops: enable
4
- DisabledByDefault: true
5
-
6
- Layout/LineLength:
7
- Enabled: false
8
-
9
- Style/FrozenStringLiteralComment:
10
- Enabled: true
11
- EnforcedStyle: never
@@ -1,15 +0,0 @@
1
- = <%= name %>
2
-
3
- <%= synopsis %>
4
-
5
- == Commentary
6
-
7
- <% commentary.each do |paragraph| %>
8
- <%= render_paragraph(paragraph) %>
9
- <% end %>
10
-
11
- == Code
12
-
13
- <% code.each do |block| %>
14
- <%= render_block(block, level: 2) %>
15
- <% end %>
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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