Compare commits

...

9 Commits

7 changed files with 62 additions and 62 deletions

View File

@ -63,7 +63,9 @@ require "tartrazine"
lexer = Tartrazine.lexer("crystal") lexer = Tartrazine.lexer("crystal")
theme = Tartrazine.theme("catppuccin-macchiato") theme = Tartrazine.theme("catppuccin-macchiato")
puts Tartrazine::Html.new.format(File.read(ARGV[0]), lexer, theme) formatter = Tartrazine::Html.new
formatter.theme = theme
puts formatter.format(File.read(ARGV[0]), lexer)
``` ```
## Contributing ## Contributing

View File

@ -1,5 +1,5 @@
name: tartrazine name: tartrazine
version: 0.4.0 version: 0.5.1
authors: authors:
- Roberto Alsina <roberto.alsina@gmail.com> - Roberto Alsina <roberto.alsina@gmail.com>

View File

@ -12,6 +12,10 @@ module Tartrazine
property theme : Theme = Tartrazine.theme("default-dark") property theme : Theme = Tartrazine.theme("default-dark")
# Format the text using the given lexer. # Format the text using the given lexer.
def format(text : String, lexer : Lexer, io : IO = nil) : Nil
raise Exception.new("Not implemented")
end
def format(text : String, lexer : Lexer) : String def format(text : String, lexer : Lexer) : String
raise Exception.new("Not implemented") raise Exception.new("Not implemented")
end end

View File

@ -12,33 +12,23 @@ module Tartrazine
end end
def format(text : String, lexer : Lexer) : String def format(text : String, lexer : Lexer) : String
tokenizer = Tokenizer.new(lexer, text) outp = String::Builder.new("")
i = 0 format(text, lexer, outp)
output = String.build do |outp| outp.to_s
outp << line_label(i) if line_numbers?
tokenizer.each do |token|
outp << colorize(token[:value], token[:type])
if token[:value].includes?("\n")
i += 1
outp << line_label(i) if line_numbers?
end
end
end
output
end end
# def format(text : String, lexer : Lexer) : String def format(text : String, lexer : Lexer, outp : IO) : Nil
# output = String.build do |outp| tokenizer = Tokenizer.new(lexer, text)
# lexer.group_tokens_in_lines(lexer.tokenize(text)).each_with_index do |line, i| i = 0
# label = line_numbers? ? "#{i + 1}".rjust(4).ljust(5) : "" outp << line_label(i) if line_numbers?
# outp << label tokenizer.each do |token|
# line.each do |token| outp << colorize(token[:value], token[:type])
# outp << colorize(token[:value], token[:type]) if token[:value].includes?("\n")
# end i += 1
# end outp << line_label(i) if line_numbers?
# end end
# output end
# end end
def colorize(text : String, token : String) : String def colorize(text : String, token : String) : String
style = theme.styles.fetch(token, nil) style = theme.styles.fetch(token, nil)

View File

@ -35,23 +35,26 @@ module Tartrazine
end end
def format(text : String, lexer : Lexer) : String def format(text : String, lexer : Lexer) : String
text = format_text(text, lexer) outp = String::Builder.new("")
if standalone? format(text, lexer, outp)
text = wrap_standalone(text) outp.to_s
end end
text
def format(text : String, lexer : Lexer, io : IO) : Nil
pre, post = wrap_standalone
io << pre if standalone?
format_text(text, lexer, io)
io << post if standalone?
end end
# Wrap text into a full HTML document, including the CSS for the theme # Wrap text into a full HTML document, including the CSS for the theme
def wrap_standalone(text) : String def wrap_standalone
output = String.build do |outp| output = String.build do |outp|
outp << "<!DOCTYPE html><html><head><style>" outp << "<!DOCTYPE html><html><head><style>"
outp << style_defs outp << style_defs
outp << "</style></head><body>" outp << "</style></head><body>"
outp << text
outp << "</body></html>"
end end
output {output.to_s, "</body></html>"}
end end
private def line_label(i : Int32) : String private def line_label(i : Int32) : String
@ -61,27 +64,23 @@ module Tartrazine
"<span #{line_id} #{line_class} style=\"user-select: none;\">#{line_label} </span>" "<span #{line_id} #{line_class} style=\"user-select: none;\">#{line_label} </span>"
end end
def format_text(text : String, lexer : Lexer) : String def format_text(text : String, lexer : Lexer, outp : IO)
# lines = lexer.group_tokens_in_lines(lexer.tokenize(text))
tokenizer = Tokenizer.new(lexer, text) tokenizer = Tokenizer.new(lexer, text)
i = 0 i = 0
output = String.build do |outp| if surrounding_pre?
if surrounding_pre? pre_style = wrap_long_lines? ? "style=\"white-space: pre-wrap; word-break: break-word;\"" : ""
pre_style = wrap_long_lines? ? "style=\"white-space: pre-wrap; word-break: break-word;\"" : "" outp << "<pre class=\"#{get_css_class("Background")}\" #{pre_style}>"
outp << "<pre class=\"#{get_css_class("Background")}\" #{pre_style}>"
end
outp << "<code class=\"#{get_css_class("Background")}\">"
outp << line_label(i) if line_numbers?
tokenizer.each do |token|
outp << "<span class=\"#{get_css_class(token[:type])}\">#{HTML.escape(token[:value])}</span>"
if token[:value].ends_with? "\n"
i += 1
outp << line_label(i) if line_numbers?
end
end
outp << "</code></pre>"
end end
output outp << "<code class=\"#{get_css_class("Background")}\">"
outp << line_label(i) if line_numbers?
tokenizer.each do |token|
outp << "<span class=\"#{get_css_class(token[:type])}\">#{HTML.escape(token[:value])}</span>"
if token[:value].ends_with? "\n"
i += 1
outp << line_label(i) if line_numbers?
end
end
outp << "</code></pre>"
end end
# ameba:disable Metrics/CyclomaticComplexity # ameba:disable Metrics/CyclomaticComplexity

View File

@ -4,8 +4,15 @@ module Tartrazine
class Json < Formatter class Json < Formatter
property name = "json" property name = "json"
def format(text : String, lexer : Lexer, _theme : Theme) : String def format(text : String, lexer : Lexer) : String
lexer.tokenize(text).to_json outp = String::Builder.new("")
format(text, lexer, outp)
outp.to_s
end
def format(text : String, lexer : Lexer, io : IO) : Nil
tokenizer = Tokenizer.new(lexer, text)
io << Tartrazine::Lexer.collapse_tokens(tokenizer.to_a).to_json
end end
end end
end end

View File

@ -85,13 +85,11 @@ if options["-f"]
lexer = Tartrazine.lexer(name: options["-l"].as(String), filename: options["FILE"].as(String)) lexer = Tartrazine.lexer(name: options["-l"].as(String), filename: options["FILE"].as(String))
input = File.open(options["FILE"].as(String)).gets_to_end input = File.open(options["FILE"].as(String)).gets_to_end
output = formatter.format(input, lexer)
if options["-o"].nil? if options["-o"].nil?
puts output outf = STDOUT
else else
File.open(options["-o"].as(String), "w") do |outf| outf = File.open(options["-o"].as(String), "w")
outf << output
end
end end
formatter.format(input, lexer, outf)
end end