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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1e0b76037f60987d82171f076418703e068203ea1a9326964c630049a7aef633
4
- data.tar.gz: 92a5be3103a09b81f287f3dafb74d75cf41761271d2c917500bf762fefb4613a
3
+ metadata.gz: 1911af310e0e12743cd151c8d0434b247d959385ea04329a40287538199b0407
4
+ data.tar.gz: 84320dbf6de9d25dd6c9c3315f51abfddeb2e21d62ddd6e99e8ff754ba252ba4
5
5
  SHA512:
6
- metadata.gz: 06b5fb27769c9319b0c0dbe7ef75cbdab5f5ea6e1c9b116bcd73faffbb9c56211a9818e62aae4ebe27b3a120eb0fc689caabe55e14d751f7461a85a0aeaf9448
7
- data.tar.gz: d96c8de0e0d25782b167c7fd72bd610463f353379df85024323edfaae941490bb7f751db37effb4112aa31788ba3de9f757bb38c16be937f03ed3329739f9bf5
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
- require 'kramdown'
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, text = parse_file(file_path:)
21
- html = Kramdown::Document.new(text, input: 'GFM', syntax_highlighter: 'rouge').to_html
19
+ metadata, markdown = parse_file(file_path:)
20
+ raindown = @raindown.render(markdown:)
22
21
 
23
- Result.new(metadata, html)
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
- require_relative '../pages/pages'
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('config.yaml', env)
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
- # USER CODE
57
+ # APPLICATION CODE
59
58
  #################################################
60
59
 
61
- require 'antlers' # LowLoad supports antlers but doesn't make it a hard dependency.
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
- Providers.define('rain.pages', eager: true) do
72
- Rain::Pages.new(metadata:)
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
@@ -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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Raindeer
4
- VERSION = '0.6.0'
4
+ VERSION = '0.7.0'
5
5
  end
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.6.0
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - maedi
8
- bindir: exe
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: kramdown
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: kramdown-parser-gfm
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: rouge
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: A new Ruby framework. Coming soon...
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://codeberg.org/raindeer/raindeer
281
+ homepage: https://github.com/raindeer-rb/raindeer
256
282
  licenses: []
257
283
  metadata:
258
- homepage_uri: https://codeberg.org/raindeer/raindeer
259
- source_code_uri: https://codeberg.org/raindeer/raindeer/src/branch/main
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: Deer to be different
303
+ summary: An event-driven and compositional web framework that's easy to use. Deer
304
+ to be different.
277
305
  test_files: []