raindown 0.1.0
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 +7 -0
- data/lib/elements.rb +33 -0
- data/lib/lexemes/list_lexeme.rb +32 -0
- data/lib/lexemes/toc_lexeme.rb +21 -0
- data/lib/nodes/list_node.rb +47 -0
- data/lib/nodes/toc_node.rb +41 -0
- data/lib/raindown.rb +31 -0
- data/lib/version.rb +5 -0
- metadata +92 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: 0250c356fb715c70bb5620ebb20f3d9f92775398b1b002c71eec906f4cf3ad20
|
|
4
|
+
data.tar.gz: a601014e5ce54762c17db6d888067cd66239a64169ab453621036d95ca82a177
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 975fbcedd3fc3a2e3c2b853173ac5f5eb882db921462fc4dba2d15cc35e7e8278ff0c44a89e986f8c967dcc73c1f80d59f1348850cddb06e92d409484d18f005
|
|
7
|
+
data.tar.gz: 2042a62352c54e59801d300cd49fa5ea7d7ffc65a8f01bd1aa0f213151606d947a7ea614239e148d36e5ccff1f0340714870dc1a383f695b7266990e58632c57
|
data/lib/elements.rb
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'plugs'
|
|
4
|
+
|
|
5
|
+
module Rain
|
|
6
|
+
class Elements
|
|
7
|
+
include Plugs
|
|
8
|
+
|
|
9
|
+
plug(:toc) do
|
|
10
|
+
plug(:lexeme) do
|
|
11
|
+
require_relative 'lexemes/toc_lexeme'
|
|
12
|
+
TOCLexeme
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
plug(:node) do
|
|
16
|
+
require_relative 'nodes/toc_node'
|
|
17
|
+
TOCNode
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
plug(:list) do
|
|
22
|
+
plug(:lexeme) do
|
|
23
|
+
require_relative 'lexemes/list_lexeme'
|
|
24
|
+
ListLexeme
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
plug(:node) do
|
|
28
|
+
require_relative 'nodes/list_node'
|
|
29
|
+
ListNode
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'antlers/api'
|
|
4
|
+
|
|
5
|
+
module Rain
|
|
6
|
+
module ListLexeme
|
|
7
|
+
include Antlers::Lexeme
|
|
8
|
+
|
|
9
|
+
module_function
|
|
10
|
+
|
|
11
|
+
KEYWORDS = ['list:', 'folder:', 'order:', ':list'].freeze
|
|
12
|
+
|
|
13
|
+
def match?(keywords:, **)
|
|
14
|
+
KEYWORDS.include?(keywords.keys.first)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def lexeme(keywords:, **)
|
|
18
|
+
if keywords['list:']
|
|
19
|
+
*key, value = keywords['list:'].split(',').map(&:strip)
|
|
20
|
+
|
|
21
|
+
list_def = { list_def: value, folder: keywords['folder:'] }
|
|
22
|
+
list_def[:order] = keywords['order:'] if keywords['order:']
|
|
23
|
+
list_def[:key] = key.first unless key.empty?
|
|
24
|
+
|
|
25
|
+
return list_def
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# TODO: Keep track of which list loop we're in to allow nested list loops.
|
|
29
|
+
{ list_end: 'level_1' }
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'antlers/api'
|
|
4
|
+
|
|
5
|
+
module Rain
|
|
6
|
+
module TOCLexeme
|
|
7
|
+
include Antlers::Lexeme
|
|
8
|
+
|
|
9
|
+
module_function
|
|
10
|
+
|
|
11
|
+
KEYWORDS = [':toc'].freeze
|
|
12
|
+
|
|
13
|
+
def match?(keywords:, **)
|
|
14
|
+
keywords.keys.include?(':toc')
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def lexeme(**)
|
|
18
|
+
{ toc: :default }
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'antlers/api'
|
|
4
|
+
|
|
5
|
+
module Rain
|
|
6
|
+
class ListNode < Antlers::BranchNode
|
|
7
|
+
include Antlers::Props
|
|
8
|
+
include Antlers::Variables
|
|
9
|
+
|
|
10
|
+
DEF_KEY = :list_def
|
|
11
|
+
END_KEY = :list_end
|
|
12
|
+
|
|
13
|
+
def initialize(value:, folder:, props: [], children: [])
|
|
14
|
+
super(name: :toc, props:, children:)
|
|
15
|
+
|
|
16
|
+
@value = value.delete("'").delete('"')
|
|
17
|
+
@folder = folder.delete("'").delete('"')
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def render(current_binding: nil, parent_binding: nil, slot_node: nil, metadata: {})
|
|
21
|
+
output = ''
|
|
22
|
+
|
|
23
|
+
list = metadata.list(folder: @folder)
|
|
24
|
+
|
|
25
|
+
list.each do |value|
|
|
26
|
+
# TODO: Parallelize by creating new bindings and ensuring children have any args they need via RenderEvent.
|
|
27
|
+
current_binding.local_variable_set(@value, value)
|
|
28
|
+
|
|
29
|
+
@children.each do |child|
|
|
30
|
+
output += child.render(current_binding:, parent_binding:, slot_node:, metadata:) || ''
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
output
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
class << self
|
|
38
|
+
def match?(segment:)
|
|
39
|
+
segment[DEF_KEY]
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def build(segment:, **)
|
|
43
|
+
new(value: segment[:list_def], folder: segment[:folder])
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'antlers/api'
|
|
4
|
+
require 'nokogiri'
|
|
5
|
+
|
|
6
|
+
module Rain
|
|
7
|
+
class TOCNode < Antlers::LeafNode
|
|
8
|
+
def initialize(name:, template:)
|
|
9
|
+
super(name:)
|
|
10
|
+
|
|
11
|
+
@template = template
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def render(current_binding: nil, parent_binding: nil, slot_node: nil, metadata: {})
|
|
15
|
+
doc = Nokogiri::HTML(@template)
|
|
16
|
+
|
|
17
|
+
<<~HTML
|
|
18
|
+
<div class="floating">
|
|
19
|
+
<details id="toc" open>
|
|
20
|
+
<summary>Table of contents</summary>
|
|
21
|
+
<ul>
|
|
22
|
+
#{doc.css('h1[id], h2[id], h3[id], h4[id], h5[id], h6[id]').map do |h|
|
|
23
|
+
"<li class='#{h.name}'><a href='\##{h['id']}'>#{h.text.strip}</a></li>"
|
|
24
|
+
end.join("\n")}
|
|
25
|
+
</ul>
|
|
26
|
+
</details>
|
|
27
|
+
</div>
|
|
28
|
+
HTML
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
class << self
|
|
32
|
+
def match?(segment:)
|
|
33
|
+
segment[:toc]
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def build(template:, **)
|
|
37
|
+
new(name: :toc, template:)
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
data/lib/raindown.rb
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'commonmarker'
|
|
4
|
+
require 'antlers/api'
|
|
5
|
+
require_relative 'elements'
|
|
6
|
+
|
|
7
|
+
module Rain
|
|
8
|
+
module Raindown
|
|
9
|
+
module_function
|
|
10
|
+
|
|
11
|
+
def render(markdown:, metadata: {})
|
|
12
|
+
template = markdown.gsub('<{', '<!-- ANTLERS').gsub('}>', 'ANTLERS -->')
|
|
13
|
+
|
|
14
|
+
doc = Commonmarker.parse(template.force_encoding('UTF-8'), options: { extension: { alerts: true } })
|
|
15
|
+
doc.walk do |node|
|
|
16
|
+
if %i[code code_block].include?(node.type)
|
|
17
|
+
node.string_content = node.string_content.gsub('<!-- ANTLERS', '<{').gsub('ANTLERS -->', '}>')
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
template = doc.to_html(options: { render: { unsafe: true } })
|
|
22
|
+
template = template.gsub('<!-- ANTLERS', '<{').gsub('ANTLERS -->', '}>')
|
|
23
|
+
|
|
24
|
+
return template unless template.include?('<{') || template.include?('{')
|
|
25
|
+
|
|
26
|
+
ast = Antlers.ast(template:, elements: Antlers::Elements[:html, :var, :prop, :slot, :if, :for] + Rain::Elements[:toc, :list])
|
|
27
|
+
|
|
28
|
+
Antlers.render(ast:, current_binding: binding, metadata:)
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
data/lib/version.rb
ADDED
metadata
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: raindown
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.1.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- maedi
|
|
8
|
+
bindir: exe
|
|
9
|
+
cert_chain: []
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
11
|
+
dependencies:
|
|
12
|
+
- !ruby/object:Gem::Dependency
|
|
13
|
+
name: antlers
|
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
|
15
|
+
requirements:
|
|
16
|
+
- - ">="
|
|
17
|
+
- !ruby/object:Gem::Version
|
|
18
|
+
version: '0'
|
|
19
|
+
type: :runtime
|
|
20
|
+
prerelease: false
|
|
21
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
22
|
+
requirements:
|
|
23
|
+
- - ">="
|
|
24
|
+
- !ruby/object:Gem::Version
|
|
25
|
+
version: '0'
|
|
26
|
+
- !ruby/object:Gem::Dependency
|
|
27
|
+
name: commonmarker
|
|
28
|
+
requirement: !ruby/object:Gem::Requirement
|
|
29
|
+
requirements:
|
|
30
|
+
- - ">="
|
|
31
|
+
- !ruby/object:Gem::Version
|
|
32
|
+
version: '0'
|
|
33
|
+
type: :runtime
|
|
34
|
+
prerelease: false
|
|
35
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
36
|
+
requirements:
|
|
37
|
+
- - ">="
|
|
38
|
+
- !ruby/object:Gem::Version
|
|
39
|
+
version: '0'
|
|
40
|
+
- !ruby/object:Gem::Dependency
|
|
41
|
+
name: plugs
|
|
42
|
+
requirement: !ruby/object:Gem::Requirement
|
|
43
|
+
requirements:
|
|
44
|
+
- - ">="
|
|
45
|
+
- !ruby/object:Gem::Version
|
|
46
|
+
version: '0'
|
|
47
|
+
type: :runtime
|
|
48
|
+
prerelease: false
|
|
49
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
50
|
+
requirements:
|
|
51
|
+
- - ">="
|
|
52
|
+
- !ruby/object:Gem::Version
|
|
53
|
+
version: '0'
|
|
54
|
+
description: |
|
|
55
|
+
Raindown is a templating layer for static site generation
|
|
56
|
+
and an annotation framework for Markdown files.
|
|
57
|
+
email:
|
|
58
|
+
- maediprichard@gmail.com
|
|
59
|
+
executables: []
|
|
60
|
+
extensions: []
|
|
61
|
+
extra_rdoc_files: []
|
|
62
|
+
files:
|
|
63
|
+
- lib/elements.rb
|
|
64
|
+
- lib/lexemes/list_lexeme.rb
|
|
65
|
+
- lib/lexemes/toc_lexeme.rb
|
|
66
|
+
- lib/nodes/list_node.rb
|
|
67
|
+
- lib/nodes/toc_node.rb
|
|
68
|
+
- lib/raindown.rb
|
|
69
|
+
- lib/version.rb
|
|
70
|
+
homepage: https://github.com/raindeer-rb/raindown
|
|
71
|
+
licenses: []
|
|
72
|
+
metadata:
|
|
73
|
+
homepage_uri: https://github.com/raindeer-rb/raindown
|
|
74
|
+
source_code_uri: https://github.com/raindeer-rb/raindown/src/branch/main
|
|
75
|
+
rdoc_options: []
|
|
76
|
+
require_paths:
|
|
77
|
+
- lib
|
|
78
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
79
|
+
requirements:
|
|
80
|
+
- - ">="
|
|
81
|
+
- !ruby/object:Gem::Version
|
|
82
|
+
version: 3.3.0
|
|
83
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
84
|
+
requirements:
|
|
85
|
+
- - ">="
|
|
86
|
+
- !ruby/object:Gem::Version
|
|
87
|
+
version: '0'
|
|
88
|
+
requirements: []
|
|
89
|
+
rubygems_version: 4.0.6
|
|
90
|
+
specification_version: 4
|
|
91
|
+
summary: Markup your markdown with a template and annotation layer
|
|
92
|
+
test_files: []
|