Pastie now auto-senses if line-wrap is a bad or good idea. Feedback?
## mark a section (Learn more)
# encoders/term.rb # By Nathan Weizenbaum (http://nex-3.com) # MIT License (http://www.opensource.org/licenses/mit-license.php) # # A CodeRay highlighter that outputs code highlighted for a color terminal. # Check out http://nex-3.com/posts/37-terminal-syntax-highlighting module CodeRay::Encoders class Term < Encoder register_for :term TOKEN_COLORS = { :attribute_name => '34', :attribute_name_fat => '34', :attribute_value => '31', :attribute_value_fat => '31', :bin => '1;35', :char => {:self => '36', :delimiter => '34'}, :class => '1;35', :class_variable => '36', :color => '32', :comment => '37', :constant => ['34', '4'], :definition => '1;32', :directive => ['32', '4'], :doc => '46', :doc_string => ['31', '4'], :entity => '33', :error => ['1;33', '41'], :exception => '1;31', :float => '1;35', :function => '1;34', :global_variable => '42', :hex => '1;36', :include => '33', :integer => '1;34', :interpreted => '1;35', :label => '1;4', :local_variable => '33', :oct => '1;35', :operator_name => '1;29', :pre_constant => '1;36', :pre_type => '1;30', :predefined => ['4', '1;34'], :preprocessor => '36', :regexp => { :content => '31', :delimiter => '1;29', :modifier => '35', :function => '1;29' }, :reserved => '1;31', :shell => {:self => '42', :content => '1;29'}, :string => '32', :symbol => '1;32', :tag => '34', :tag_fat => '1;34', :tag_special => ['34', '4'], :type => '1;34', :variable => '34' } TOKEN_COLORS[:procedure] = TOKEN_COLORS[:method] = TOKEN_COLORS[:function] TOKEN_COLORS[:open] = TOKEN_COLORS[:close] = TOKEN_COLORS[:nesting_delimiter] = TOKEN_COLORS[:escape] = TOKEN_COLORS[:delimiter] protected def setup(options) @out = '' @subcolors = nil end def finish(options) @out end def text_token(text, kind) if color = (@subcolors || TOKEN_COLORS)[kind] color = color[:self] || return if Hash === color @out << col(color) + text.gsub("\n", col(0) + "\n" + col(color)) + col(0) @out << col(@subcolors[:self]) if @subcolors && @subcolors[:self] else @out << text end end def open_token(kind) if color = TOKEN_COLORS[kind] if Hash === color @subcolors = color @out << col(color[:self]) if color[:self] else @subcolors = {} @out << col(color) end end end def close_token(kind) if (@subcolors || {})[:self] @out << col(0) end @subcolors = nil end private def col(color) Array(color).map { |c| "\e[#{c}m" }.join end end end
This paste will be private.
From the Design Piracy series on my blog: