Files

Class Index [+]

Quicksearch

CodeRay::Encoders::HTML::Output

This module is included in the output String from thew HTML Encoder.

It provides methods like wrap, div, page etc.

Remember to use # instead of # to keep the modules the object was extended with.

TODO: more doc.

Constants

SPAN

— don’t include the templates in docu

DIV
TABLE
LIST

title=“double click to expand“

PAGE

Attributes

css[RW]
wrapped_in[W]

Public Class Methods

extended(o) click to toggle source

Raises an exception if an object that doesn’t respond to to_str is extended by Output, to prevent users from misuse. Use Module#remove_method to disable.

    # File lib/coderay/encoders/html/output.rb, line 37
37:         def extended o
38:           warn "The Output module is intended to extend instances of String, not #{o.class}." unless o.respond_to? :to_str
39:         end
make_stylesheet(css, in_tag = false) click to toggle source
    # File lib/coderay/encoders/html/output.rb, line 41
41:         def make_stylesheet css, in_tag = false
42:           sheet = css.stylesheet
43:           sheet = <style type="text/css">#{sheet}</style> if in_tag
44:           sheet
45:         end
new(string, css = CSS.new, element = nil) click to toggle source

This makes Output look like a class.

Example:

 a = Output.new '<span class="co">Code</span>'
 a.wrap! :page
    # File lib/coderay/encoders/html/output.rb, line 28
28:         def new string, css = CSS.new, element = nil
29:           output = string.clone.extend self
30:           output.wrapped_in = element
31:           output.css = css
32:           output
33:         end
page_template_for_css(css) click to toggle source
    # File lib/coderay/encoders/html/output.rb, line 51
51:         def page_template_for_css css
52:           sheet = make_stylesheet css
53:           PAGE.apply 'CSS', sheet
54:         end
wrapper(*wrappers) click to toggle source

Define a new wrapper. This is meta programming.

    # File lib/coderay/encoders/html/output.rb, line 57
57:         def wrapper *wrappers
58:           wrappers.each do |wrapper|
59:             define_method wrapper do |*args|
60:               wrap wrapper, *args
61:             end
62:             define_method "#{wrapper}!".to_sym do |*args|
63:               wrap! wrapper, *args
64:             end
65:           end
66:         end

Public Instance Methods

apply_title!(title) click to toggle source
    # File lib/coderay/encoders/html/output.rb, line 90
90:       def apply_title! title
91:         self.sub!(/(<title>)(<\/title>)/) { $1 + title + $2 }
92:         self
93:       end
line_count() click to toggle source
     # File lib/coderay/encoders/html/numerization.rb, line 117
117:       def line_count
118:         line_count = count("\n")
119:         position_of_last_newline = rindex(\n\)
120:         if position_of_last_newline
121:           after_last_newline = self[position_of_last_newline + 1 .. 1]
122:           ends_with_newline = after_last_newline[/\A(?:<\/span>)*\z/]
123:           line_count += 1 if not ends_with_newline
124:         end
125:         line_count
126:       end
numerize(*args) click to toggle source
    # File lib/coderay/encoders/html/numerization.rb, line 8
 8:       def numerize *args
 9:         clone.numerize!(*args)
10:       end
numerize!(mode = :table, options = {}) click to toggle source
     # File lib/coderay/encoders/html/numerization.rb, line 19
 19:       def numerize! mode = :table, options = {}
 20:         return self unless mode
 21: 
 22:         options = DEFAULT_OPTIONS.merge options
 23: 
 24:         start = options[:line_number_start]
 25:         unless start.is_a? Integer
 26:           raise ArgumentError, "Invalid value %p for :line_number_start; Integer expected." % start
 27:         end
 28: 
 29:         #allowed_wrappings = NUMERIZABLE_WRAPPINGS[mode]
 30:         #unless allowed_wrappings == :all or allowed_wrappings.include? options[:wrap]
 31:         #  raise ArgumentError, "Can't numerize, :wrap must be in %p, but is %p" % [NUMERIZABLE_WRAPPINGS, options[:wrap]]
 32:         #end
 33: 
 34:         bold_every = options[:bold_every]
 35:         highlight_lines = options[:highlight_lines]
 36:         bolding =
 37:           if bold_every == false && highlight_lines == nil
 38:             proc { |line| line.to_s }
 39:           elsif highlight_lines.is_a? Enumerable
 40:             highlight_lines = highlight_lines.to_set
 41:             proc do |line|
 42:               if highlight_lines.include? line
 43:                 "<strong class=\"highlighted\">#{line}</strong>"  # highlighted line numbers in bold
 44:               else
 45:                 line.to_s
 46:               end
 47:             end
 48:           elsif bold_every.is_a? Integer
 49:             raise ArgumentError, ":bolding can't be 0." if bold_every == 0
 50:             proc do |line|
 51:               if line % bold_every == 0
 52:                 "<strong>#{line}</strong>"  # every bold_every-th number in bold
 53:               else
 54:                 line.to_s
 55:               end
 56:             end
 57:           else
 58:             raise ArgumentError, 'Invalid value %p for :bolding; false or Integer expected.' % bold_every
 59:           end
 60: 
 61:         case mode
 62:         when :inline
 63:           max_width = (start + line_count).to_s.size
 64:           line_number = start
 65:           gsub!(/^/) do
 66:             line_number_text = bolding.call line_number
 67:             indent = ' ' * (max_width - line_number.to_s.size)  # TODO: Optimize (10^x)
 68:             res = "<span class=\"no\">#{indent}#{line_number_text}</span> "
 69:             line_number += 1
 70:             res
 71:           end
 72: 
 73:         when :table
 74:           # This is really ugly.
 75:           # Because even monospace fonts seem to have different heights when bold,
 76:           # I make the newline bold, both in the code and the line numbers.
 77:           # FIXME Still not working perfect for Mr. Internet Exploder
 78:           line_numbers = (start ... start + line_count).to_a.map(&bolding).join("\n")
 79:           line_numbers << "\n"  # also for Mr. MS Internet Exploder :-/
 80:           line_numbers.gsub!(/\n/) { "<tt>\n</tt>" }
 81: 
 82:           line_numbers_table_tpl = TABLE.apply('LINE_NUMBERS', line_numbers)
 83:           gsub!(/<\/div>\n/) { '</div>' }
 84:           gsub!(/\n/) { "<tt>\n</tt>" }
 85:           wrap_in! line_numbers_table_tpl
 86:           @wrapped_in = :div
 87: 
 88:         when :list
 89:           opened_tags = []
 90:           gsub!(/^.*$\n?/) do |line|
 91:             line.chomp!
 92: 
 93:             open = opened_tags.join
 94:             line.scan(%<(/)?span[^>]*>?!) do |close,|
 95:               if close
 96:                 opened_tags.pop
 97:               else
 98:                 opened_tags << $&
 99:               end
100:             end
101:             close = '</span>' * opened_tags.size
102: 
103:             "<li>#{open}#{line}#{close}</li>\n"
104:           end
105:           chomp!("\n")
106:           wrap_in! LIST
107:           @wrapped_in = :div
108: 
109:         else
110:           raise ArgumentError, 'Unknown value %p for mode: expected one of %p' %
111:             [mode, [:table, :list, :inline]]
112:         end
113: 
114:         self
115:       end
stylesheet(in_tag = false) click to toggle source
     # File lib/coderay/encoders/html/output.rb, line 125
125:       def stylesheet in_tag = false
126:         Output.make_stylesheet @css, in_tag
127:       end
wrap(*args) click to toggle source
     # File lib/coderay/encoders/html/output.rb, line 121
121:       def wrap *args
122:         clone.wrap!(*args)
123:       end
wrap!(element, *args) click to toggle source
     # File lib/coderay/encoders/html/output.rb, line 95
 95:       def wrap! element, *args
 96:         return self if not element or element == wrapped_in
 97:         case element
 98:         when :div
 99:           raise "Can't wrap %p in %p" % [wrapped_in, element] unless wrapped_in? nil
100:           wrap_in! DIV
101:         when :span
102:           raise "Can't wrap %p in %p" % [wrapped_in, element] unless wrapped_in? nil
103:           wrap_in! SPAN
104:         when :page
105:           wrap! :div if wrapped_in? nil
106:           raise "Can't wrap %p in %p" % [wrapped_in, element] unless wrapped_in? :div
107:           wrap_in! Output.page_template_for_css(@css)
108:           if args.first.is_a?(Hash) && title = args.first[:title]
109:             apply_title! title
110:           end
111:           self
112:         when nil
113:           return self
114:         else
115:           raise "Unknown value %p for :wrap" % element
116:         end
117:         @wrapped_in = element
118:         self
119:       end
wrap_in(template) click to toggle source
    # File lib/coderay/encoders/html/output.rb, line 81
81:       def wrap_in template
82:         clone.wrap_in! template
83:       end
wrap_in!(template) click to toggle source
    # File lib/coderay/encoders/html/output.rb, line 85
85:       def wrap_in! template
86:         Template.wrap! self, template, 'CONTENT'
87:         self
88:       end
wrapped_in() click to toggle source
    # File lib/coderay/encoders/html/output.rb, line 76
76:       def wrapped_in
77:         @wrapped_in ||= nil
78:       end
wrapped_in?(element) click to toggle source
    # File lib/coderay/encoders/html/output.rb, line 72
72:       def wrapped_in? element
73:         wrapped_in == element
74:       end

Disabled; run with --debug to generate this.

[Validate]

Generated with the Darkfish Rdoc Generator 1.1.6.