brandish 0.1.1

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 (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,18 @@
1
+ # encoding: utf-8
2
+ # frozen_string_literal: true
3
+
4
+ require "brandish/processors/html/group"
5
+ require "brandish/processors/html/header"
6
+ require "brandish/processors/html/markup"
7
+ require "brandish/processors/html/output"
8
+ require "brandish/processors/html/style"
9
+ require "brandish/processors/html/script"
10
+
11
+ module Brandish
12
+ module Processors
13
+ # Processors for generating HTML output. This implements the {Common}
14
+ # processors.
15
+ module HTML
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,33 @@
1
+ # encoding: utf-8
2
+ # frozen_string_literal: true
3
+
4
+ require "hanami/helpers/html_helper"
5
+ require "hanami/helpers/escape_helper"
6
+
7
+ module Brandish
8
+ module Processors
9
+ module HTML
10
+ # A "group." This is used for grouping together elements for styling,
11
+ # like the "div" element in HTML. This uses `div` as one of the
12
+ # element names, but that doesn't mean that it includes all of the same
13
+ # attributes. This accepts the `"class"`, `"id"`, and `"name"` headers.
14
+ #
15
+ # @see Common::Group
16
+ class Group < Common::Group
17
+ include Processor::Block
18
+ include Hanami::Helpers::HtmlHelper
19
+ include Hanami::Helpers::EscapeHelper
20
+ register %i(html group) => self
21
+ self.names = %i(group g div)
22
+
23
+ # Creates a div element with the proper class and id values. This
24
+ # currently ignores the name value.
25
+ #
26
+ # @return [::String]
27
+ def perform
28
+ html.div(raw(accepted_body), class: class_value, id: id_value).to_s
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,46 @@
1
+ # encoding: utf-8
2
+ # frozen_string_literal: true
3
+
4
+ require "hanami/helpers/html_helper"
5
+
6
+ module Brandish
7
+ module Processors
8
+ module HTML
9
+ # A processor that defines the `header` command. This creates a list
10
+ # internally of all of the headers in the document, to later be used to
11
+ # possibly create a table of contents, if needed.
12
+ #
13
+ # This takes no options.
14
+ #
15
+ # Pairs:
16
+ #
17
+ # - `"level"` - Optional. Defaults to `1`. The "level" of the header.
18
+ # This should be a value between 1 and 6.
19
+ # - `"value"` - Required. The name of the header.
20
+ # - `"id"` - Optional. The ID of the header. This is a unique value
21
+ # to reference to this header. If no value is given, it defaults
22
+ # to a modified `"value"`.
23
+ # - `"class"` - Optional. The class name of the header.
24
+ class Header < Processors::Common::Header
25
+ include Hanami::Helpers::HtmlHelper
26
+ register %i(html header) => self
27
+ pair :class
28
+
29
+ # The tags to use for each header level. This is just `h1` through
30
+ # `h6`.
31
+ #
32
+ # @return [::Symbol]
33
+ TAGS = %i(h1 h2 h3 h4 h5 h6).freeze
34
+
35
+ # Renders the proper HTML tag for the header, including the proper
36
+ # id, and an optional class value from the pairs.
37
+ #
38
+ # @return [::String]
39
+ def header_render
40
+ html.tag(TAGS.fetch(header_level - 1), header_value, id: header_id,
41
+ class: @pairs.fetch("class", "")).to_s
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,131 @@
1
+ # encoding: utf-8
2
+ # frozen_string_literal: true
3
+
4
+ require "hanami/helpers/escape_helper"
5
+
6
+ module Brandish
7
+ module Processors
8
+ module HTML
9
+ # Markup support for the HTML format. For more information, and available
10
+ # options, see the {Processors::Common::Markup} processor.
11
+ #
12
+ # This markup processor provides the following engines:
13
+ #
14
+ # - `:kramdown` - A Markdown formatter. More information on this
15
+ # markup format can be found at <https://github.com/gettalong/kramdown>.
16
+ # Available options are: `:template`, `:auto_ids` (not recommended),
17
+ # `:auto_id_stripping` (not recommended), `:auto_id_prefix` (not
18
+ # recommended), `:parse_block_html`, `:parse_span_html`,
19
+ # `:html_to_native`, `:link_defs`, `:footnote_nr`, `:enable_coderay`,
20
+ # `:coderay_wrap`, `:coderay_line_numbers`,
21
+ # `:coderay_line_number_start`, `:coderay_tab_width`,
22
+ # `:coderay_bold_every`, `:coderay_css`, `:coderay_default_lang`,
23
+ # `:entity_output`, `:toc_levels` (not recommended), `:line_width`,
24
+ # `:latex_headers` (does nothing), `:smart_quotes`,
25
+ # `:remove_block_html_tags`, `:remove_span_html_tags`,
26
+ # `:header_offset`, `:hard_wrap`, `:syntax_highlighter`,
27
+ # `:syntax_highlighter_opts`, `:math_engine`, `:math_engine_opts`,
28
+ # `:footnote_backlink`, and `:gfm_quirks`. Requires the kramdown
29
+ # gem.
30
+ # - `:rdiscount` - A Markdown formatter. More information on this
31
+ # markup format can be found at <https://github.com/davidfstr/rdiscount>.
32
+ # The options for this engine are specified in an array, not a
33
+ # hash. Available options are: `:smart`, `:filter_styles`,
34
+ # `:filter_html`, `:fold_lines`, `:footnotes`, `:generate_toc` (not
35
+ # recommended), `:no_image`, `:no_links`, `:no_tables`, `:strict`,
36
+ # `:autolink`, `:safelink`, `:no_pseudo_protocals`, `:no_superscript`,
37
+ # and `:no_strikethrough`. Requires the rdiscount gem.
38
+ # - `:minidown` - A Markdown formatter. More information on this
39
+ # markup format can be found at <https://github.com/jjyr/minidown>.
40
+ # Available options are: `:code_block_handler`.
41
+ # - `:redcloth` - A Textile formatter. More information on this
42
+ # markup format can be found at <https://github.com/jgarber/redcloth>.
43
+ # Available options are: `:filter_html`, `:sanitize_html`,
44
+ # `:filter_styles`, `:filter_classes`, `:filter_ids`,
45
+ # `:hard_breaks` (deprecated, default), `:lite_mode`,
46
+ # and `:no_span_caps`.
47
+ # - `:redcarpet` - A Markdown formatter. More information on this
48
+ # markup format can be found at <https://github.com/vmg/redcarpet>.
49
+ # This is the preferred format for Brandish due to its integration.
50
+ # The options that are valid for this formatter can be found on
51
+ # {Brandish::Markup::Redcarpet::Format}.
52
+ # - `:creole` - A creole formatter. More information on this markup
53
+ # format can be found at <https://github.com/larsch/creole>.
54
+ # Available options are: `:allowed_schemes`, `:extensions`,
55
+ # and `:no_escape`.
56
+ # - `:sanitize` - A sanitizer, to remove non-whitelisted elements.
57
+ # More information on this can be found at <https://github.com/rgrove/sanitize>.
58
+ # The option can be a symbol or a hash; the hash is passed directly
59
+ # to sanitize. The symbol is mapped to one of the corresponding
60
+ # default configs. Symbol values are: `:restricted`, `:basic`,
61
+ # `:relaxed`, and `:basic`.
62
+ # - `:escape` - Escapes the content to prevent conflict with the
63
+ # resulting format.
64
+ #
65
+ # @note
66
+ # This class provides the `html:markup` processor.
67
+ class Markup < Processors::Common::Markup
68
+ include Hanami::Helpers::EscapeHelper
69
+ register %i(html markup) => self
70
+
71
+ engine(:kramdown, {}, nil, :markup_kramdown)
72
+ engine(:rdiscount, [:smart], nil, :markup_rdiscount)
73
+ engine(:minidown, {}, :initialize_minidown, :markup_minidown)
74
+ engine(:redcloth, [], nil, :markup_redcloth)
75
+ engine(:redcarpet, {}, :initialize_redcarpet, :markup_redcarpet)
76
+ engine(:creole, { extensions: true }, nil, :markup_creole)
77
+ engine(:sanitize, :relaxed, nil, :markup_sanitize)
78
+ engine(:escape, nil, nil, :markup_escape)
79
+
80
+ private
81
+
82
+ def markup_kramdown(value, options)
83
+ Kramdown::Document.new(value, options).to_html
84
+ end
85
+
86
+ def markup_rdiscount(value, options)
87
+ ::RDiscount.new(value, *options).to_html
88
+ end
89
+
90
+ def initialize_minidown
91
+ @parser = ::Minidown::Parser.new(engine_options)
92
+ end
93
+
94
+ def markup_minidown(value, _)
95
+ @parser.render(value)
96
+ end
97
+
98
+ def markup_redcloth(value, options)
99
+ ::RedCloth.new(value, options).to_html
100
+ end
101
+
102
+ def initialize_redcarpet
103
+ data = engine_options.merge(format: :html, context: @context)
104
+ @format = ::Brandish::Markup::Redcarpet::Format.new(data)
105
+ end
106
+
107
+ def markup_redcarpet(value, _options)
108
+ @format.render(value)
109
+ end
110
+
111
+ def markup_creole(value, options)
112
+ ::Creole::Parser.new(value, options).to_html
113
+ end
114
+
115
+ def initialize_sanitize
116
+ return unless engine_options.is_a?(::Symbol)
117
+ @_engine_options =
118
+ ::Sanitize::Config.const_get(engine_options.to_s.upcase)
119
+ end
120
+
121
+ def markup_sanitize(value, options)
122
+ ::Sanitize.fragment(value, options)
123
+ end
124
+
125
+ def markup_escape(value, _options)
126
+ h(value)
127
+ end
128
+ end
129
+ end
130
+ end
131
+ end
@@ -0,0 +1,62 @@
1
+ # encoding: utf-8
2
+ # frozen_string_literal: true
3
+
4
+ require "mustache"
5
+ require "brandish/processors/html/output/document"
6
+
7
+ module Brandish
8
+ module Processors
9
+ module HTML
10
+ # Outputs the result of processing the document. Without this processor,
11
+ # the document is not output, and most other processors have no effect.
12
+ #
13
+ # Options:
14
+ #
15
+ # - `:template` - Optional. The name of the template to use. This
16
+ # defaults to the format used.
17
+ # - `:path` - Optional. The full path, including the file name,
18
+ # to output the file. This overwrites `:directory` and `:file`.
19
+ # Defaults to `:directory`/`:file`.
20
+ # - `:directory` - Optional. The directory to the file to output
21
+ # the file. Overwritten by `:path`. Defaults to the output path
22
+ # of the project.
23
+ # - `:file` - Optional. The name of the file to output to. Overwritten
24
+ # by `:path`. Defaults to the name of the entry file, with the
25
+ # extension substituted by `".html"`.
26
+ #
27
+ # @see Common::Output
28
+ class Output < Common::Output
29
+ register %i(html output) => self
30
+
31
+ # Sets up the output processor. This creates a {Document} and puts
32
+ # it on the `:document` context option.
33
+ #
34
+ # @see Common::Output#setup
35
+ # @return [void]
36
+ def setup
37
+ super
38
+
39
+ @document = @context[:document] = Document.new
40
+ @document.title = @context.configure.root.basename.to_s
41
+ end
42
+
43
+ private
44
+
45
+ def find_path
46
+ @options.fetch(:path) do
47
+ directory = @options.fetch(:directory, ".")
48
+ file = @options.fetch(:file) do
49
+ ::Pathname.new(@context.form.entry).sub_ext(".html")
50
+ end
51
+
52
+ directory.expand_path(@context.configure.output) / file
53
+ end
54
+ end
55
+
56
+ def template_data
57
+ @document.data.merge("content" => @root.flatten)
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,127 @@
1
+ # encoding: utf-8
2
+ # frozen_string_literal: true
3
+
4
+ module Brandish
5
+ module Processors
6
+ module HTML
7
+ class Output < Common::Output
8
+ # A "document." This contains meta information for the document,
9
+ # such as the title, author, description, styles, and scripts that
10
+ # are used to set up the HTML document.
11
+ #
12
+ # @api private
13
+ class Document
14
+ # The title of the document. This is used for the `<title>` tag.
15
+ #
16
+ # @return [::String, nil]
17
+ attr_accessor :title
18
+
19
+ # The author for the document. This is used for a `<meta>` tag.
20
+ #
21
+ # @return [::String, nil]
22
+ attr_accessor :author
23
+
24
+ # The description of the document. This is used for a `<meta>` tag.
25
+ #
26
+ # @return [::String, nil]
27
+ attr_accessor :description
28
+
29
+ # Initialize the document.
30
+ def initialize
31
+ @title = ""
32
+ @author = ""
33
+ @description = ""
34
+ @styles = []
35
+ @scripts = []
36
+ end
37
+
38
+ # Adds a given style with the given type. The type is the kind of
39
+ # style it is; this should be either one of `:inline` or `:linked`.
40
+ #
41
+ # @param type [::Symbol] The style type.
42
+ # @param content [::String] The contents of the style. For an
43
+ # inline style, this is the stylesheet itself; for a linked
44
+ # style, this is the link to the stylesheet.
45
+ # @return [self]
46
+ def add_style(type, content)
47
+ inline = type == :inline
48
+ linked = type == :linked
49
+
50
+ @styles << {
51
+ "inline?" => inline,
52
+ "linked?" => linked,
53
+ "content" => content.to_s
54
+ }
55
+ self
56
+ end
57
+
58
+ # Adds a given script with the given type. The type of the kind of
59
+ # script it is; this should be either one of `:inline` or `:linked`.
60
+ #
61
+ # @param type [::Symbol] The style type.
62
+ # @param content [::String] The contents of the script. For an
63
+ # inline style, this is the script it self; for a linked script,
64
+ # this is the link to the script.
65
+ # @return [self]
66
+ def add_script(type, content)
67
+ inline = type == :inline
68
+ linked = type == :linked
69
+
70
+ @scripts << {
71
+ "inline?" => inline,
72
+ "linked?" => linked,
73
+ "content" => content.to_s
74
+ }
75
+ self
76
+ end
77
+
78
+ # Adds an inline style.
79
+ #
80
+ # @see #add_style
81
+ # @param content [::String] The stylesheet itself.
82
+ # @return (see #add_style)
83
+ def add_inline_style(content)
84
+ add_style(:inline, content)
85
+ end
86
+
87
+ # Adds an linked style.
88
+ #
89
+ # @see #add_style
90
+ # @param content [::String] The link to the stylesheet.
91
+ # @return (see #add_style)
92
+ def add_linked_style(content)
93
+ add_style(:linked, URI.escape(content.to_s))
94
+ end
95
+
96
+ # Adds an inline script.
97
+ #
98
+ # @see #add_script
99
+ # @param content [::String] The script itself.
100
+ # @return (see #add_script)
101
+ def add_inline_script(content)
102
+ add_script(:inline, content)
103
+ end
104
+
105
+ # Adds an linked script.
106
+ #
107
+ # @see #add_script
108
+ # @param content [::String] The link to the script.
109
+ # @return (see #add_script)
110
+ def add_linked_script(content)
111
+ add_script(:linked, URI.escape(content.to_s))
112
+ end
113
+
114
+ # The data from this document. This is used to pass all of the
115
+ # proper information to the templating library.
116
+ #
117
+ # @return [::Object]
118
+ def data
119
+ { "title" => @title, "author" => @author,
120
+ "description" => @description,
121
+ "styles" => @styles, "scripts" => @scripts }.freeze
122
+ end
123
+ end
124
+ end
125
+ end
126
+ end
127
+ end
@@ -0,0 +1,64 @@
1
+ # encoding: utf-8
2
+ # frozen_string_literal: true
3
+
4
+ require "brandish/processors/html/script/babel"
5
+ require "brandish/processors/html/script/coffee"
6
+ require "brandish/processors/html/script/vanilla"
7
+
8
+ module Brandish
9
+ module Processors
10
+ module HTML
11
+ # A script asset. This is a JavaScript asset.
12
+ #
13
+ # Engines:
14
+ #
15
+ # - `"babel"`, `"babel-file"` - A command. This takes the contents
16
+ # of the resolved file, transpiles it, and outputs it into
17
+ # the output path, given by `#load_file_paths`.
18
+ # - `"babel-inline"` - A block. Similar to `"babel"`; however, it
19
+ # takes the block, uses {Parser::Node::Root#flatten} on it,
20
+ # transpiles the result, and adds that as an inline script.
21
+ # - `"coffee"`, `"coffee-file"` - A command. This takes the contents
22
+ # of the resolved file, transpiles it, and outputs it into
23
+ # the output path, given by `#load_file_paths`.
24
+ # - `"coffee-inline"` - A block. Similar to `"coffee"`; however, it
25
+ # takes the block, uses {Parser::Node::Root#flatten} on it,
26
+ # transpiles the result, and adds that as an inline script.
27
+ # - `"file"` - A command. Takes a file, and copies it over to the
28
+ # destination, based on the values given in `#load_file_paths`.
29
+ # - `"remote"`, `"remote-file"` - A command. Takes a URI (supports
30
+ # `http`, `https`, and `ftp`), and outputs the directory into the
31
+ # `"output"` pair (or a uri path assumed from the URI).
32
+ # - `"inline"` - A block. This performs {Parser::Node::Root#flatten}
33
+ # on the body, and pushes the result as an inline style.
34
+ # - `"remote-inline"` - A command. Similar to `"remote"`; however,
35
+ # this takes the remote styles as an inline style.
36
+ #
37
+ # Pairs:
38
+ #
39
+ # - `"src"`, `"file"`, `"name"`, or `"link"` - Required. At least one
40
+ # of these options are required. They all perform the same function.
41
+ # This defines the name or path of the asset to add or process.
42
+ # - `"type"` - Required. The type of the asset to process. This defines
43
+ # how the asset is handled.
44
+ class Script < Common::Asset
45
+ register %i(html script) => self
46
+ self.names = %i(script scripting)
47
+
48
+ include Script::Babel
49
+ include Script::Coffee
50
+ include Script::Vanilla
51
+
52
+ # (see Common::Asset::Paths#asset_kind_path)
53
+ def asset_kind_path
54
+ "assets/scripts"
55
+ end
56
+
57
+ # (see Common::Asset::Paths#asset_kind_extension)
58
+ def asset_kind_extension
59
+ ".js"
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end