jekyll-asciidoc 2.0.0 → 2.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (94) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.adoc +91 -0
  3. data/Gemfile +10 -0
  4. data/README.adoc +27 -16
  5. data/jekyll-asciidoc.gemspec +31 -0
  6. data/lib/jekyll-asciidoc/compat.rb +7 -2
  7. data/lib/jekyll-asciidoc/converter.rb +61 -9
  8. data/lib/jekyll-asciidoc/filters.rb +1 -1
  9. data/lib/jekyll-asciidoc/integrator.rb +45 -20
  10. data/lib/jekyll-asciidoc/utils.rb +2 -74
  11. data/lib/jekyll-asciidoc/version.rb +1 -1
  12. data/spec/fixtures/alternate_page_attribute_prefix/_config.yml +4 -0
  13. data/spec/fixtures/alternate_page_attribute_prefix/_layouts/default.html +12 -0
  14. data/spec/fixtures/alternate_page_attribute_prefix/explicit-permalink.adoc +4 -0
  15. data/spec/fixtures/attributes_as_array/_config.yml +7 -0
  16. data/spec/fixtures/attributes_as_hash/_config.yml +7 -0
  17. data/spec/fixtures/basic_site/_config.yml +2 -0
  18. data/spec/fixtures/basic_site/_layouts/custom.html +15 -0
  19. data/spec/fixtures/basic_site/_layouts/page.html +15 -0
  20. data/spec/fixtures/basic_site/auto-layout.adoc +4 -0
  21. data/spec/fixtures/basic_site/bare-header.adoc +4 -0
  22. data/spec/fixtures/basic_site/custom-layout.adoc +4 -0
  23. data/spec/fixtures/basic_site/empty-layout.adoc +4 -0
  24. data/spec/fixtures/basic_site/empty-page-attribute.adoc +4 -0
  25. data/spec/fixtures/basic_site/liquid-enabled.adoc +6 -0
  26. data/spec/fixtures/basic_site/nil-layout.adoc +4 -0
  27. data/spec/fixtures/basic_site/no-doctitle.adoc +2 -0
  28. data/spec/fixtures/basic_site/no-liquid.adoc +3 -0
  29. data/spec/fixtures/basic_site/not-published.adoc +4 -0
  30. data/spec/fixtures/basic_site/standalone-a.adoc +4 -0
  31. data/spec/fixtures/basic_site/standalone-b.adoc +4 -0
  32. data/spec/fixtures/basic_site/subdir/page-in-subdir.adoc +7 -0
  33. data/spec/fixtures/basic_site/with-front-matter-header.adoc +6 -0
  34. data/spec/fixtures/basic_site/without-front-matter-header.adoc +3 -0
  35. data/spec/fixtures/blank_page_attribute_prefix/_config.yml +4 -0
  36. data/spec/fixtures/blank_page_attribute_prefix/_layouts/default.html +12 -0
  37. data/spec/fixtures/blank_page_attribute_prefix/explicit-permalink.adoc +4 -0
  38. data/spec/fixtures/default_config/_config.yml +2 -0
  39. data/spec/fixtures/explicit_site_time/_config.yml +4 -0
  40. data/spec/fixtures/explicit_site_time/_layouts/default.html +12 -0
  41. data/spec/fixtures/explicit_site_time/home.adoc +3 -0
  42. data/spec/fixtures/fallback_to_default_layout/_blueprints/blueprint.adoc +3 -0
  43. data/spec/fixtures/fallback_to_default_layout/_config.yml +5 -0
  44. data/spec/fixtures/fallback_to_default_layout/_layouts/default.html +15 -0
  45. data/spec/fixtures/fallback_to_default_layout/_posts/2016-01-01-post.adoc +4 -0
  46. data/spec/fixtures/fallback_to_default_layout/home.adoc +3 -0
  47. data/spec/fixtures/hybrid_config/_config.yml +8 -0
  48. data/spec/fixtures/imagesdir_relative_to_root/_config.yml +5 -0
  49. data/spec/fixtures/include_relative_to_doc/_config.yml +4 -0
  50. data/spec/fixtures/include_relative_to_doc/_layouts/default.html +12 -0
  51. data/spec/fixtures/include_relative_to_doc/about/_people.adoc +2 -0
  52. data/spec/fixtures/include_relative_to_doc/about/index.adoc +13 -0
  53. data/spec/fixtures/include_relative_to_source/_config.yml +4 -0
  54. data/spec/fixtures/include_relative_to_source/_layouts/default.html +12 -0
  55. data/spec/fixtures/include_relative_to_source/about/_people.adoc +2 -0
  56. data/spec/fixtures/include_relative_to_source/about/index.adoc +13 -0
  57. data/spec/fixtures/legacy_config/_config.yml +5 -0
  58. data/spec/fixtures/pygments_code_highlighting/_config.yml +6 -0
  59. data/spec/fixtures/pygments_code_highlighting/_layouts/page.html +13 -0
  60. data/spec/fixtures/pygments_code_highlighting/page-with-code.adoc +16 -0
  61. data/spec/fixtures/read_error/_config.yml +2 -0
  62. data/spec/fixtures/read_error/unreadable.adoc +3 -0
  63. data/spec/fixtures/require_front_matter_header/_config.yml +4 -0
  64. data/spec/fixtures/require_front_matter_header/_layouts/default.html +12 -0
  65. data/spec/fixtures/require_front_matter_header/with-front-matter-header.adoc +5 -0
  66. data/spec/fixtures/require_front_matter_header/without-front-matter-header.adoc +3 -0
  67. data/spec/fixtures/safe_mode/_config.yml +4 -0
  68. data/spec/fixtures/safe_mode/_layouts/home.html +15 -0
  69. data/spec/fixtures/safe_mode/home.adoc +5 -0
  70. data/spec/fixtures/with_custom_collection/_blueprints/blueprint-a.adoc +4 -0
  71. data/spec/fixtures/with_custom_collection/_blueprints/blueprint-b.adoc +10 -0
  72. data/spec/fixtures/with_custom_collection/_config.yml +7 -0
  73. data/spec/fixtures/with_custom_collection/_layouts/blueprint.html +15 -0
  74. data/spec/fixtures/with_custom_collection/_layouts/default.html +15 -0
  75. data/spec/fixtures/with_posts/_config.yml +2 -0
  76. data/spec/fixtures/with_posts/_drafts/a-draft-post.adoc +5 -0
  77. data/spec/fixtures/with_posts/_layouts/custom.html +15 -0
  78. data/spec/fixtures/with_posts/_layouts/post.html +15 -0
  79. data/spec/fixtures/with_posts/_posts/2016-01-01-welcome.adoc +4 -0
  80. data/spec/fixtures/with_posts/_posts/2016-01-02-empty-layout.adoc +4 -0
  81. data/spec/fixtures/with_posts/_posts/2016-01-03-auto-layout.adoc +4 -0
  82. data/spec/fixtures/with_posts/_posts/2016-01-04-custom-layout.adoc +4 -0
  83. data/spec/fixtures/with_posts/_posts/2016-01-05-nil-layout.adoc +4 -0
  84. data/spec/fixtures/with_posts/_posts/2016-02-01-post-with-categories.adoc +4 -0
  85. data/spec/fixtures/with_posts/_posts/2016-03-01-post-with-excerpt.adoc +4 -0
  86. data/spec/fixtures/with_posts/_posts/2016-04-01-show-me-the-title.adoc +4 -0
  87. data/spec/fixtures/with_posts/_posts/2016-05-31-automatic-title.adoc +1 -0
  88. data/spec/fixtures/with_posts/index.html +22 -0
  89. data/spec/fixtures/xhtml_syntax/_config.yml +6 -0
  90. data/spec/fixtures/xhtml_syntax/home.adoc +5 -0
  91. data/spec/fixtures/xhtml_syntax/images/sunset.jpg +0 -0
  92. data/spec/jekyll-asciidoc_spec.rb +880 -0
  93. data/spec/spec_helper.rb +60 -0
  94. metadata +171 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 48f6d28bbd931f1d823e06625ad68b9314cf8836
4
- data.tar.gz: c59995e13e47e147624ec578d4c42cf5d187953f
3
+ metadata.gz: 5f0880454bf13707df6ab46db960a614e543e1d5
4
+ data.tar.gz: 91f7795b3722073aca1a3ab2c49a0d04f9883033
5
5
  SHA512:
6
- metadata.gz: f97b51d72a92abc00d2bed80fc561ef74bb26e9022be6204af97dca38830f38bf09f54bd18fc99920e4cacbc171f86e0f238a322f7ec291f3aa0cf56752e5dd2
7
- data.tar.gz: e1905e712312e6d108de8f79ad69717477d71f33f62b4baf653ca86f7988f80b203172b8e1027070a5a27b20cd23190a052996cc44a4dce3263480963b0f2551
6
+ metadata.gz: 4e865f7e9ef44ee8b8626b6948fa184d50bfd3bb8d799065e2f89dddbfc3a2a97ab5e54f6b98afe66aee5c3d771fab0a51703cbb92c6f8a10b715ada0c59256e
7
+ data.tar.gz: 8e210f65e121dd1d208e9b7492bf3f3f1af6284e0d433ee1e8c3fe844f3de64d7e27df163b899df347189d5fdb87c6d7dc4ac867c8cc11c483e10b212537844f
@@ -0,0 +1,91 @@
1
+ = {project-name} Changelog
2
+ :project-name: Jekyll AsciiDoc Plugin
3
+ :uri-repo: https://github.com/asciidoctor/jekyll-asciidoc
4
+
5
+ This document provides a high-level view of the changes to the {project-name} by release.
6
+ For a detailed view of what has changed, refer to the {uri-repo}/commits/master[commit history] on GitHub.
7
+
8
+ == 2.0.1 (2016-07-06) - @mojavelinux
9
+
10
+ * align localtime and localdate attributes with site.time and site.timezone (#117)
11
+ * don't register hook callbacks again when regenerating site; use static methods for hook callbacks (#121)
12
+ * bundle CHANGELOG.adoc and test suite in gem
13
+ * minor improvements to README
14
+
15
+ == 2.0.0 (2016-07-02) - @mojavelinux
16
+
17
+ * Split source into multiple files; move all classes under the `Jekyll::AsciiDoc` module
18
+ * Avoid redundant initialization caused by the jekyll-watch plugin
19
+ * Set docdir, docfile, docname, outfile, outdir, and outpath attributes for each file if using Jekyll 3 (#59)
20
+ - docdir is only set if value of `base_dir` option is `:docdir`
21
+ - setting outdir allows proper integration with Asciidoctor Diagram
22
+ * Automatically set `imagesoutdir` attribute if `imagesdir` attribute is relative to root
23
+ * Pass site information (root, source, destination, baseurl and url) through as AsciiDoc attributes
24
+ * Automatically generate stylesheet for Pygments (#30)
25
+ * Change default layout to match collection label (#104)
26
+ - page for pages, post for posts, collection label for all others; use default layout as fallback
27
+ * Resolve attribute references in attribute values defined in config (#103)
28
+ * Apply AsciiDoc header integration to documents in all collections (#93)
29
+ * Document how to create and enable templates to customize the HTML that Asciidoctor generates (#73)
30
+ * Allow `base_dir` option to track document directory by setting the value to `:docdir` (#80)
31
+ * Add a comprehensive test suite (#77)
32
+ * Allow site-wide Asciidoctor attributes to be specified as a Hash; convert to Hash if Array is used (#87)
33
+ * Interpret page attribute values as YAML data
34
+ * Use Jekyll.logger to write log messages (#85)
35
+ * Add topic to all log messages
36
+ * Restructure configuration keys so all general settings are under the `asciidoc` key (#82)
37
+ * Don't enable `hardbreaks` attribute by default (#69)
38
+ * Bump minimum version of Jekyll to 2.3.0 and document requirement in README (#76)
39
+ * Allow layout to be disabled to create standalone document; add and document additional option values for layout (#63)
40
+ * Make front matter header optional (#57)
41
+ * Apply site-wide Asciidoctor configuration (options/attributes) when loading document header (#67)
42
+ * Disable liquid processor on AsciiDoc files by default; enable using liquid page variable (#65)
43
+ * Resolve empty page attribute value as empty string (#70)
44
+ * Soft assign linkattrs attribute
45
+ * Allow plugin to work in safe mode (#112)
46
+ * Major restructure and rewrite of README
47
+ * Document how to use plugin with GitLab Pages (#47)
48
+ * Document asciidocify filter
49
+
50
+ {uri-repo}/issues?q=milestone%3Av2.0.0[issues resolved] |
51
+ {uri-repo}/releases/tag/v2.0.0[git tag]
52
+
53
+ == 1.1.2 (2016-05-10) - @mkobit
54
+
55
+ * Apply fix for documents that did not contain at least one attribute beginning with `page-` (#60)
56
+
57
+ {uri-repo}/issues?q=milestone%3Av1.1.2[issues resolved] |
58
+ {uri-repo}/releases/tag/v1.1.2[git tag]
59
+
60
+ == 1.1.1 (2016-05-07) - @mkobit
61
+
62
+ * The AsciiDoc document title overrides the title set in the front matter or the auto-generated title (in the case of a post) (#48)
63
+ * The AsciiDoc page-related attributes override the matching entries in the page data (i.e., front matter)
64
+ * The value of page-related attributes are treated as YAML values (automatic type coercion)
65
+ * `page-` is the default prefix for page-related AsciiDoc attributes (e.g., `page-layout`) (#51)
66
+ * The key to configure the page attribute prefix is `asciidoc_page_attribute_prefix`; the value should not contain the trailing hyphen (#51)
67
+ * The date of a post can be set using the `revdate` AsciiDoc attribute (#53)
68
+ * Only configure the Asciidoctor options once (previously it was being called twice in serve mode)
69
+ * Set `env` attribute to `site` instead of `jekyll` (#55)
70
+
71
+ {uri-repo}/issues?q=milestone%3Av1.1.1[issues resolved] |
72
+ {uri-repo}/releases/tag/v1.1.1[git tag]
73
+
74
+ == 1.0.1 (2016-03-19) - @mkobit
75
+
76
+ Enables use with Jekyll 3.
77
+ It is still compatible with Jekyll 2.
78
+
79
+ * Jekyll 3 support (#36, #33)
80
+ * Documentation and onboarding improvements (#25, #24)
81
+ * Improvements to release process (#28)
82
+
83
+ {uri-repo}/issues?q=milestone%3Av1.0.1[issues resolved] |
84
+ {uri-repo}/releases/tag/v1.0.1[git tag]
85
+
86
+ == 1.0.0 (2015-01-04) - @paulrayner
87
+
88
+ Initial release.
89
+
90
+ {uri-repo}/issues?q=milestone%3Av1.0.0[issues resolved] |
91
+ {uri-repo}/releases/tag/v1.0.0[git tag]
data/Gemfile ADDED
@@ -0,0 +1,10 @@
1
+ source 'https://rubygems.org'
2
+ gemspec
3
+
4
+ gem 'jekyll', %(~> #{ENV['JEKYLL_VERSION']}) if ENV.key? 'JEKYLL_VERSION'
5
+
6
+ if RUBY_ENGINE == 'jruby'
7
+ gem 'pygments.rb', github: 'mojavelinux/pygments.rb', branch: 'support-jruby'
8
+ else
9
+ gem 'pygments.rb', '~> 0.6.3'
10
+ end
@@ -1,6 +1,6 @@
1
1
  = Jekyll AsciiDoc Plugin (powered by Asciidoctor)
2
2
  Dan Allen <https://github.com/mojavelinux[@mojavelinux]>; Paul Rayner <https://github.com/paulrayner[@paulrayner]>
3
- v2.0.0, 2016-07-02
3
+ v2.0.1, 2016-07-06
4
4
  // Settings:
5
5
  :idprefix:
6
6
  :idseparator: -
@@ -206,11 +206,15 @@ You can now build your site using:
206
206
 
207
207
  $ jekyll build
208
208
 
209
- and preview it using:
209
+ or preview it using:
210
210
 
211
211
  $ jekyll serve
212
212
 
213
- If you're using Bundler, then prefix the commands with `bundle exec`, as in:
213
+ You can continuously build without preview using:
214
+
215
+ $ jekyll build --watch
216
+
217
+ If you're using Bundler, prefix the commands with `bundle exec`, as in:
214
218
 
215
219
  $ bundle exec jekyll build
216
220
 
@@ -439,7 +443,7 @@ Each template file corresponds to a node in the AsciiDoc document tree (aka AST)
439
443
 
440
444
  Below are the steps you need to take to configure Asciidoctor to use custom templates with your site.
441
445
 
442
- === Step 1: Add Required Gems
446
+ === Step {counter:step}: Add Required Gems
443
447
 
444
448
  You'll first need to add the thread_safe gem as well as the gem for the templating language you plan to use.
445
449
  We'll assume that you are using Slim.
@@ -450,19 +454,19 @@ gem 'slim', '~> 3.0.7'
450
454
  gem 'thread_safe', '~> 0.3.5'
451
455
  ----
452
456
 
453
- === Step 2: Install New Gems
457
+ === Step {counter:step}: Install New Gems
454
458
 
455
459
  Now run the `bundle` command to install the new gems.
456
460
 
457
461
  $ bundle
458
462
 
459
- === Step 3: Create a Templates Folder
463
+ === Step {counter:step}: Create a Templates Folder
460
464
 
461
465
  Next, create a new folder in your site named [path]__templates_ to store your templates.
462
466
 
463
467
  $ mkdir _templates
464
468
 
465
- === Step 4: Configure Asciidoctor to Load Templates
469
+ === Step {counter:step}: Configure Asciidoctor to Load Templates
466
470
 
467
471
  In your site's {path-config} file, configure Asciidoctor to load the templates by telling it the location where the templates are stored.
468
472
 
@@ -473,7 +477,7 @@ asciidoctor:
473
477
  attributes: ...
474
478
  ----
475
479
 
476
- === Step 5: Compose a Template
480
+ === Step {counter:step}: Compose a Template
477
481
 
478
482
  The final step is to compose a template.
479
483
  We'll be customizing the unordered list node.
@@ -805,15 +809,20 @@ GitHub doesn't (yet) whitelist the AsciiDoc plugin, so you must run Jekyll eithe
805
809
  GitHub needs to hear from enough users that need this plugin to persuade them to enable it.
806
810
  Our recommendation is to https://github.com/contact[contact support] and keep asking for it.
807
811
 
808
- Refer to the help page https://help.github.com/articles/adding-jekyll-plugins-to-a-github-pages-site/[Adding Jekyll Plugins to a GitHub Pages site] for a list of plugins currently supported on GitHub Pages.
812
+ Refer to the help page https://help.github.com/articles/adding-jekyll-plugins-to-a-github-pages-site[Adding Jekyll Plugins to a GitHub Pages site] for a list of plugins currently supported on GitHub Pages.
809
813
  ====
810
814
 
811
- You can automate publishing of the generated site to GitHub Pages using a continuous integration job.
812
- Refer to the tutorial http://eshepelyuk.github.io/2014/10/28/automate-github-pages-travisci.html[Automate GitHub Pages publishing with Jekyll and Travis CI^] to find step-by-step instructions to setup this job.
813
- You can also refer to the https://github.com/johncarl81/transfuse-site[Tranfuse website build^] for an example in practice.
815
+ _But don't despair!_
816
+ You can still automate publishing of the generated site to GitHub Pages using a continuous integration job.
817
+ Refer to the http://eshepelyuk.github.io/2014/10/28/automate-github-pages-travisci.html[Automate GitHub Pages publishing with Jekyll and Travis CI^] tutorial to find step-by-step instructions.
818
+ You can also refer to the https://github.com/johncarl81/transfuse-site[Transfuse website build^] for an example in practice.
814
819
 
815
- TIP: If you want to take a shortcut that skips all the steps in the tutorial, clone the {uri-jaq}[Jekyll AsciiDoc Quickstart (JAQ)] repository and use it as a starting point for your site.
816
- JAQ provides a page layout out of the box configured to fully style body content generated from AsciiDoc.
820
+ TIP: When using this setup, don't forget to add the [path]_.nojekyll_ file to the root of the source to tell GitLab Pages not to waste time running Jekyll again on the server.
821
+
822
+ === Jekyll AsciiDoc Quickstart
823
+
824
+ If you want to take a shortcut that skips all the steps in the previously mentioned tutorial, clone the {uri-jaq}[Jekyll AsciiDoc Quickstart (JAQ)] repository and use it as a starting point for your site.
825
+ JAQ includes a Rake build that is preconfigured to deploy to GitHub Pages from Travis CI and also provides a theme (page layout and CSS) that properly styles body content generated from AsciiDoc.
817
826
 
818
827
  == Using this Plugin on GitLab Pages
819
828
 
@@ -1006,8 +1015,10 @@ The coding style is as follows:
1006
1015
  if key.start_with? '!'
1007
1016
  ...
1008
1017
  end
1009
- +
1010
- asciidoctor_config.replace Utils.symbolize_keys asciidoctor_config
1018
+
1019
+ * For chained method calls, wrap parentheses around nested method call.
1020
+
1021
+ asciidoctor_config.replace (Utils.symbolize_keys asciidoctor_config)
1011
1022
 
1012
1023
  * Use parentheses outside of a method call when parentheses are required.
1013
1024
 
@@ -0,0 +1,31 @@
1
+ require File.expand_path '../lib/jekyll-asciidoc/version', __FILE__
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = 'jekyll-asciidoc'
5
+ s.version = Jekyll::AsciiDoc::VERSION
6
+ s.summary = 'A Jekyll plugin that converts AsciiDoc source files in your site to HTML pages using Asciidoctor.'
7
+ s.description = 'A Jekyll plugin that converts AsciiDoc source files in your site to HTML pages using Asciidoctor.'
8
+ s.authors = ['Dan Allen', 'Paul Rayner']
9
+ s.email = ['dan.j.allen@gmail.com']
10
+ s.homepage = 'https://github.com/asciidoctor/jekyll-asciidoc'
11
+ s.license = 'MIT'
12
+
13
+ files = begin
14
+ output = IO.popen('git ls-files -z', err: File::NULL) {|io| io.read }.split %(\0)
15
+ $?.success? ? output : Dir['**/*']
16
+ rescue
17
+ Dir['**/*']
18
+ end
19
+ s.files = files.grep /^(?:lib\/.+|Gemfile|Rakefile|(CHANGELOG|LICENSE|README)\.adoc|#{s.name}\.gemspec)$/
20
+ s.test_files = files.grep /^spec\//
21
+
22
+ s.require_paths = ['lib']
23
+
24
+ s.add_runtime_dependency 'asciidoctor', '>= 1.5.0'
25
+ s.add_runtime_dependency 'jekyll', '>= 2.3.0'
26
+
27
+ s.add_development_dependency 'rake'
28
+ s.add_development_dependency 'rspec', '~> 3.5.0'
29
+ # enable pygments.rb dependency here once https://github.com/tmm1/pygments.rb/pull/162 is merged & released
30
+ #s.add_development_dependency 'pygments.rb', '~> 0.6.3'
31
+ end
@@ -7,8 +7,13 @@ end
7
7
  module Jekyll
8
8
  class Site
9
9
  # Backport {::Jekyll::Site#find_converter_instance} to Jekyll 2.
10
- def find_converter_instance klass
11
- @converters.find {|candidate| klass === candidate } || raise(%(No Converters found for #{klass}))
10
+ def find_converter_instance type
11
+ converters.find {|candidate| type === candidate } || (raise %(No Converters found for #{type}))
12
12
  end unless respond_to? :find_converter_instance
13
+
14
+ # Introduce complement to {::Jekyll::Site#find_converter_instance} for generators.
15
+ def find_generator_instance type
16
+ generators.find {|candidate| type === candidate } || (raise %(No Generators found for #{type}))
17
+ end unless respond_to? :find_generator_instance
13
18
  end
14
19
  end
@@ -17,13 +17,14 @@ module Jekyll
17
17
  'builder-jekyll' => '',
18
18
  'jekyll-version' => ::Jekyll::VERSION
19
19
  }
20
- MessageTopic = 'Jekyll AsciiDoc:'
21
- StandaloneOptionLine = Utils::StandaloneOptionLine
20
+ MessageTopic = Utils::MessageTopic
21
+ NewLine = Utils::NewLine
22
+ StandaloneOptionLine = %([%standalone]#{NewLine})
22
23
 
23
- HeaderBoundaryRx = /(?<=\p{Graph})#{Utils::NewLine * 2}/
24
+ AttributeReferenceRx = /\\?\{(\w+(?:[\-]\w+)*)\}/
25
+ HeaderBoundaryRx = /(?<=\p{Graph})#{NewLine * 2}/
24
26
 
25
- # Enable plugin when running in safe mode
26
- # jekyll-asciidoc gem must also be declared in whitelist
27
+ # Enable plugin when running in safe mode; jekyll-asciidoc gem must also be declared in whitelist
27
28
  safe true
28
29
 
29
30
  # highlighter prefix/suffix not used by this plugin; defined only to avoid warning
@@ -75,7 +76,7 @@ module Jekyll
75
76
  if (@asciidoc_config = asciidoc_config)['processor'] == 'asciidoctor'
76
77
  unless Configured === (@asciidoctor_config = (config['asciidoctor'] ||= {}))
77
78
  asciidoctor_config = @asciidoctor_config
78
- asciidoctor_config.replace Utils.symbolize_keys asciidoctor_config
79
+ asciidoctor_config.replace (symbolize_keys asciidoctor_config)
79
80
  source = ::File.expand_path config['source']
80
81
  dest = ::File.expand_path config['destination']
81
82
  case (base = asciidoctor_config[:base_dir])
@@ -99,7 +100,7 @@ module Jekyll
99
100
  'site-baseurl' => config['baseurl'],
100
101
  'site-url' => config['url']
101
102
  }
102
- attrs = asciidoctor_config[:attributes] = Utils.hashify_attributes asciidoctor_config[:attributes],
103
+ attrs = asciidoctor_config[:attributes] = hashify_attributes asciidoctor_config[:attributes],
103
104
  ((site_attributes.merge ImplicitAttributes).merge DefaultAttributes)
104
105
  if (imagesdir = attrs['imagesdir']) && !(attrs.key? 'imagesoutdir') && (imagesdir.start_with? '/')
105
106
  attrs['imagesoutdir'] = ::File.join dest, imagesdir
@@ -129,6 +130,10 @@ module Jekyll
129
130
  self
130
131
  end
131
132
 
133
+ def self.get_instance site
134
+ site.find_converter_instance self
135
+ end
136
+
132
137
  def matches ext
133
138
  ext =~ @asciidoc_config['ext_re']
134
139
  end
@@ -137,12 +142,20 @@ module Jekyll
137
142
  '.html'
138
143
  end
139
144
 
145
+ def self.before_render document, payload
146
+ (get_instance document.site).before_render document, payload if Document === document
147
+ end
148
+
149
+ def self.after_render document
150
+ (get_instance document.site).after_render document if Document === document
151
+ end
152
+
140
153
  def before_render document, payload
141
- record_path_info document if Document === document
154
+ record_path_info document
142
155
  end
143
156
 
144
157
  def after_render document
145
- clear_path_info if Document === document
158
+ clear_path_info
146
159
  end
147
160
 
148
161
  def record_path_info document, opts = {}
@@ -213,6 +226,45 @@ module Jekyll
213
226
  content
214
227
  end
215
228
  end
229
+
230
+ private
231
+
232
+ def symbolize_keys hash
233
+ hash.each_with_object({}) {|(key, val), accum| accum[key.to_sym] = val }
234
+ end
235
+
236
+ def hashify_attributes attrs, initial = {}
237
+ if (is_array = ::Array === attrs) || ::Hash === attrs
238
+ attrs.each_with_object(initial) {|entry, new_attrs|
239
+ key, val = is_array ? ((entry.split '=', 2) + ['', ''])[0..1] : entry
240
+ if key.start_with? '!'
241
+ new_attrs[key[1..-1]] = nil
242
+ elsif key.end_with? '!'
243
+ new_attrs[key.chop] = nil
244
+ else
245
+ new_attrs[key] = val ? (resolve_attribute_refs val, new_attrs) : nil
246
+ end
247
+ }
248
+ else
249
+ initial
250
+ end
251
+ end
252
+
253
+ def resolve_attribute_refs text, attrs
254
+ if text.empty?
255
+ text
256
+ elsif text.include? '{'
257
+ text.gsub(AttributeReferenceRx) { ((m = $&).start_with? '\\') ? m[1..-1] : (attrs.fetch $1, m) }
258
+ else
259
+ text
260
+ end
261
+ end
262
+
263
+ # Register pre and post render callbacks for saving and clearing contextual AsciiDoc attributes, respectively.
264
+ ::Jekyll::Hooks.tap do |hooks|
265
+ hooks.register [:pages, :documents], :pre_render, &(method :before_render)
266
+ hooks.register [:pages, :documents], :post_render, &(method :after_render)
267
+ end if defined? ::Jekyll::Hooks
216
268
  end
217
269
  end
218
270
  end
@@ -8,7 +8,7 @@ module Jekyll
8
8
  #
9
9
  # Returns the HTML formatted String.
10
10
  def asciidocify input, doctype = nil
11
- (@context.registers[:cached_asciidoc_converter] ||= (Utils.get_converter @context.registers[:site]))
11
+ (@context.registers[:cached_asciidoc_converter] ||= (Converter.get_instance @context.registers[:site]))
12
12
  .convert(doctype ? %(:doctype: #{doctype}#{Utils::NewLine}#{input}) : (input || ''))
13
13
  end
14
14
  end
@@ -1,27 +1,23 @@
1
1
  module Jekyll
2
2
  module AsciiDoc
3
- # Registers before and after render hooks to set contextual attributes,
4
- # promotes eligible AsciiDoc attributes to page variables, and applies
5
- # certain page-level settings.
3
+ # Promotes eligible AsciiDoc attributes to page variables and applies page-level settings to all documents handled
4
+ # by the converter included with this plugin. It also copies the custom Pygments stylesheet if Pygments is the
5
+ # source highlighter and configured to use class-based styling.
6
6
  class Integrator < ::Jekyll::Generator
7
7
  NewLine = Utils::NewLine
8
- StandaloneOptionLine = Utils::StandaloneOptionLine
8
+ StandaloneOptionLine = Converter::StandaloneOptionLine
9
9
 
10
- # Enable plugin when running in safe mode
11
- # jekyll-asciidoc gem must also be declared in whitelist
10
+ # Enable plugin when running in safe mode; jekyll-asciidoc gem must also be declared in whitelist
12
11
  safe true
13
12
 
13
+ def self.get_instance site
14
+ site.find_generator_instance self
15
+ end
16
+
17
+ # This method is triggered each time the site is generated, including after any file has changed when
18
+ # running in watch mode (regardless of incremental setting).
14
19
  def generate site
15
- @converter = converter = (Utils.get_converter site).setup
16
-
17
- if defined? ::Jekyll::Hooks
18
- before_render_callback = converter.method :before_render
19
- after_render_callback = converter.method :after_render
20
- [:pages, :documents].each do |collection_name|
21
- ::Jekyll::Hooks.register collection_name, :pre_render, &before_render_callback
22
- ::Jekyll::Hooks.register collection_name, :post_render, &after_render_callback
23
- end
24
- end
20
+ @converter = converter = (Converter.get_instance site).setup
25
21
 
26
22
  unless (@page_attr_prefix = site.config['asciidoc']['page_attribute_prefix']).empty?
27
23
  @page_attr_prefix = %(#{@page_attr_prefix}-)
@@ -43,8 +39,9 @@ module Jekyll
43
39
  end
44
40
  end
45
41
 
46
- if (attrs = site.config['asciidoctor'][:attributes]) &&
47
- ((attrs['source-highlighter'] || '').chomp '@') == 'pygments' &&
42
+ attrs = site.config['asciidoctor'][:attributes]
43
+ attrs['localdate'], attrs['localtime'] = (site.time.strftime '%Y-%m-%d %H:%M:%S %Z').split ' ', 2
44
+ if ((attrs['source-highlighter'] || '').chomp '@') == 'pygments' &&
48
45
  ((attrs['pygments-css'] || '').chomp '@') != 'style' && (attrs.fetch 'pygments-stylesheet', '')
49
46
  generate_pygments_stylesheet site, attrs
50
47
  end
@@ -72,7 +69,7 @@ module Jekyll
72
69
  unless (adoc_header_data = doc.attributes
73
70
  .each_with_object({}) {|(key, val), accum|
74
71
  if no_prefix || ((key.start_with? @page_attr_prefix) && key = key[prefix_size..-1])
75
- accum[key] = ::String === val ? (Utils.parse_yaml_value val) : val
72
+ accum[key] = ::String === val ? (parse_yaml_value val) : val
76
73
  end
77
74
  }).empty?
78
75
  document.data.update adoc_header_data
@@ -109,11 +106,39 @@ module Jekyll
109
106
  if site.static_files.any? {|f| f.path == css_file }
110
107
  ::IO.write css_file, css unless css == (::IO.read css_file)
111
108
  else
112
- ::Asciidoctor::Helpers.mkdir_p ::File.dirname css_file
109
+ ::Asciidoctor::Helpers.mkdir_p (::File.dirname css_file)
113
110
  ::IO.write css_file, css
114
111
  site.static_files << (::Jekyll::StaticFile.new site, css_base, css_dir, css_name)
115
112
  end
116
113
  end
114
+
115
+ private
116
+
117
+ # Parse the specified value as though it is a single-line value part of a
118
+ # YAML key/value pair.
119
+ #
120
+ # Attempt to parse the specified String value as though it is a
121
+ # single-line value part of a YAML key/value pair. If the value fails to
122
+ # parse, wrap the value in single quotes (after escaping any single
123
+ # quotes in the value) and parse it as a character sequence. If the value
124
+ # is empty, return an empty String.
125
+ #
126
+ # val - The String value to parse.
127
+ #
128
+ # Returns an [Object] parsed from the string-based YAML value or empty
129
+ # [String] if the specified value is empty.
130
+ def parse_yaml_value val
131
+ if val.empty?
132
+ ''
133
+ else
134
+ begin
135
+ ::SafeYAML.load %(--- #{val})
136
+ rescue
137
+ val = val.gsub '\'', '\'\'' if val.include? '\''
138
+ ::SafeYAML.load %(--- \'#{val}\')
139
+ end
140
+ end
141
+ end
117
142
  end
118
143
  end
119
144
  end