marko 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/CHANGELOG.md +5 -0
- data/Gemfile +10 -0
- data/Gemfile.lock +22 -0
- data/README.md +159 -0
- data/Rakefile +12 -0
- data/exe/marko +20 -0
- data/lib/assets/demo/README.md +13 -0
- data/lib/assets/demo/src/fr/assemble.md +27 -0
- data/lib/assets/demo/src/fr/compile.md +25 -0
- data/lib/assets/demo/src/fr/markup.md +111 -0
- data/lib/assets/demo/src/fr/storage.md +16 -0
- data/lib/assets/demo/src/fr/treenode.md +34 -0
- data/lib/assets/demo/src/index.md +34 -0
- data/lib/assets/demo/src/intro.md +98 -0
- data/lib/assets/demo/src/ui/cli.md +26 -0
- data/lib/assets/demo/src/ui/gem.md +14 -0
- data/lib/assets/demo/src/ur/uc.create.project.md +8 -0
- data/lib/assets/demo/src/ur/uc.general.flow.md +14 -0
- data/lib/assets/init/README.md +61 -0
- data/lib/assets/init/Rakefile +100 -0
- data/lib/assets/init/tt/artifact.md.tt +3 -0
- data/lib/marko/artifact.rb +3 -0
- data/lib/marko/assembler.rb +82 -0
- data/lib/marko/cli.rb +121 -0
- data/lib/marko/compiler.rb +16 -0
- data/lib/marko/config.rb +20 -0
- data/lib/marko/gadgets/pluggable.rb +55 -0
- data/lib/marko/gadgets/sentry.rb +66 -0
- data/lib/marko/gadgets/service.rb +52 -0
- data/lib/marko/gadgets.rb +3 -0
- data/lib/marko/loader.rb +38 -0
- data/lib/marko/markup/compiler.rb +36 -0
- data/lib/marko/markup/decorator.rb +65 -0
- data/lib/marko/markup/macro.rb +176 -0
- data/lib/marko/markup/parser.rb +122 -0
- data/lib/marko/markup/storage.rb +100 -0
- data/lib/marko/markup/validator.rb +101 -0
- data/lib/marko/markup.rb +24 -0
- data/lib/marko/parser.rb +19 -0
- data/lib/marko/services/assemble.rb +16 -0
- data/lib/marko/services/compile.rb +30 -0
- data/lib/marko/services.rb +2 -0
- data/lib/marko/storage.rb +36 -0
- data/lib/marko/tree_node.rb +128 -0
- data/lib/marko/validator.rb +19 -0
- data/lib/marko/version.rb +5 -0
- data/lib/marko.rb +37 -0
- data/marko.gemspec +44 -0
- metadata +99 -0
@@ -0,0 +1,128 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "forwardable"
|
4
|
+
require_relative "gadgets"
|
5
|
+
|
6
|
+
module Marko
|
7
|
+
|
8
|
+
MustbeString = Sentry.new(:key, "must be String"
|
9
|
+
) {|v| v.is_a? String}
|
10
|
+
|
11
|
+
MustbeTreeNode = Sentry.new(:key, "must be TreeNode"
|
12
|
+
) {|v| v.is_a? TreeNode}
|
13
|
+
|
14
|
+
class TreeNode
|
15
|
+
extend Forwardable
|
16
|
+
include Enumerable
|
17
|
+
|
18
|
+
attr_reader :parent
|
19
|
+
attr_reader :title
|
20
|
+
attr_reader :meta
|
21
|
+
attr_reader :body
|
22
|
+
|
23
|
+
def_delegators :@meta, :[], :[]=
|
24
|
+
def_delegator :@items, :last
|
25
|
+
def_delegator :@items, :delete, :delete_item
|
26
|
+
def_delegator :@meta, :delete, :delete_meta
|
27
|
+
def_delegator :@parent, :id, :parent_id
|
28
|
+
|
29
|
+
def initialize(title = '', body = '', **meta)
|
30
|
+
@parent, @items = nil, []
|
31
|
+
@title = MustbeString.(title, :title)
|
32
|
+
@body = MustbeString.(body, :body)
|
33
|
+
@meta = meta
|
34
|
+
@meta[:id] = '' unless @meta[:id]
|
35
|
+
end
|
36
|
+
|
37
|
+
def <<(node)
|
38
|
+
MustbeTreeNode.(node)
|
39
|
+
node.parent = self
|
40
|
+
@items << node
|
41
|
+
node
|
42
|
+
end
|
43
|
+
|
44
|
+
# see Enumerable#each
|
45
|
+
def each(&block)
|
46
|
+
return to_enum(__callee__) unless block_given?
|
47
|
+
yield(self)
|
48
|
+
items.each{|n| n.each(&block) }
|
49
|
+
end
|
50
|
+
|
51
|
+
# @return [Array<String>]
|
52
|
+
def order_index
|
53
|
+
@meta
|
54
|
+
.fetch(:order_index, '')
|
55
|
+
.strip
|
56
|
+
.split(/\s{1,}/)
|
57
|
+
end
|
58
|
+
|
59
|
+
def id
|
60
|
+
val = @meta.fetch(:id, '')
|
61
|
+
return val unless @parent
|
62
|
+
val.start_with?('.') ? @parent.id + val : val
|
63
|
+
end
|
64
|
+
|
65
|
+
def find_item(ref)
|
66
|
+
@items.find{|n| n.id == ref || n.id.end_with?(ref)}
|
67
|
+
end
|
68
|
+
|
69
|
+
def find_node(ref)
|
70
|
+
return find_item(ref) if ref.start_with?(?.)
|
71
|
+
root.find{|n| n.id == ref}
|
72
|
+
end
|
73
|
+
|
74
|
+
# @return [Array<Node>] ordered list of child nodes
|
75
|
+
def items
|
76
|
+
return @items unless order_index.any?
|
77
|
+
[].tap do |ary|
|
78
|
+
src = Array.new(@items)
|
79
|
+
order_index.each do |i|
|
80
|
+
node = find_item(i)
|
81
|
+
ary << src.delete(node) if node
|
82
|
+
end
|
83
|
+
ary.concat(src)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def belongs_to?(ref)
|
88
|
+
owner = root.find{|n| n.id == ref}
|
89
|
+
self == owner&.find{|n| n == self}
|
90
|
+
end
|
91
|
+
|
92
|
+
# @return [Node] the root node in the node hierarchy
|
93
|
+
def root
|
94
|
+
n = self
|
95
|
+
n = n.parent while n.parent
|
96
|
+
n
|
97
|
+
end
|
98
|
+
|
99
|
+
def root?
|
100
|
+
self == root
|
101
|
+
end
|
102
|
+
|
103
|
+
# @return [Integer] the node level in the node hierarchy
|
104
|
+
def nesting_level
|
105
|
+
@parent.nil? ? 0 : @parent.nesting_level + 1
|
106
|
+
end
|
107
|
+
|
108
|
+
# @return [Array<String>] macro links in the node #body IT IS RATHER MACRO FOR WRITER SO TI SHOULD BE PROCESSED APPROPRIATELY
|
109
|
+
def links
|
110
|
+
return [] if @body.empty?
|
111
|
+
@body.scan(/\[\[([\w\.]*)\]\]/).flatten.uniq
|
112
|
+
end
|
113
|
+
|
114
|
+
def orphan!
|
115
|
+
return unless @parent
|
116
|
+
@parent.delete_item(self)
|
117
|
+
@parent = nil
|
118
|
+
end
|
119
|
+
|
120
|
+
protected
|
121
|
+
|
122
|
+
def parent=(node)
|
123
|
+
@parent = MustbeTreeNode.(node)
|
124
|
+
end
|
125
|
+
|
126
|
+
end
|
127
|
+
|
128
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "tree_node"
|
4
|
+
|
5
|
+
module Marko
|
6
|
+
|
7
|
+
# The strategy of tree validation
|
8
|
+
class Validator
|
9
|
+
extend Pluggable
|
10
|
+
|
11
|
+
# @param tree [TreeNode]
|
12
|
+
# @param block [&block] proc {|event, payload|}
|
13
|
+
# @return [Array<String>] errors array
|
14
|
+
def call(tree, &block)
|
15
|
+
fail "the abstract method must be overriden"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
data/lib/marko.rb
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "marko/version"
|
4
|
+
require_relative "marko/gadgets"
|
5
|
+
require_relative "marko/tree_node"
|
6
|
+
require_relative "marko/storage"
|
7
|
+
require_relative "marko/parser"
|
8
|
+
require_relative "marko/validator"
|
9
|
+
require_relative "marko/assembler"
|
10
|
+
require_relative "marko/compiler"
|
11
|
+
require_relative "marko/config"
|
12
|
+
require_relative "marko/markup"
|
13
|
+
require_relative "marko/services"
|
14
|
+
require_relative "marko/loader"
|
15
|
+
require_relative "marko/cli"
|
16
|
+
|
17
|
+
module Marko
|
18
|
+
|
19
|
+
class << self
|
20
|
+
def root
|
21
|
+
File.dirname __dir__
|
22
|
+
end
|
23
|
+
|
24
|
+
# helper method for assemblage
|
25
|
+
# @see Marko::Services::Assemble
|
26
|
+
def assemble(&block)
|
27
|
+
Services::Assemble.(&block)
|
28
|
+
end
|
29
|
+
|
30
|
+
# helper method for compilation
|
31
|
+
# @see Marko::Services::Compile
|
32
|
+
def compile(tree: nil, template: '', filename: '', &block)
|
33
|
+
Services::Compile.(
|
34
|
+
tree: tree, template: template, filename: filename, &block)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/marko.gemspec
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "lib/marko/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = "marko"
|
7
|
+
spec.version = Marko::VERSION
|
8
|
+
spec.authors = ["Nikolay Voynov"]
|
9
|
+
spec.email = ["nvoynov@gmail.com"]
|
10
|
+
|
11
|
+
spec.summary = "Marko is a markup compiler that builds a tree from separated markup sources and compiles it into a deliverable artifact."
|
12
|
+
|
13
|
+
spec.description = <<~EOF
|
14
|
+
Marko supplies a "docs-as-code" approach for compiling bulky software artifacts by providing source storage, original plain text markup, compiler templates, command-line and Gem interfaces.
|
15
|
+
|
16
|
+
Having the assembled artifact, it can be analyzed, enriched by extra data, served as a source for deriving subdued artifacts, etc.
|
17
|
+
EOF
|
18
|
+
|
19
|
+
spec.homepage = "https://github.com/nvoynov/marko"
|
20
|
+
spec.required_ruby_version = ">= 2.6.0"
|
21
|
+
|
22
|
+
spec.metadata["allowed_push_host"] = "https://rubygems.org"
|
23
|
+
|
24
|
+
spec.metadata["homepage_uri"] = spec.homepage
|
25
|
+
spec.metadata["source_code_uri"] = spec.homepage
|
26
|
+
spec.metadata["changelog_uri"] = "#{spec.homepage}/CHANGELOG.md"
|
27
|
+
|
28
|
+
# Specify which files should be added to the gem when it is released.
|
29
|
+
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
30
|
+
spec.files = Dir.chdir(__dir__) do
|
31
|
+
`git ls-files -z`.split("\x0").reject do |f|
|
32
|
+
(f == __FILE__) || f.match(%r{\A(?:(?:bin|test|spec|features)/|\.(?:git|circleci)|appveyor)})
|
33
|
+
end
|
34
|
+
end
|
35
|
+
spec.bindir = "exe"
|
36
|
+
spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
|
37
|
+
spec.require_paths = ["lib"]
|
38
|
+
|
39
|
+
# Uncomment to register a new dependency of your gem
|
40
|
+
# spec.add_dependency "example-gem", "~> 1.0"
|
41
|
+
|
42
|
+
# For more information and examples about making a new gem, check out our
|
43
|
+
# guide at: https://bundler.io/guides/creating_gem.html
|
44
|
+
end
|
metadata
ADDED
@@ -0,0 +1,99 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: marko
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Nikolay Voynov
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2023-01-02 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: |
|
14
|
+
Marko supplies a "docs-as-code" approach for compiling bulky software artifacts by providing source storage, original plain text markup, compiler templates, command-line and Gem interfaces.
|
15
|
+
|
16
|
+
Having the assembled artifact, it can be analyzed, enriched by extra data, served as a source for deriving subdued artifacts, etc.
|
17
|
+
email:
|
18
|
+
- nvoynov@gmail.com
|
19
|
+
executables:
|
20
|
+
- marko
|
21
|
+
extensions: []
|
22
|
+
extra_rdoc_files: []
|
23
|
+
files:
|
24
|
+
- CHANGELOG.md
|
25
|
+
- Gemfile
|
26
|
+
- Gemfile.lock
|
27
|
+
- README.md
|
28
|
+
- Rakefile
|
29
|
+
- exe/marko
|
30
|
+
- lib/assets/demo/README.md
|
31
|
+
- lib/assets/demo/src/fr/assemble.md
|
32
|
+
- lib/assets/demo/src/fr/compile.md
|
33
|
+
- lib/assets/demo/src/fr/markup.md
|
34
|
+
- lib/assets/demo/src/fr/storage.md
|
35
|
+
- lib/assets/demo/src/fr/treenode.md
|
36
|
+
- lib/assets/demo/src/index.md
|
37
|
+
- lib/assets/demo/src/intro.md
|
38
|
+
- lib/assets/demo/src/ui/cli.md
|
39
|
+
- lib/assets/demo/src/ui/gem.md
|
40
|
+
- lib/assets/demo/src/ur/uc.create.project.md
|
41
|
+
- lib/assets/demo/src/ur/uc.general.flow.md
|
42
|
+
- lib/assets/init/README.md
|
43
|
+
- lib/assets/init/Rakefile
|
44
|
+
- lib/assets/init/tt/artifact.md.tt
|
45
|
+
- lib/marko.rb
|
46
|
+
- lib/marko/artifact.rb
|
47
|
+
- lib/marko/assembler.rb
|
48
|
+
- lib/marko/cli.rb
|
49
|
+
- lib/marko/compiler.rb
|
50
|
+
- lib/marko/config.rb
|
51
|
+
- lib/marko/gadgets.rb
|
52
|
+
- lib/marko/gadgets/pluggable.rb
|
53
|
+
- lib/marko/gadgets/sentry.rb
|
54
|
+
- lib/marko/gadgets/service.rb
|
55
|
+
- lib/marko/loader.rb
|
56
|
+
- lib/marko/markup.rb
|
57
|
+
- lib/marko/markup/compiler.rb
|
58
|
+
- lib/marko/markup/decorator.rb
|
59
|
+
- lib/marko/markup/macro.rb
|
60
|
+
- lib/marko/markup/parser.rb
|
61
|
+
- lib/marko/markup/storage.rb
|
62
|
+
- lib/marko/markup/validator.rb
|
63
|
+
- lib/marko/parser.rb
|
64
|
+
- lib/marko/services.rb
|
65
|
+
- lib/marko/services/assemble.rb
|
66
|
+
- lib/marko/services/compile.rb
|
67
|
+
- lib/marko/storage.rb
|
68
|
+
- lib/marko/tree_node.rb
|
69
|
+
- lib/marko/validator.rb
|
70
|
+
- lib/marko/version.rb
|
71
|
+
- marko.gemspec
|
72
|
+
homepage: https://github.com/nvoynov/marko
|
73
|
+
licenses: []
|
74
|
+
metadata:
|
75
|
+
allowed_push_host: https://rubygems.org
|
76
|
+
homepage_uri: https://github.com/nvoynov/marko
|
77
|
+
source_code_uri: https://github.com/nvoynov/marko
|
78
|
+
changelog_uri: https://github.com/nvoynov/marko/CHANGELOG.md
|
79
|
+
post_install_message:
|
80
|
+
rdoc_options: []
|
81
|
+
require_paths:
|
82
|
+
- lib
|
83
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
84
|
+
requirements:
|
85
|
+
- - ">="
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: 2.6.0
|
88
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
89
|
+
requirements:
|
90
|
+
- - ">="
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
version: '0'
|
93
|
+
requirements: []
|
94
|
+
rubygems_version: 3.4.1
|
95
|
+
signing_key:
|
96
|
+
specification_version: 4
|
97
|
+
summary: Marko is a markup compiler that builds a tree from separated markup sources
|
98
|
+
and compiles it into a deliverable artifact.
|
99
|
+
test_files: []
|