raindeer 0.6.0 → 0.7.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 +4 -4
- data/bin/rain +10 -0
- data/lib/cli/cli.rb +26 -0
- data/lib/cli/static/static.rb +17 -0
- data/lib/pages/pages.rb +5 -6
- data/lib/pages/raindown/elements.rb +21 -0
- data/lib/pages/raindown/lexemes/toc_lexeme.rb +20 -0
- data/lib/pages/raindown/nodes/toc_node.rb +41 -0
- data/lib/pages/raindown/raindown.rb +33 -0
- data/lib/raindeer/boot.rb +13 -12
- data/lib/raindeer/cli.rb +37 -0
- data/lib/version.rb +1 -1
- metadata +39 -11
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 1911af310e0e12743cd151c8d0434b247d959385ea04329a40287538199b0407
|
|
4
|
+
data.tar.gz: 84320dbf6de9d25dd6c9c3315f51abfddeb2e21d62ddd6e99e8ff754ba252ba4
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 7341996eb059d5dc1f7fb6075c2ffeb866efc6a68fc4a69142c321be325bdc5e15dad955a67d24b39b185dbbe2d6670466fddaf802ae8b43cb448cd0258fe33e
|
|
7
|
+
data.tar.gz: db80a6183bde1082b49cb230252f43ca9a5ff97eea0c5effda469ae0c09f17a4f2be9f16d8a9b9041388fb53eeebeda1b691dac8ed37a47459e70ef21f30c890
|
data/bin/rain
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
# Call "rain" to access the CLI loaded on your $PATH by Bundler.
|
|
4
|
+
# Uncomment the line below and call "bin/rain" to load local gems from your Gemfile in development.
|
|
5
|
+
# Comment this line out when running "bundle exec rake install".
|
|
6
|
+
# require 'bundler/setup'
|
|
7
|
+
|
|
8
|
+
require_relative '../lib/raindeer/cli'
|
|
9
|
+
|
|
10
|
+
Rain::CLI.run(ARGV)
|
data/lib/cli/cli.rb
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'trees'
|
|
4
|
+
require_relative 'static/static'
|
|
5
|
+
|
|
6
|
+
module Rain
|
|
7
|
+
module CLI
|
|
8
|
+
extend Trees
|
|
9
|
+
|
|
10
|
+
line('new :app_name') do |app_name|
|
|
11
|
+
execute { 'TODO' }
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
line('server') do
|
|
15
|
+
execute { system('bin/server') }
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
line('static') do
|
|
19
|
+
summary { 'Static site generation' }
|
|
20
|
+
|
|
21
|
+
line('build') do
|
|
22
|
+
execute { Static.build(application_path: Dir.pwd) }
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'antlers'
|
|
4
|
+
require 'lowload'
|
|
5
|
+
|
|
6
|
+
module Rain
|
|
7
|
+
module CLI
|
|
8
|
+
module Static
|
|
9
|
+
extend self
|
|
10
|
+
|
|
11
|
+
def build(application_path:)
|
|
12
|
+
metadata = LowLoad.dirload(File.expand_path('app', application_path))
|
|
13
|
+
# TODO: Use metadata.url_paths to HTTP Request and export the response to a build folder of HTML.
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
data/lib/pages/pages.rb
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
require 'kramdown-parser-gfm'
|
|
5
|
-
require 'rouge'
|
|
3
|
+
require_relative 'raindown/raindown'
|
|
6
4
|
|
|
7
5
|
module Rain
|
|
8
6
|
class Pages
|
|
@@ -14,13 +12,14 @@ module Rain
|
|
|
14
12
|
|
|
15
13
|
def initialize(metadata:)
|
|
16
14
|
@url_paths = metadata.url_paths
|
|
15
|
+
@raindown = Raindown.new(metadata:)
|
|
17
16
|
end
|
|
18
17
|
|
|
19
18
|
def process(file_path:)
|
|
20
|
-
metadata,
|
|
21
|
-
|
|
19
|
+
metadata, markdown = parse_file(file_path:)
|
|
20
|
+
raindown = @raindown.render(markdown:)
|
|
22
21
|
|
|
23
|
-
Result.new(metadata,
|
|
22
|
+
Result.new(metadata, raindown)
|
|
24
23
|
end
|
|
25
24
|
|
|
26
25
|
private
|
|
@@ -0,0 +1,21 @@
|
|
|
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
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'interfaces/lexeme' # From antlers gem, too generic.
|
|
4
|
+
|
|
5
|
+
module Rain
|
|
6
|
+
module TOCLexeme
|
|
7
|
+
include Antlers::Lexeme
|
|
8
|
+
extend self
|
|
9
|
+
|
|
10
|
+
KEYWORDS = [':toc'].freeze
|
|
11
|
+
|
|
12
|
+
def match?(keywords:, **)
|
|
13
|
+
keywords.keys.include?(':toc')
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def lexeme(**)
|
|
17
|
+
{ toc: :default }
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'antlers'
|
|
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)
|
|
15
|
+
doc = Nokogiri::HTML(@template)
|
|
16
|
+
|
|
17
|
+
output = <<~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 { |h|
|
|
23
|
+
"<li class='#{h.name}'><a href='\##{h['id']}'>#{h.text.strip}</a></li>"
|
|
24
|
+
}.join("\n")}
|
|
25
|
+
</ul>
|
|
26
|
+
</div>
|
|
27
|
+
</details>
|
|
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
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'commonmarker'
|
|
4
|
+
require 'antlers/elements'
|
|
5
|
+
require_relative 'elements'
|
|
6
|
+
|
|
7
|
+
module Rain
|
|
8
|
+
class Raindown
|
|
9
|
+
def initialize(metadata: {})
|
|
10
|
+
@metadata = metadata
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def render(markdown:)
|
|
14
|
+
template = markdown.gsub('<{', '<!-- ANTLERS').gsub('}>', 'ANTLERS -->')
|
|
15
|
+
|
|
16
|
+
doc = Commonmarker.parse(template)
|
|
17
|
+
doc.walk do |node|
|
|
18
|
+
if node.type == :code || node.type == :code_block
|
|
19
|
+
node.string_content = node.string_content.gsub('<!-- ANTLERS', '<{').gsub('ANTLERS -->', '}>')
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
template = doc.to_html(options: { render: { unsafe: true } })
|
|
24
|
+
template = template.gsub('<!-- ANTLERS', '<{').gsub('ANTLERS -->', '}>')
|
|
25
|
+
|
|
26
|
+
return template unless template.include?('<{') || template.include?('{')
|
|
27
|
+
|
|
28
|
+
ast = Antlers.ast(template:, elements: Antlers::Elements[:html, :prop] + Rain::Elements[:toc])
|
|
29
|
+
|
|
30
|
+
Antlers.render(ast:, current_binding: binding)
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
data/lib/raindeer/boot.rb
CHANGED
|
@@ -6,15 +6,14 @@ require 'low_type'
|
|
|
6
6
|
require 'observers'
|
|
7
7
|
require 'providers'
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
require_relative '../router/router'
|
|
11
|
-
require_relative '../support/config_loader'
|
|
9
|
+
# File paths are relative to the directory where the process is run from, so the app can just require this boot file.
|
|
12
10
|
|
|
13
11
|
#################################################
|
|
14
|
-
# INTERNAL API
|
|
12
|
+
# FRAMEWORK INTERNAL API
|
|
15
13
|
#################################################
|
|
16
14
|
|
|
17
15
|
module Rain
|
|
16
|
+
require_relative '../support/config_loader'
|
|
18
17
|
env = {
|
|
19
18
|
host: ENV.fetch('RAIN_HOST', nil),
|
|
20
19
|
port: ENV.fetch('RAIN_PORT', nil),
|
|
@@ -23,8 +22,8 @@ module Rain
|
|
|
23
22
|
matrix_mode: ConfigLoader.parse_boolean(ENV.fetch('RAIN_MATRIX', nil)),
|
|
24
23
|
mirror_mode: ConfigLoader.parse_boolean(ENV.fetch('RAIN_MIRROR', nil))
|
|
25
24
|
}
|
|
26
|
-
|
|
27
|
-
config = ConfigLoader.load(
|
|
25
|
+
config_path = File.expand_path('config/config.yaml', Dir.pwd)
|
|
26
|
+
config = ConfigLoader.load(config_path, env)
|
|
28
27
|
|
|
29
28
|
Providers.define('rain.router') do
|
|
30
29
|
require_relative '../router/router'
|
|
@@ -43,7 +42,7 @@ module Rain
|
|
|
43
42
|
end
|
|
44
43
|
|
|
45
44
|
#################################################
|
|
46
|
-
# EXTERNAL API
|
|
45
|
+
# FRAMEWORK EXTERNAL API
|
|
47
46
|
#################################################
|
|
48
47
|
|
|
49
48
|
module Raindeer
|
|
@@ -55,10 +54,10 @@ module Raindeer
|
|
|
55
54
|
end
|
|
56
55
|
|
|
57
56
|
#################################################
|
|
58
|
-
#
|
|
57
|
+
# APPLICATION CODE
|
|
59
58
|
#################################################
|
|
60
59
|
|
|
61
|
-
require 'antlers' #
|
|
60
|
+
require 'antlers' # Adds antlers support to lowload.
|
|
62
61
|
require 'lowload'
|
|
63
62
|
LowLoad.dirload(File.expand_path('../system', __dir__))
|
|
64
63
|
|
|
@@ -66,8 +65,10 @@ application_path = File.expand_path('app', Dir.pwd)
|
|
|
66
65
|
return unless Dir.exist?(application_path)
|
|
67
66
|
|
|
68
67
|
metadata = LowLoad.dirload(application_path)
|
|
69
|
-
return unless Dir.exist?(File.expand_path('pages', application_path))
|
|
70
68
|
|
|
71
|
-
|
|
72
|
-
|
|
69
|
+
if Dir.exist?(File.expand_path('pages', application_path))
|
|
70
|
+
Providers.define('rain.pages', eager: true) do
|
|
71
|
+
require_relative '../pages/pages'
|
|
72
|
+
Rain::Pages.new(metadata:)
|
|
73
|
+
end
|
|
73
74
|
end
|
data/lib/raindeer/cli.rb
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'low_node'
|
|
4
|
+
require 'low_type'
|
|
5
|
+
require 'observers'
|
|
6
|
+
require 'providers'
|
|
7
|
+
|
|
8
|
+
# Allows the CLI to load application code and metadata, but not start a server.
|
|
9
|
+
|
|
10
|
+
#################################################
|
|
11
|
+
# FRAMEWORK INTERNAL API
|
|
12
|
+
#################################################
|
|
13
|
+
|
|
14
|
+
module Rain
|
|
15
|
+
Providers.define('rain.router') do
|
|
16
|
+
require_relative '../router/router'
|
|
17
|
+
Router.new
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
#################################################
|
|
22
|
+
# FRAMEWORK EXTERNAL API
|
|
23
|
+
#################################################
|
|
24
|
+
|
|
25
|
+
module Raindeer
|
|
26
|
+
class << self
|
|
27
|
+
def router(&block)
|
|
28
|
+
Providers['rain.router'].instance_eval(&block)
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
#################################################
|
|
34
|
+
# CLI
|
|
35
|
+
#################################################
|
|
36
|
+
|
|
37
|
+
require_relative '../cli/cli'
|
data/lib/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: raindeer
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.7.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- maedi
|
|
8
|
-
bindir:
|
|
8
|
+
bindir: bin
|
|
9
9
|
cert_chain: []
|
|
10
10
|
date: 1980-01-02 00:00:00.000000000 Z
|
|
11
11
|
dependencies:
|
|
@@ -38,7 +38,7 @@ dependencies:
|
|
|
38
38
|
- !ruby/object:Gem::Version
|
|
39
39
|
version: '0'
|
|
40
40
|
- !ruby/object:Gem::Dependency
|
|
41
|
-
name:
|
|
41
|
+
name: commonmarker
|
|
42
42
|
requirement: !ruby/object:Gem::Requirement
|
|
43
43
|
requirements:
|
|
44
44
|
- - ">="
|
|
@@ -52,7 +52,7 @@ dependencies:
|
|
|
52
52
|
- !ruby/object:Gem::Version
|
|
53
53
|
version: '0'
|
|
54
54
|
- !ruby/object:Gem::Dependency
|
|
55
|
-
name:
|
|
55
|
+
name: rouge
|
|
56
56
|
requirement: !ruby/object:Gem::Requirement
|
|
57
57
|
requirements:
|
|
58
58
|
- - ">="
|
|
@@ -66,7 +66,7 @@ dependencies:
|
|
|
66
66
|
- !ruby/object:Gem::Version
|
|
67
67
|
version: '0'
|
|
68
68
|
- !ruby/object:Gem::Dependency
|
|
69
|
-
name:
|
|
69
|
+
name: nokogiri
|
|
70
70
|
requirement: !ruby/object:Gem::Requirement
|
|
71
71
|
requirements:
|
|
72
72
|
- - ">="
|
|
@@ -205,6 +205,20 @@ dependencies:
|
|
|
205
205
|
- - ">="
|
|
206
206
|
- !ruby/object:Gem::Version
|
|
207
207
|
version: '0'
|
|
208
|
+
- !ruby/object:Gem::Dependency
|
|
209
|
+
name: plugs
|
|
210
|
+
requirement: !ruby/object:Gem::Requirement
|
|
211
|
+
requirements:
|
|
212
|
+
- - ">="
|
|
213
|
+
- !ruby/object:Gem::Version
|
|
214
|
+
version: '0'
|
|
215
|
+
type: :runtime
|
|
216
|
+
prerelease: false
|
|
217
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
218
|
+
requirements:
|
|
219
|
+
- - ">="
|
|
220
|
+
- !ruby/object:Gem::Version
|
|
221
|
+
version: '0'
|
|
208
222
|
- !ruby/object:Gem::Dependency
|
|
209
223
|
name: providers
|
|
210
224
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -219,13 +233,20 @@ dependencies:
|
|
|
219
233
|
- - ">="
|
|
220
234
|
- !ruby/object:Gem::Version
|
|
221
235
|
version: '0'
|
|
222
|
-
description:
|
|
236
|
+
description: "Raindeer is an event-driven framework using the dynamic features and
|
|
237
|
+
latest async improvements in Ruby + some weird ideas, \nto build a new breed of
|
|
238
|
+
web application. Each Raindeer component can be used individually in your exisiting
|
|
239
|
+
application, \nor all together as a cohesive framework. Deer to be different.\n"
|
|
223
240
|
email:
|
|
224
241
|
- maediprichard@gmail.com
|
|
225
|
-
executables:
|
|
242
|
+
executables:
|
|
243
|
+
- rain
|
|
226
244
|
extensions: []
|
|
227
245
|
extra_rdoc_files: []
|
|
228
246
|
files:
|
|
247
|
+
- bin/rain
|
|
248
|
+
- lib/cli/cli.rb
|
|
249
|
+
- lib/cli/static/static.rb
|
|
229
250
|
- lib/matrix/cursor.rb
|
|
230
251
|
- lib/matrix/effects/color_effect.rb
|
|
231
252
|
- lib/matrix/effects/effect.rb
|
|
@@ -233,7 +254,12 @@ files:
|
|
|
233
254
|
- lib/matrix/matrix.rb
|
|
234
255
|
- lib/matrix/stream.rb
|
|
235
256
|
- lib/pages/pages.rb
|
|
257
|
+
- lib/pages/raindown/elements.rb
|
|
258
|
+
- lib/pages/raindown/lexemes/toc_lexeme.rb
|
|
259
|
+
- lib/pages/raindown/nodes/toc_node.rb
|
|
260
|
+
- lib/pages/raindown/raindown.rb
|
|
236
261
|
- lib/raindeer/boot.rb
|
|
262
|
+
- lib/raindeer/cli.rb
|
|
237
263
|
- lib/router/route.rb
|
|
238
264
|
- lib/router/route_event.rb
|
|
239
265
|
- lib/router/router.rb
|
|
@@ -252,11 +278,12 @@ files:
|
|
|
252
278
|
- lib/system/status_node.rbx
|
|
253
279
|
- lib/system/system_routes.rb
|
|
254
280
|
- lib/version.rb
|
|
255
|
-
homepage: https://
|
|
281
|
+
homepage: https://github.com/raindeer-rb/raindeer
|
|
256
282
|
licenses: []
|
|
257
283
|
metadata:
|
|
258
|
-
homepage_uri: https://
|
|
259
|
-
source_code_uri: https://
|
|
284
|
+
homepage_uri: https://github.com/raindeer-rb/raindeer
|
|
285
|
+
source_code_uri: https://github.com/raindeer-rb/raindeer/src/branch/main
|
|
286
|
+
mailing_list_uri: https://www.rubyforum.org/tag/raindeer
|
|
260
287
|
rdoc_options: []
|
|
261
288
|
require_paths:
|
|
262
289
|
- lib
|
|
@@ -273,5 +300,6 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
273
300
|
requirements: []
|
|
274
301
|
rubygems_version: 4.0.6
|
|
275
302
|
specification_version: 4
|
|
276
|
-
summary:
|
|
303
|
+
summary: An event-driven and compositional web framework that's easy to use. Deer
|
|
304
|
+
to be different.
|
|
277
305
|
test_files: []
|