lib/belajar/window.rb in belajar-0.1.1 vs lib/belajar/window.rb in belajar-1.0.0
- old
+ new
@@ -1,53 +1,40 @@
require 'curses'
-require 'cgi'
+require 'belajar/coloring'
+require 'belajar/markdown'
module Belajar
class Window < Curses::Window
+ include Coloring
- COLOR_TEXT = Curses::COLOR_YELLOW unless defined? COLOR_TEXT
- COLOR_TEXT_EMPHASIZE = Curses::COLOR_CYAN unless defined? COLOR_TEXT_EMPHASIZE
- COLOR_HEADING = Curses::COLOR_WHITE unless defined? COLOR_HEADING
- COLOR_RED = Curses::COLOR_BLUE unless defined? COLOR_RED
- COLOR_GREEN = Curses::COLOR_MAGENTA unless defined? COLOR_GREEN
- COLOR_YELLOW = Curses::COLOR_RED unless defined? COLOR_YELLOW
-
- BACKGROUND = Curses::COLOR_WHITE unless defined? BACKGROUND
- FONT = Curses::COLOR_BLACK unless defined? FONT
- FONT_HEADING = Curses::COLOR_MAGENTA unless defined? FONT_HEADING
- FONT_EMPHASIZE = Curses::COLOR_BLUE unless defined? FONT_EMPHASIZE
- RED = Curses::COLOR_RED unless defined? RED
- GREEN = Curses::COLOR_GREEN unless defined? GREEN
- YELLOW = Curses::COLOR_YELLOW unless defined? YELLOW
-
def initialize(height = Curses.lines, width = Curses.cols, top = 0, left = 0)
super(height, width, top, left)
init_colors
end
- def write(text, color = COLOR_TEXT, text_decoration = Curses::A_NORMAL )
- self.attron(Curses.color_pair(color) | text_decoration) { self << text.to_s }
+ def write(text, color = COLOR_TEXT, text_decoration = Curses::A_NORMAL)
+ attron(Curses.color_pair(color) | text_decoration) { self << text.to_s }
end
def emphasize(text, text_decoration = Curses::A_NORMAL)
- write(text, Window::COLOR_TEXT_EMPHASIZE, text_decoration)
+ write(text, COLOR_TEXT_EMPHASIZE, text_decoration)
end
def heading(text, text_decoration = Curses::A_UNDERLINE)
- write(text, Window::COLOR_HEADING, text_decoration)
+ write(text, COLOR_HEADING, text_decoration)
end
def red(text, text_decoration = Curses::A_NORMAL, options = {})
- colored(text, Window::COLOR_RED, text_decoration, options)
+ colored(text, COLOR_RED, text_decoration, options)
end
def yellow(text, text_decoration = Curses::A_NORMAL, options = {})
- colored(text, Window::COLOR_YELLOW, text_decoration, options)
+ colored(text, COLOR_YELLOW, text_decoration, options)
end
def green(text, text_decoration = Curses::A_NORMAL, options = {})
- colored(text, Window::COLOR_GREEN, text_decoration, options)
+ colored(text, COLOR_GREEN, text_decoration, options)
end
def colored(text, color, text_decoration = Curses::A_NORMAL, options = {})
if options[:full_line]
clear_line(
@@ -61,17 +48,17 @@
end
write("#{prefix}#{text}", color, text_decoration)
end
- # clear_line(options = {})
- # options: [:color, :text_decoration, :start_pos, :end_pos]
+ # clear_line(options = {})
+ # options: [:color, :text_decoration, :start_pos, :end_pos, :text]
def clear_line(options = {})
- color = options[:color] || COLOR_TEXT
+ color = options[:color] || COLOR_TEXT
text_decoration = options[:text_decoration] || Curses::A_NORMAL
- start = options[:start_pos] || 0
- stop = options[:end_pos] || maxx
+ start = options[:start_pos] || 0
+ stop = options[:end_pos] || maxx
x = curx
setpos(cury, start)
write((options[:text] || ' ') * (stop - 1), color, text_decoration)
setpos(cury, x)
@@ -80,136 +67,29 @@
def print_indicator(object, text = ' ', text_decoration = Curses::A_STANDOUT)
if object.respond_to?(:mastered?) && object.respond_to?(:started?)
if object.mastered?
green(text, text_decoration)
- write ' '
elsif object.started?
yellow(text, text_decoration)
- write ' '
else
red(text, text_decoration)
- write ' '
end
elsif object.respond_to?(:mastered?)
if object.mastered?
green(text, text_decoration)
- write ' '
else
red(text, text_decoration)
- write ' '
end
end
+
+ write ' '
end
def print_markdown(text)
clear_line
- h1 = /^\#{1}[^#]+/ # '# heading'
- h2 = /^\#{2}[^#]+/ # '## sub heading'
- bold = /(\*[^*]*\*)/ # '*text*'
- line = /^-{3,}/ # '---' vertical line
- code = /(\`*\`)/ # '`code line`'
- ruby_doc_core = /(\(ruby-doc core:.*\))/ # '(ruby-doc core: Kernel#print)'
- ruby_doc_stdlib = /(\(ruby-doc stdlib:.*\))/ # '(ruby-doc stdlib: CSV#Row::<<)'
-
- case text
- when h1
- heading(text.gsub(/^#\s?/, ''))
- when h2
- text_decoration = Curses::A_UNDERLINE | Curses::A_NORMAL
- emphasize(text.gsub(/^##\s?/, ''), text_decoration)
- when (code || bold)
- emphasized = false
- highlighted = false
-
- text.chars.each_with_index do |char, index|
- if char == '*' && text[index - 1] != '\\'
- emphasized = !emphasized
- next
- end
-
- if char == '`'
- highlighted = !highlighted
- next
- end
-
- character = "#{text[index..(index + 1)]}" == '\\*' ? '' : char
-
- if highlighted
- red(character)
- elsif emphasized
- emphasize(character)
- else
- write(character)
- end
- end
- when bold
- text.chars.each_with_index do |char, index|
- if char == '*' && text[index - 1] != '\\'
- emphasized = !emphasized
- next
- end
-
- character = "#{text[index..(index + 1)]}" == '\\*' ? '' : char
- emphasized ? emphasize(character) : write(character)
- end
- when line
- write('-' * (Curses.cols - 2))
- when ruby_doc_core
- capture = text.match(/\(ruby-doc core:\s?(.*)\)/).captures.first
- write text.gsub(ruby_doc_core, ruby_doc_core_link(capture))
- when ruby_doc_stdlib
- capture = text.match(/\(ruby-doc stdlib:\s?(.*)\)/).captures.first
- write text.gsub(ruby_doc_stdlib, ruby_doc_stdlib_link(capture))
- else
- write(text.gsub(/(\\#)/, '#'))
- end
+ printer = Markdown::Printer.new(window: self)
+ printer.print(text)
end
-
- protected
-
- def init_colors
- Curses.start_color
- Curses.init_pair(COLOR_TEXT, FONT, BACKGROUND)
- Curses.init_pair(COLOR_TEXT_EMPHASIZE, FONT_EMPHASIZE, BACKGROUND)
- Curses.init_pair(COLOR_HEADING, FONT_HEADING, BACKGROUND)
- Curses.init_pair(COLOR_RED, RED, BACKGROUND)
- Curses.init_pair(COLOR_GREEN, GREEN, BACKGROUND)
- Curses.init_pair(COLOR_YELLOW, YELLOW, BACKGROUND)
- end
-
- private
-
- def ruby_doc_core_link(text)
- base_url = "http://ruby-doc.org/core-#{RUBY_VERSION}"
- class_part = ruby_doc_class_parts(text).join('/')
- method = ruby_doc_method(text)
-
- "#{base_url}/#{class_part}.html#{method}"
- end
-
- def ruby_doc_stdlib_link(text)
- base_url = "http://ruby-doc.org/stdlib-#{RUBY_VERSION}"
- class_parts = ruby_doc_class_parts(text)
- libdoc_part = "libdoc/#{class_parts.first.downcase}/rdoc"
- method = ruby_doc_method(text)
-
- "#{base_url}/#{libdoc_part}/#{class_parts.join('/')}.html#{method}"
- end
-
- def ruby_doc_class_parts(text)
- parts = text.split(/::|#/)
- parts[0..(parts.count > 1 ? -2 : -1)]
- end
-
- def ruby_doc_method(text)
- parts = text.split(/::|#/)
-
- if parts.count > 1
- method_type = text.match(/#/) ? 'i' : 'c'
- method_name = CGI.escape(parts.last.strip).gsub('%', '-').gsub(/\A-/, '')
- "#method-#{method_type}-#{method_name}"
- end
- end
end
-end
\ No newline at end of file
+end