class ShowCode::Code

Attributes

content[RW]

Public Class Methods

new(location) click to toggle source
# File lib/show_code/code.rb, line 7
def initialize(location)
  @file         = location.file
  file_lines    = File.readlines(@file) if @file

  @line         = real_start_line file_lines, location.line
  related_lines = file_lines[(@line - 1)..-1] || []

  codes         = extract_method_code related_lines
  @lines        = codes.count
  @content      = codes.join
end

Public Instance Methods

add_line_numbers(output) click to toggle source
# File lib/show_code/code.rb, line 58
def add_line_numbers(output)
  line_number = line - 1
  output.split("\n").map do |loc|
    line_number += 1
    "\e[33m#{line_number.to_s.ljust(4, ' ')}\e[0m#{loc}"
  end.join("\n")
end
expression_end?(codes) click to toggle source

refer: gist.github.com/judofyr/1373383

# File lib/show_code/code.rb, line 38
def expression_end?(codes)
  str = codes.join

  catch(:valid) do
    eval("BEGIN{throw :valid}; #{str}")
  end

  # skip , or \
  str !~ /[,\\]\s*\z/
rescue SyntaxException
  false
end
extract_method_code(related_lines) click to toggle source
# File lib/show_code/code.rb, line 28
def extract_method_code(related_lines)
  codes = []
  related_lines.each do |loc|
    codes << loc
    return codes if expression_end?(codes)
  end
  raise SyntaxError, "unexpected $end"
end
greet() click to toggle source

Example: ShowCode 'ShowCode::Code.new.greet'

# File lib/show_code/code.rb, line 67
def greet
  puts 'Hello ShowCode!'
end
highlighted(opts = {}) click to toggle source
# File lib/show_code/code.rb, line 51
def highlighted(opts = {})
  options = {:line_numbers => true}.merge(opts)
  colorized = CodeRay.scan(content, :ruby).tty
  output = options[:line_numbers] ? add_line_numbers(colorized) : colorized
  "\n%s\n\n" % output
end
real_start_line(file_lines, line) click to toggle source
# File lib/show_code/code.rb, line 19
def real_start_line(file_lines, line)
  return line unless line.zero?

  file_lines.each do |loc|
    line += 1
    return line if /^\s*(class|module)\s+[A-Z]/ === loc
  end
end