Class: Jekyll::AsciiDoc::Integrator

Inherits:
Generator
  • Object
show all
Defined in:
lib/jekyll-asciidoc/integrator.rb

Overview

Promotes eligible AsciiDoc attributes to page variables and applies page-level settings to all documents handled by the converter included with this plugin. It also copies the custom Pygments stylesheet if Pygments is the source highlighter and configured to use class-based styling.

Constant Summary collapse

NewLine =
Utils::NewLine
StandaloneOptionLine =
Converter::StandaloneOptionLine

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.get_instance(site) ⇒ Object



13
14
15
# File 'lib/jekyll-asciidoc/integrator.rb', line 13

def self.get_instance site
  site.find_generator_instance self
end

Instance Method Details

#generate(site) ⇒ Object

This method is triggered each time the site is generated, including after any file has changed when running in watch mode (regardless of incremental setting).



19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/jekyll-asciidoc/integrator.rb', line 19

def generate site
  @converter = converter = (Converter.get_instance site).setup

  unless (@page_attr_prefix = site.config['asciidoc']['page_attribute_prefix']).empty?
    @page_attr_prefix = %(#{@page_attr_prefix}-)
  end

  site.pages.select! do |page|
    (converter.matches page.ext) ? (integrate page) : true
  end

  # NOTE posts were migrated to a collection named 'posts' in Jekyll 3
  site.posts.select! do |post|
    (converter.matches post.ext) ? (integrate post, 'posts') : true
  end if site.respond_to? :posts=

  site.collections.each do |name, collection|
    next unless collection.write?
    collection.docs.select! do |doc|
      (converter.matches doc.extname) ? (integrate doc, name) : true
    end
  end

  attrs = site.config['asciidoctor'][:attributes]
  attrs['localdate'], attrs['localtime'] = (site.time.strftime '%Y-%m-%d %H:%M:%S %Z').split ' ', 2
  if ((attrs['source-highlighter'] || '').chomp '@') == 'pygments' &&
      ((attrs['pygments-css'] || '').chomp '@') != 'style' && (attrs.fetch 'pygments-stylesheet', '')
    generate_pygments_stylesheet site, attrs
  end
end

#generate_pygments_stylesheet(site, attrs) ⇒ Object



105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
# File 'lib/jekyll-asciidoc/integrator.rb', line 105

def generate_pygments_stylesheet site, attrs
  css_base = site.source
  unless (css_dir = (attrs['stylesdir'] || '').chomp '@').empty? || (css_dir.start_with? '/')
    css_dir = %(/#{css_dir})
  end
  if (css_name = attrs['pygments-stylesheet']).nil_or_empty?
    css_name = 'asciidoc-pygments.css'
  end
  css_file = ::File.join css_base, css_dir, css_name
  css_style = (attrs['pygments-style'] || 'vs').chomp '@'
  css = ::Asciidoctor::Stylesheets.instance.pygments_stylesheet_data css_style
  # NOTE apply stronger CSS rule for general text color
  css = css.sub '.listingblock .pygments  {', '.listingblock .pygments, .listingblock .pygments code {'
  if site.static_files.any? {|f| f.path == css_file }
    ::IO.write css_file, css unless css == (::IO.read css_file)
  else
    ::Asciidoctor::Helpers.mkdir_p (::File.dirname css_file)
    ::IO.write css_file, css
    site.static_files << (::Jekyll::StaticFile.new site, css_base, css_dir, css_name)
  end
end

#integrate(document, collection_name = nil) ⇒ Object

Integrate the page-related attributes from the AsciiDoc document header into the data Array of the specified Page, Post or Document.

document - the Page, Post or Document instance to integrate. collection_name - the String name of the collection to which this document belongs (optional, default: nil).

Returns a [Boolean] indicating whether the document should be published.



57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# File 'lib/jekyll-asciidoc/integrator.rb', line 57

def integrate document, collection_name = nil
  data = document.data
  document.content = [%(:#{@page_attr_prefix}layout: _auto), document.content] * NewLine unless data.key? 'layout'
  return true unless (doc = @converter.load_header document)

  # NOTE id is already reserved in Jekyll for another purpose, so we'll map id to docid instead
  data['docid'] = doc.id if doc.id
  data['title'] = doc.doctitle if doc.header?
  data['author'] = doc.author if doc.author
  if collection_name == 'posts' && (doc.attr? 'revdate')
    data['date'] = ::Jekyll::Utils.parse_date doc.revdate,
        %(Document '#{document.relative_path}' does not have a valid revdate in the AsciiDoc header.)
    # NOTE Jekyll 2.3 requires date field to be set explicitly
    document.date = data['date'] if document.respond_to? :date=
  end

  no_prefix = (prefix_size = @page_attr_prefix.length) == 0
  unless (adoc_data = doc.attributes.each_with_object({}) {|(key, val), accum|
        if no_prefix || ((key.start_with? @page_attr_prefix) && key = key[prefix_size..-1])
          accum[key] = ::String === val ? (parse_yaml_value val) : val
        end
      }).empty?
    data.update adoc_data
  end

  { 'category' => 'categories', 'tag' => 'tags' }.each do |sole_key, coll_key|
    if (sole_val = data.delete sole_key) &&
        !((coll_val = (data[coll_key] ||= [])).include? sole_val)
      coll_val << sole_val 
    end
  end

  case data['layout']
  when nil
    document.content = %(#{StandaloneOptionLine}#{document.content}) unless data.key? 'layout'
  when '', '_auto'
    layout = collection_name ? (collection_name.chomp 's') : 'page'
    data['layout'] = (document.site.layouts.key? layout) ? layout : 'default'
  when false
    data.delete 'layout'
    document.content = %(#{StandaloneOptionLine}#{document.content})
  end

  document.extend Document
  document.extend NoLiquid unless data['liquid']
  data.fetch 'published', true
end