Class: NoraMark::Document

Inherits:
Object
  • Object
show all
Defined in:
lib/nora_mark/document.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(param = {}) ⇒ Document

Returns a new instance of Document.



90
91
92
93
94
95
96
97
98
99
# File 'lib/nora_mark/document.rb', line 90

def initialize(param = {})
  @param = param
  @result = {}
  @preprocessors = [
    Proc.new { |text| text.gsub(/\r?\n(\r?\n)+/, "\n\n") },
  ]
  @document_name = param[:document_name] || "noramark_#{SecureRandom.uuid}"
  @render_parameter = {}
  @transformers = {}
end

Instance Attribute Details

#document_nameObject

Returns the value of attribute document_name.



5
6
7
# File 'lib/nora_mark/document.rb', line 5

def document_name
  @document_name
end

#rootObject

Returns the value of attribute root.



5
6
7
# File 'lib/nora_mark/document.rb', line 5

def root
  @root
end

Class Method Details

.generatorsObject



8
9
10
# File 'lib/nora_mark/document.rb', line 8

def self.generators
  @generators ||= {}
end

.parse(string_or_io, param = {}) {|instance| ... } ⇒ Object

Yields:

  • (instance)


37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/nora_mark/document.rb', line 37

def self.parse(string_or_io, param = {})
  instance = new param
  src = (string_or_io.respond_to?(:read) ? string_or_io.read : string_or_io).encode 'utf-8'
  yield instance if block_given?
  instance.instance_eval do
    @preprocessors.each do |pr|
      src = pr.call(src)
    end
    parser = Parser.new(src)
    if (!parser.parse)
      raise parser.raise_error
    end

    @root = parser.result
    @root.document_name ||= @document_name
    @root.reparent
    @root.assign_pageno
  end
  frontmatter = instance.root.find_node :type => :Frontmatter
  if (frontmatter)
    if (frontmatter.yaml['generator'])
      NoraMark::Extensions.register_generator(frontmatter.yaml['generator'].to_sym)
    end
  end

  instance
end

.register_generator(generator) ⇒ Object



12
13
14
15
16
17
18
19
20
# File 'lib/nora_mark/document.rb', line 12

def self.register_generator(generator)
  @generators ||= {}
  generator_name = generator.name
  @generators[generator_name] = generator
  generator.activate self if generator.respond_to? :activate
  define_method(generator_name) do
    generate(generator_name)
  end
end

.unregister_generator(generator) ⇒ Object



22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/nora_mark/document.rb', line 22

def self.unregister_generator(generator)
  @generators ||= {}
  if generator.is_a? Symbol or generator.is_a? String
    generator_name = generator.to_sym
  else
    generator_name = generator.name
  end

  @generators.delete generator_name
  generator.deactivate self if generator.respond_to? :deactivate
  remove_method generator_name
end

Instance Method Details

#add_transformer(generator: :html, text: nil, &block) ⇒ Object



86
87
88
# File 'lib/nora_mark/document.rb', line 86

def add_transformer(generator: :html, text: nil, &block)
  (@transformers[generator] ||= []) << TransformerFactory.create(text: text, &block)
end

#generate(generator_name) ⇒ Object



73
74
75
76
77
78
79
# File 'lib/nora_mark/document.rb', line 73

def generate(generator_name)
  if @result[generator_name].nil?
    transformers(generator_name).each { |t| t.transform @root }
    @result[generator_name] = Document.generators[generator_name].new(@param).convert(@root.clone, @render_parameter)
  end
  @result[generator_name]
end

#preprocessor(&block) ⇒ Object



65
66
67
# File 'lib/nora_mark/document.rb', line 65

def preprocessor(&block)
  @preprocessors << block
end

#render_parameter(param = {}) ⇒ Object



81
82
83
84
# File 'lib/nora_mark/document.rb', line 81

def render_parameter(param = {})
  @render_parameter.merge! param
  self
end

#transformers(generator_name) ⇒ Object



69
70
71
# File 'lib/nora_mark/document.rb', line 69

def transformers(generator_name)
  @transformers[generator_name] ||= []
end