This module holds the Encoder class and its subclasses. For example, the HTML encoder is named CodeRay::Encoders::HTML can be found in coderay/encoders/html.
Encoders also provides methods and constants for the register mechanism and the [] method that returns the Encoder class belonging to the given format.
TRANSPARENT_TOKEN_KINDS | = | [ :delimiter, :modifier, :content, :escape, :inline_delimiter, ].to_set |
Generate a hint about the given classes in a hint style.
hint may be :info, :info_long or :debug.
# File lib/coderay/encoders/html.rb, line 129 129: def self.token_path_to_hint hint, classes 130: title = 131: case hint 132: when :info 133: TOKEN_KIND_TO_INFO[classes.first] 134: when :info_long 135: classes.reverse.map { |kind| TOKEN_KIND_TO_INFO[kind] }.join('/') 136: when :debug 137: classes.inspect 138: end 139: title ? " title=\"#{title}\"" : '' 140: end
# File lib/coderay/encoders/html.rb, line 208 208: def finish options 209: not_needed = @opened.shift 210: @out << '</span>' * @opened.size 211: unless @opened.empty? 212: warn '%d tokens still open: %p' % [@opened.size, @opened] 213: end 214: 215: @out.extend Output 216: @out.css = @css 217: @out.numerize! options[:line_numbers], options 218: @out.wrap! options[:wrap] 219: 220: super 221: end
# File lib/coderay/encoders/html.rb, line 142 142: def setup options 143: super 144: 145: @HTML_ESCAPE = HTML_ESCAPE.dup 146: @HTML_ESCAPE["\t"] = ' ' * options[:tab_width] 147: 148: @opened = [nil] 149: @css = CSS.new options[:style] 150: 151: hint = options[:hint] 152: if hint and not [:debug, :info, :info_long].include? hint 153: raise ArgumentError, "Unknown value %p for :hint; \ 154: expected :info, :debug, false, or nil." % hint 155: end 156: 157: case options[:css] 158: 159: when :class 160: @css_style = Hash.new do |h, k| 161: c = CodeRay::Tokens::ClassOfKind[k.first] 162: if c == :NO_HIGHLIGHT and not hint 163: h[k.dup] = false 164: else 165: title = if hint 166: HTML.token_path_to_hint(hint, k[1..-1] << k.first) 167: else 168: '' 169: end 170: if c == :NO_HIGHLIGHT 171: h[k.dup] = '<span%s>' % [title] 172: else 173: h[k.dup] = '<span%s class="%s">' % [title, c] 174: end 175: end 176: end 177: 178: when :style 179: @css_style = Hash.new do |h, k| 180: if k.is_a? ::Array 181: styles = k.dup 182: else 183: styles = [k] 184: end 185: type = styles.first 186: classes = styles.map { |c| Tokens::ClassOfKind[c] } 187: if classes.first == :NO_HIGHLIGHT and not hint 188: h[k] = false 189: else 190: styles.shift if TRANSPARENT_TOKEN_KINDS.include? styles.first 191: title = HTML.token_path_to_hint hint, styles 192: style = @css[*classes] 193: h[k] = 194: if style 195: '<span%s style="%s">' % [title, style] 196: else 197: false 198: end 199: end 200: end 201: 202: else 203: raise ArgumentError, "Unknown value %p for :css." % options[:css] 204: 205: end 206: end
# File lib/coderay/encoders/html.rb, line 223 223: def token text, type = :plain 224: case text 225: 226: when nil 227: # raise 'Token with nil as text was given: %p' % [[text, type]] 228: 229: when String 230: if text =~ /#{HTML_ESCAPE_PATTERN}/o 231: text = text.gsub(/#{HTML_ESCAPE_PATTERN}/o) { |m| @HTML_ESCAPE[m] } 232: end 233: @opened[0] = type 234: if text != "\n" && style = @css_style[@opened] 235: @out << style << text << '</span>' 236: else 237: @out << text 238: end 239: 240: 241: # token groups, eg. strings 242: when :open 243: @opened[0] = type 244: @out << (@css_style[@opened] || '<span>') 245: @opened << type 246: when :close 247: if @opened.empty? 248: # nothing to close 249: else 250: if $DEBUG and (@opened.size == 1 or @opened.last != type) 251: raise 'Malformed token stream: Trying to close a token (%p) \ 252: that is not open. Open are: %p.' % [type, @opened[1..-1]] 253: end 254: @out << '</span>' 255: @opened.pop 256: end 257: 258: # whole lines to be highlighted, eg. a deleted line in a diff 259: when :begin_line 260: @opened[0] = type 261: if style = @css_style[@opened] 262: @out << style.sub('<span', '<div') 263: else 264: @out << '<div>' 265: end 266: @opened << type 267: when :end_line 268: if @opened.empty? 269: # nothing to close 270: else 271: if $DEBUG and (@opened.size == 1 or @opened.last != type) 272: raise 'Malformed token stream: Trying to close a line (%p) \ 273: that is not open. Open are: %p.' % [type, @opened[1..-1]] 274: end 275: @out << '</div>' 276: @opened.pop 277: end 278: 279: else 280: raise 'unknown token kind: %p' % [text] 281: 282: end 283: end