Class: CodeRay::Encoders::HTML2

Inherits:
HTML
  • Object
show all
Defined in:
lib/milkode/cdweb/lib/coderay_html2.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.number!(output, mode = :table, options = {}) ⇒ Object

ref

CodeRay::Encoders::Numberling#number! (coderay-1.0.5/lib/coderay/encoders/numbering.rb:8)



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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
# File 'lib/milkode/cdweb/lib/coderay_html2.rb', line 65

def self.number! output, mode = :table, options = {}
  return self unless mode

  options = DEFAULT_OPTIONS.merge options

  start = options[:line_number_start]
  unless start.is_a? Integer
    raise ArgumentError, "Invalid value %p for :line_number_start; Integer expected." % start
  end
  
  anchor_prefix = options[:line_number_anchors]
  anchor_prefix = 'line' if anchor_prefix == true
  anchor_prefix = anchor_prefix.to_s[/\w+/] if anchor_prefix

  anchor_url = options[:line_number_anchor_url] || ""
  
  anchoring =
    if anchor_prefix
      proc do |line|
      line = line.to_s
      anchor = anchor_prefix + line
      "<a href=\"#{anchor_url}##{anchor}\" name=\"#{anchor}\">#{line}</a>"
    end
    else
      proc { |line| line.to_s }  # :to_s.to_proc in Ruby 1.8.7+
    end
  
  bold_every = options[:bold_every]
  highlight_lines = options[:highlight_lines]
  bolding =
    if bold_every == false && highlight_lines == nil
      anchoring
    elsif highlight_lines.is_a? Enumerable
      highlight_lines = highlight_lines.to_set
      proc do |line|
      if highlight_lines.include? line
        "<strong class=\"highlighted\">#{anchoring[line]}</strong>"  # highlighted line numbers in bold
      else
        anchoring[line]
      end
    end
    elsif bold_every.is_a? Integer
      raise ArgumentError, ":bolding can't be 0." if bold_every == 0
      proc do |line|
      if line % bold_every == 0
        "<strong>#{anchoring[line]}</strong>"  # every bold_every-th number in bold
      else
        anchoring[line]
      end
    end
    else
      raise ArgumentError, 'Invalid value %p for :bolding; false or Integer expected.' % bold_every
    end
  
  line_count = output.count("\n")
  position_of_last_newline = output.rindex(RUBY_VERSION >= '1.9' ? /\n/ : ?\n)
  if position_of_last_newline
    after_last_newline = output[position_of_last_newline + 1 .. -1]
    ends_with_newline = after_last_newline[/\A(?:<\/span>)*\z/]
    line_count += 1 if not ends_with_newline
  end
  
  case mode
  when :inline
    max_width = (start + line_count).to_s.size
    line_number = start
    nesting = []
    output.gsub!(/^.*$\n?/) do |line|
      line.chomp!
      open = nesting.join
      line.scan(%r!<(/)?span[^>]*>?!) do |close,|
        if close
          nesting.pop
        else
          nesting << $&
        end
      end
      close = '</span>' * nesting.size
      
      line_number_text = bolding.call line_number
      indent = ' ' * (max_width - line_number.to_s.size)  # TODO: Optimize (10^x)
      line_number += 1
      "<span class=\"line-numbers\">#{indent}#{line_number_text}</span>#{open}#{line}#{close}\n"
    end

  when :table
    line_numbers = (start ... start + line_count).map(&bolding).join("\n")
    line_numbers << "\n"
    line_numbers_table_template = Output::TABLE.apply('LINE_NUMBERS', line_numbers)

    output.gsub!(/<\/div>\n/, '</div>')
    output.wrap_in! line_numbers_table_template
    output.wrapped_in = :div

  when :list
    raise NotImplementedError, 'The :list option is no longer available. Use :table.'

  else
    raise ArgumentError, 'Unknown value %p for mode: expected one of %p' %
      [mode, [:table, :inline]]
  end

  output
end

Instance Method Details

#finish(options) ⇒ Object

ref

CodeRay::Encoders::HTML#finish (coderay-1.0.5/lib/coderay/encoders/html.rb:219)



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
# File 'lib/milkode/cdweb/lib/coderay_html2.rb', line 19

def finish options
  @out = ornament_line_attr(options)

  unless @opened.empty?
    warn '%d tokens still open: %p' % [@opened.size, @opened] if $CODERAY_DEBUG
    @out << '</span>' while @opened.pop
    @last_opened = nil
  end
  
  @out.extend Output
  @out.css = @css
  if options[:line_numbers]
    # Numbering.number! @out, options[:line_numbers], options
    HTML2::number! @out, options[:line_numbers], options
  end
  @out.wrap! options[:wrap]
  @out.apply_title! options[:title]
  
  if defined?(@real_out) && @real_out
    @real_out << @out
    @out = @real_out
  end
  
  @out
end

#line_attr(no, highlight_lines) ⇒ Object



57
58
59
60
61
62
# File 'lib/milkode/cdweb/lib/coderay_html2.rb', line 57

def line_attr(no, highlight_lines)
  r = []
  r << "id=\"n#{no}\""
  r << "class=\"highlight-line\"" if highlight_lines.include?(no)
  r.join(" ")
end

#ornament_line_attr(options) ⇒ Object



45
46
47
48
49
50
51
52
53
54
55
# File 'lib/milkode/cdweb/lib/coderay_html2.rb', line 45

def ornament_line_attr(options)
  # p options
  line_number = options[:line_number_start]

  lines = @out.split("\n")

  lines.map{|l|
    line_number += 1
    "<span #{line_attr(line_number - 1, options[:highlight_lines])}>#{l}</span>"
  }.join("\n") + "\n"
end

#text_token(text, kind) ⇒ Object



13
14
15
16
# File 'lib/milkode/cdweb/lib/coderay_html2.rb', line 13

def text_token text, kind
  # p "#{kind}: #{text}"
  super
end