brandish 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (85) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +10 -0
  3. data/.rspec +3 -0
  4. data/.rubocop.yml +41 -0
  5. data/.travis.yml +5 -0
  6. data/.yardopts +1 -0
  7. data/CODE_OF_CONDUCT.md +74 -0
  8. data/Gemfile +10 -0
  9. data/LICENSE.txt +21 -0
  10. data/README.md +41 -0
  11. data/Rakefile +9 -0
  12. data/bin/brandish +16 -0
  13. data/brandish.gemspec +39 -0
  14. data/defaults/templates/html.liquid +39 -0
  15. data/lib/brandish.rb +51 -0
  16. data/lib/brandish/application.rb +163 -0
  17. data/lib/brandish/application/bench_command.rb +96 -0
  18. data/lib/brandish/application/build_command.rb +73 -0
  19. data/lib/brandish/application/initialize_command.rb +83 -0
  20. data/lib/brandish/application/serve_command.rb +150 -0
  21. data/lib/brandish/configure.rb +196 -0
  22. data/lib/brandish/configure/dsl.rb +135 -0
  23. data/lib/brandish/configure/dsl/form.rb +136 -0
  24. data/lib/brandish/configure/form.rb +32 -0
  25. data/lib/brandish/errors.rb +65 -0
  26. data/lib/brandish/execute.rb +26 -0
  27. data/lib/brandish/markup.rb +10 -0
  28. data/lib/brandish/markup/redcarpet.rb +14 -0
  29. data/lib/brandish/markup/redcarpet/format.rb +127 -0
  30. data/lib/brandish/markup/redcarpet/html.rb +95 -0
  31. data/lib/brandish/parser.rb +26 -0
  32. data/lib/brandish/parser/main.rb +237 -0
  33. data/lib/brandish/parser/node.rb +89 -0
  34. data/lib/brandish/parser/node/block.rb +98 -0
  35. data/lib/brandish/parser/node/command.rb +102 -0
  36. data/lib/brandish/parser/node/pair.rb +42 -0
  37. data/lib/brandish/parser/node/root.rb +83 -0
  38. data/lib/brandish/parser/node/string.rb +18 -0
  39. data/lib/brandish/parser/node/text.rb +114 -0
  40. data/lib/brandish/path_set.rb +163 -0
  41. data/lib/brandish/processor.rb +47 -0
  42. data/lib/brandish/processor/base.rb +144 -0
  43. data/lib/brandish/processor/block.rb +47 -0
  44. data/lib/brandish/processor/command.rb +47 -0
  45. data/lib/brandish/processor/context.rb +169 -0
  46. data/lib/brandish/processor/descend.rb +32 -0
  47. data/lib/brandish/processor/inline.rb +49 -0
  48. data/lib/brandish/processor/name_filter.rb +67 -0
  49. data/lib/brandish/processor/pair_filter.rb +96 -0
  50. data/lib/brandish/processors.rb +26 -0
  51. data/lib/brandish/processors/all.rb +19 -0
  52. data/lib/brandish/processors/all/comment.rb +29 -0
  53. data/lib/brandish/processors/all/embed.rb +56 -0
  54. data/lib/brandish/processors/all/if.rb +109 -0
  55. data/lib/brandish/processors/all/import.rb +95 -0
  56. data/lib/brandish/processors/all/literal.rb +42 -0
  57. data/lib/brandish/processors/all/verify.rb +47 -0
  58. data/lib/brandish/processors/common.rb +20 -0
  59. data/lib/brandish/processors/common/asset.rb +118 -0
  60. data/lib/brandish/processors/common/asset/paths.rb +93 -0
  61. data/lib/brandish/processors/common/group.rb +67 -0
  62. data/lib/brandish/processors/common/header.rb +86 -0
  63. data/lib/brandish/processors/common/markup.rb +127 -0
  64. data/lib/brandish/processors/common/output.rb +73 -0
  65. data/lib/brandish/processors/html.rb +18 -0
  66. data/lib/brandish/processors/html/group.rb +33 -0
  67. data/lib/brandish/processors/html/header.rb +46 -0
  68. data/lib/brandish/processors/html/markup.rb +131 -0
  69. data/lib/brandish/processors/html/output.rb +62 -0
  70. data/lib/brandish/processors/html/output/document.rb +127 -0
  71. data/lib/brandish/processors/html/script.rb +64 -0
  72. data/lib/brandish/processors/html/script/babel.rb +48 -0
  73. data/lib/brandish/processors/html/script/coffee.rb +47 -0
  74. data/lib/brandish/processors/html/script/vanilla.rb +45 -0
  75. data/lib/brandish/processors/html/style.rb +82 -0
  76. data/lib/brandish/processors/html/style/highlight.rb +89 -0
  77. data/lib/brandish/processors/html/style/sass.rb +64 -0
  78. data/lib/brandish/processors/html/style/vanilla.rb +71 -0
  79. data/lib/brandish/processors/latex.rb +15 -0
  80. data/lib/brandish/processors/latex/markup.rb +47 -0
  81. data/lib/brandish/scanner.rb +64 -0
  82. data/lib/brandish/version.rb +9 -0
  83. data/templates/initialize/Gemfile.tt +14 -0
  84. data/templates/initialize/brandish.config.rb.tt +49 -0
  85. metadata +296 -0
@@ -0,0 +1,48 @@
1
+ # encoding: utf-8
2
+ # frozen_string_literal: true
3
+
4
+ module Brandish
5
+ module Processors
6
+ module HTML
7
+ class Script < Common::Asset
8
+ # A set of scripting engines that use the Babel transpiler.
9
+ #
10
+ # Engines:
11
+ #
12
+ # - `"babel"`, `"babel-file"` - A command. This takes the contents
13
+ # of the resolved file, transpiles it, and outputs it into
14
+ # the output path, given by `#load_file_paths`.
15
+ # - `"babel-inline"` - A block. Similar to `"babel"`; however, it
16
+ # takes the block, uses {Parser::Node::Root#flatten} on it,
17
+ # transpiles the result, and adds that as an inline script.
18
+ #
19
+ # @note
20
+ # The libraries that these engines depend on are not required in
21
+ # by default; if any of these engines are used, the requisite
22
+ # libraries would have to be required by the `brandish.config.rb`
23
+ # file.
24
+ module Babel
25
+ Script.engine "babel", :command, :script_babel_file
26
+ Script.engine "babel-file", :command, :script_babel_file
27
+ Script.engine "babel-inline", :block, :script_babel_inline
28
+
29
+ private
30
+
31
+ def script_babel_inline
32
+ parsed = ::Babel::Transpiler.transform(@body.flatten)
33
+ @context[:document].add_inline_script(parsed["code"])
34
+ end
35
+
36
+ def script_babel_file
37
+ paths = load_file_paths
38
+ paths[:out].dirname.mkpath
39
+ parsed = ::Babel::Transpiler.transform(paths[:file].read)
40
+ paths[:out].write(parsed["code"])
41
+
42
+ @context[:document].add_linked_script(paths[:src])
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,47 @@
1
+ # encoding: utf-8
2
+ # frozen_string_literal: true
3
+
4
+ module Brandish
5
+ module Processors
6
+ module HTML
7
+ class Script < Common::Asset
8
+ # A set of scripting engines that use the Coffee transpiler.
9
+ #
10
+ # Engines:
11
+ #
12
+ # - `"coffee"`, `"coffee-file"` - A command. This takes the contents
13
+ # of the resolved file, transpiles it, and outputs it into
14
+ # the output path, given by `#load_file_paths`.
15
+ # - `"coffee-inline"` - A block. Similar to `"coffee"`; however, it
16
+ # takes the block, uses {Parser::Node::Root#flatten} on it,
17
+ # transpiles the result, and adds that as an inline script.
18
+ #
19
+ # @note
20
+ # The libraries that these engines depend on are not required in
21
+ # by default; if any of these engines are used, the requisite
22
+ # libraries would have to be required by the `brandish.config.rb`
23
+ # file.
24
+ module Coffee
25
+ Script.engine "coffee", :command, :script_coffee_file
26
+ Script.engine "coffee-file", :command, :script_coffee_file
27
+ Script.engine "coffee-inline", :block, :script_coffee_inline
28
+
29
+ private
30
+
31
+ def script_coffee_inline
32
+ parsed = ::CoffeeScript.compile(@body.flatten)
33
+ @context[:document].add_inline_script(parsed)
34
+ end
35
+
36
+ def script_coffee_file
37
+ paths = load_file_paths
38
+ paths[:out].dirname.mkpath
39
+ paths[:out].write(::CoffeeScript.compile(paths[:file].read))
40
+
41
+ @context[:document].add_linked_script(paths[:src])
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,45 @@
1
+ # encoding: utf-8
2
+ # frozen_string_literal: true
3
+
4
+ module Brandish
5
+ module Processors
6
+ module HTML
7
+ class Script < Common::Asset
8
+ # "Vanilla" scripting engines. This just performs copying, and
9
+ # does not modify the contents of the styles at all.
10
+ #
11
+ # Engines:
12
+ #
13
+ # - `"file"` - A command. Takes a file, and copies it over to the
14
+ # destination, based on the values given in `#load_file_paths`.
15
+ # - `"remote"`, `"remote-file"` - A command. Takes a URI (supports
16
+ # `http`, `https`, and `ftp`), and outputs the directory into the
17
+ # `"output"` pair (or a uri path assumed from the URI).
18
+ # - `"inline"` - A block. This performs {Parser::Node::Root#flatten}
19
+ # on the body, and pushes the result as an inline style.
20
+ # - `"remote-inline"` - A command. Similar to `"remote"`; however,
21
+ # this takes the remote styles as an inline style.
22
+ module Vanilla
23
+ Script.engine "inline", :block, :script_inline
24
+ Script.engine "file", :command, :script_file
25
+
26
+ private
27
+
28
+ def script_inline
29
+ @context[:document].add_inline_script(@body.flatten)
30
+ end
31
+
32
+ def script_file
33
+ paths = load_file_paths
34
+ paths[:out].dirname.mkpath
35
+ src, dest = paths[:file].open("rb"), paths[:out].open("wb")
36
+ ::IO.copy_stream(src, dest)
37
+ [src, dest].each(&:close)
38
+
39
+ @context[:document].add_linked_script(paths[:src])
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,82 @@
1
+ # encoding: utf-8
2
+ # frozen_string_literal: true
3
+
4
+ require "brandish/processors/html/style/highlight"
5
+ require "brandish/processors/html/style/sass"
6
+ require "brandish/processors/html/style/vanilla"
7
+
8
+ module Brandish
9
+ module Processors
10
+ module HTML
11
+ # A Style asset. This is a CSS asset.
12
+ #
13
+ # Engines:
14
+ #
15
+ # - `"highlight-rouge"`, `"highlight-rouge-file"` - A command.
16
+ # Retrieves the given theme from the Rouge library, and outputs it
17
+ # to the `"output"` pair (or `"highlight/rouge/<theme>.css"` by
18
+ # default).
19
+ # - `"highlight-pygments", `"highlight-pygments-file"` - A command.
20
+ # Retrieves the given theme from the Pygments library, and outputs
21
+ # it to the `"output"` pair (or `"highlight/pygments/<theme>.css"`
22
+ # by default).
23
+ # - `"highlight-rouge-inline"` - A command. Retrieves the given theme
24
+ # from the Rouge library, and uses it like an inline style.
25
+ # - `"highlight-pygments-inline"` - A command. Retrieves the given
26
+ # theme from the pygments library, and uses it like an inline
27
+ # style.
28
+ # - `"sass"`, `"sass-file"`, `"scss"`, `"scss-file"` - A command.
29
+ # These take a file and processes it, and outputs it to the output
30
+ # path given by `#load_file_paths`. There is no difference
31
+ # between any of these engine types - the engine assumes the actual
32
+ # syntax of the file from the file extension.
33
+ # - `"sass-inline"` - A block. This takes the block's contents,
34
+ # performs {Parser::Node::Root#flatten} on it, and processes the
35
+ # content as Sass. This is then included as an inline stylesheet.
36
+ # - `"scss-inline" - A block. Similar to `"sass-inline"`, except it
37
+ # processes the content as SCSS.
38
+ # - `"file"` - A command. Takes a file, and copies it over to the
39
+ # destination, based on the values given in `#load_file_paths`.
40
+ # - `"remote"`, `"remote-file"` - A command. Takes a URI (supports
41
+ # `http`, `https`, and `ftp`), and outputs the directory into the
42
+ # `"output"` pair (or a uri path assumed from the URI).
43
+ # - `"inline"` - A block. This performs {Parser::Node::Root#flatten}
44
+ # on the body, and pushes the result as an inline style.
45
+ # - `"remote-inline"` - A command. Similar to `"remote"`; however,
46
+ # this takes the remote styles as an inline style.
47
+ #
48
+ # Pairs:
49
+ #
50
+ # - `"src"`, `"file"`, `"name"`, or `"link"` - Required. At least one
51
+ # of these options are required. They all perform the same function.
52
+ # This defines the name or path of the asset to add or process.
53
+ # - `"type"` - Required. The type of the asset to process. This defines
54
+ # how the asset is handled.
55
+ # - `"theme"` - Required (for `highlight-*` engines only). The theme
56
+ # to find for styling.
57
+ # - `"scope"` - Required (for `highlight-*` engines only). The CSS
58
+ # scope for styling.
59
+ # - `"output"` - Optional (for `highlight-*` engines or for
60
+ # `"remote"`/`"remote-file"` that output to a file only). The output
61
+ # path for the CSS file.
62
+ class Style < Common::Asset
63
+ register %i(html style) => self
64
+ self.names = %i(style styling)
65
+
66
+ include Style::Highlight
67
+ include Style::Sass
68
+ include Style::Vanilla
69
+
70
+ # (see Common::Asset::Paths#asset_kind_path)
71
+ def asset_kind_path
72
+ "assets/styles"
73
+ end
74
+
75
+ # (see Common::Asset::Paths#asset_kind_extension)
76
+ def asset_kind_extension
77
+ ".css"
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,89 @@
1
+ # encoding: utf-8
2
+ # frozen_string_literal: true
3
+
4
+ module Brandish
5
+ module Processors
6
+ module HTML
7
+ class Style < Common::Asset
8
+ # A Style engine for highlighting libraries. This supports
9
+ # Rouge and Pygments.
10
+ #
11
+ # Engines:
12
+ #
13
+ # - `"highlight-rouge"`, `"highlight-rouge-file"` - A command.
14
+ # Retrieves the given theme from the Rouge library, and outputs it
15
+ # to the `"output"` pair (or `"highlight/rouge/<theme>.css"` by
16
+ # default).
17
+ # - `"highlight-pygments", `"highlight-pygments-file"` - A command.
18
+ # Retrieves the given theme from the Pygments library, and outputs
19
+ # it to the `"output"` pair (or `"highlight/pygments/<theme>.css"`
20
+ # by default).
21
+ # - `"highlight-rouge-inline"` - A command. Retrieves the given theme
22
+ # from the Rouge library, and uses it like an inline style.
23
+ # - `"highlight-pygments-inline"` - A command. Retrieves the given
24
+ # theme from the pygments library, and uses it like an inline
25
+ # style.
26
+ #
27
+ # @note
28
+ # The libraries that these engines depend on are not required in
29
+ # by default; if any of these engines are used, the requisite
30
+ # libraries would have to be required by the `brandish.config.rb`
31
+ # file.
32
+ module Highlight
33
+ Style.engine "highlight-rouge", :command, :style_highlight_rouge
34
+ Style.engine "highlight-pygments", :command, :style_highlight_pygments
35
+ Style.engine "highlight-rouge-file", :command, :style_highlight_rouge
36
+ Style.engine "highlight-pygments-file", :command, :style_highlight_pygments
37
+ Style.engine "highlight-rouge-inline", :command, :style_highlight_rouge_inline
38
+ Style.engine "highlight-pygments-inline", :command, :style_highlight_pygments_inline
39
+ Style.pair :theme, :scope, :output
40
+
41
+ private
42
+
43
+ def highlight_theme
44
+ @pairs.fetch("theme")
45
+ end
46
+
47
+ def highlight_rouge_value
48
+ scope = @pairs.fetch("scope", ".highlight")
49
+ options = { scope: scope }
50
+ ::Rouge::Theme.find(highlight_theme).render(options)
51
+ end
52
+
53
+ def highlight_pygments_value
54
+ scope = @pairs.fetch("scope", ".highlight")
55
+ ::Pygments.css(scope, style: highlight_theme)
56
+ end
57
+
58
+ def style_highlight_rouge
59
+ file = @pairs.fetch("output", "highlight/rouge/#{highlight_theme}.css")
60
+ output_path = output_styles_path / file
61
+ output_path.dirname.mkpath
62
+ link_path = output_path.relative_path_from(@context.configure.output)
63
+ output_path.write(highlight_rouge_value)
64
+
65
+ @context[:document].add_linked_style(link_path)
66
+ end
67
+
68
+ def style_highlight_pygments
69
+ file = @pairs.fetch("output", "highlight/pygments/#{highlight_theme}.css")
70
+ output_path = output_styles_path / file
71
+ output_path.dirname.mkpath
72
+ link_path = output_path.relative_path_from(@context.configure.output)
73
+ output_path.write(highlight_pygments_value)
74
+
75
+ @context[:document].add_linked_style(link_path)
76
+ end
77
+
78
+ def style_highlight_rouge_inline
79
+ @context[:document].add_inline_style(highlight_rouge_value)
80
+ end
81
+
82
+ def style_highlight_pygments_inline
83
+ @context[:document].add_inline_style(highlight_pygments_value)
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,64 @@
1
+ # encoding: utf-8
2
+ # frozen_string_literal: true
3
+
4
+ module Brandish
5
+ module Processors
6
+ module HTML
7
+ class Style < Common::Asset
8
+ # A set of styling engines that provide access to Sass/SCSS.
9
+ #
10
+ # Engines:
11
+ #
12
+ # - `"sass"`, `"sass-file"`, `"scss"`, `"scss-file"` - A command.
13
+ # These take a file and processes it, and outputs it to the output
14
+ # path given by `#load_file_paths`. There is no difference
15
+ # between any of these engine types - the engine assumes the actual
16
+ # syntax of the file from the file extension.
17
+ # - `"sass-inline"` - A block. This takes the block's contents,
18
+ # performs {Parser::Node::Root#flatten} on it, and processes the
19
+ # content as Sass. This is then included as an inline stylesheet.
20
+ # - `"scss-inline" - A block. Similar to `"sass-inline"`, except it
21
+ # processes the content as SCSS.
22
+ #
23
+ # @note
24
+ # The libraries that these engines depend on are not required in
25
+ # by default; if any of these engines are used, the requisite
26
+ # libraries would have to be required by the `brandish.config.rb`
27
+ # file.
28
+ module Sass
29
+ Style.engine "sass", :command, :style_file_sass
30
+ Style.engine "scss", :command, :style_file_sass
31
+ Style.engine "sass-file", :command, :style_file_sass
32
+ Style.engine "scss-file", :command, :style_file_sass
33
+ Style.engine "sass-inline", :block, :style_inline_sass
34
+ Style.engine "scss-inline", :block, :style_inline_scss
35
+
36
+ private
37
+
38
+ def style_file_sass
39
+ paths = load_file_paths
40
+ paths[:out].dirname.mkpath
41
+ dest = paths[:out].open("wb")
42
+ sass_options = { load_paths: style_load_paths.to_a }
43
+ engine = ::Sass::Engine.for_file(paths[:file].to_s, sass_options)
44
+ output = engine.render
45
+ dest.write(output)
46
+ dest.close
47
+
48
+ @context[:document].add_linked_style(paths[:src])
49
+ end
50
+
51
+ def style_inline_scss
52
+ style_inline_sass(:scss)
53
+ end
54
+
55
+ def style_inline_sass(syntax = :sass)
56
+ sass_options = { syntax: syntax, load_paths: style_load_paths.to_a }
57
+ engine = ::Sass::Engine.new(@body.flatten, sass_options)
58
+ @context[:document].add_inline_style(engine.render)
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,71 @@
1
+ # encoding: utf-8
2
+ # frozen_string_literal: true
3
+
4
+ module Brandish
5
+ module Processors
6
+ module HTML
7
+ class Style < Common::Asset
8
+ # "Vanilla" stylesheet engines. This just performs copying, and
9
+ # does not modify the contents of the styles at all.
10
+ #
11
+ # Engines:
12
+ #
13
+ # - `"file"` - A command. Takes a file, and copies it over to the
14
+ # destination, based on the values given in `#load_file_paths`.
15
+ # - `"remote"`, `"remote-file"` - A command. Takes a URI (supports
16
+ # `http`, `https`, and `ftp`), and outputs the directory into the
17
+ # `"output"` pair (or a uri path assumed from the URI).
18
+ # - `"inline"` - A block. This performs {Parser::Node::Root#flatten}
19
+ # on the body, and pushes the result as an inline style.
20
+ # - `"remote-inline"` - A command. Similar to `"remote"`; however,
21
+ # this takes the remote styles as an inline style.
22
+ module Vanilla
23
+ Style.engine "file", :command, :style_file
24
+ Style.engine "remote", :command, :style_file_remote
25
+ Style.engine "inline", :block, :style_inline
26
+ Style.engine "remote-file", :command, :style_file_remote
27
+ Style.engine "remote-inline", :command, :style_inline_remote
28
+
29
+ private
30
+
31
+ def style_inline_remote
32
+ uri = URI(load_style_file)
33
+ file = open(uri)
34
+ content = file.read
35
+ file.close
36
+
37
+ @context[:document].add_inline_style(content)
38
+ end
39
+
40
+ def style_file_remote
41
+ uri = URI(load_style_file)
42
+ file = open(uri)
43
+ asset_path = @pairs.fetch("output") { uri_path(uri) }
44
+ output_path = output_styles_path / asset_path
45
+ output_path.dirname.mkpath
46
+ link_path = output_path.relative_path_from(@context.configure.output)
47
+ output = output_path.open("wb")
48
+ ::IO.copy_stream(file, output)
49
+ [file, output].each(&:close)
50
+
51
+ @context[:document].add_linked_style(link_path)
52
+ end
53
+
54
+ def style_inline
55
+ @context[:document].add_inline_style(@body.flatten)
56
+ end
57
+
58
+ def style_file
59
+ paths = load_file_paths
60
+ paths[:out].dirname.mkpath
61
+ src, dest = paths[:file].open("rb"), paths[:out].open("wb")
62
+ ::IO.copy_stream(src, dest)
63
+ [src, dest].each(&:close)
64
+
65
+ @context[:document].add_linked_style(paths[:src])
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end