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.
Files changed (50) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +5 -0
  3. data/Gemfile +10 -0
  4. data/Gemfile.lock +22 -0
  5. data/README.md +159 -0
  6. data/Rakefile +12 -0
  7. data/exe/marko +20 -0
  8. data/lib/assets/demo/README.md +13 -0
  9. data/lib/assets/demo/src/fr/assemble.md +27 -0
  10. data/lib/assets/demo/src/fr/compile.md +25 -0
  11. data/lib/assets/demo/src/fr/markup.md +111 -0
  12. data/lib/assets/demo/src/fr/storage.md +16 -0
  13. data/lib/assets/demo/src/fr/treenode.md +34 -0
  14. data/lib/assets/demo/src/index.md +34 -0
  15. data/lib/assets/demo/src/intro.md +98 -0
  16. data/lib/assets/demo/src/ui/cli.md +26 -0
  17. data/lib/assets/demo/src/ui/gem.md +14 -0
  18. data/lib/assets/demo/src/ur/uc.create.project.md +8 -0
  19. data/lib/assets/demo/src/ur/uc.general.flow.md +14 -0
  20. data/lib/assets/init/README.md +61 -0
  21. data/lib/assets/init/Rakefile +100 -0
  22. data/lib/assets/init/tt/artifact.md.tt +3 -0
  23. data/lib/marko/artifact.rb +3 -0
  24. data/lib/marko/assembler.rb +82 -0
  25. data/lib/marko/cli.rb +121 -0
  26. data/lib/marko/compiler.rb +16 -0
  27. data/lib/marko/config.rb +20 -0
  28. data/lib/marko/gadgets/pluggable.rb +55 -0
  29. data/lib/marko/gadgets/sentry.rb +66 -0
  30. data/lib/marko/gadgets/service.rb +52 -0
  31. data/lib/marko/gadgets.rb +3 -0
  32. data/lib/marko/loader.rb +38 -0
  33. data/lib/marko/markup/compiler.rb +36 -0
  34. data/lib/marko/markup/decorator.rb +65 -0
  35. data/lib/marko/markup/macro.rb +176 -0
  36. data/lib/marko/markup/parser.rb +122 -0
  37. data/lib/marko/markup/storage.rb +100 -0
  38. data/lib/marko/markup/validator.rb +101 -0
  39. data/lib/marko/markup.rb +24 -0
  40. data/lib/marko/parser.rb +19 -0
  41. data/lib/marko/services/assemble.rb +16 -0
  42. data/lib/marko/services/compile.rb +30 -0
  43. data/lib/marko/services.rb +2 -0
  44. data/lib/marko/storage.rb +36 -0
  45. data/lib/marko/tree_node.rb +128 -0
  46. data/lib/marko/validator.rb +19 -0
  47. data/lib/marko/version.rb +5 -0
  48. data/lib/marko.rb +37 -0
  49. data/marko.gemspec +44 -0
  50. 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
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Marko
4
+ VERSION = "0.1.0"
5
+ 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: []