diff --git a/spec/std/colorize_spec.cr b/spec/std/colorize_spec.cr index 0ac84cbbc4ba..8d30698b6964 100644 --- a/spec/std/colorize_spec.cr +++ b/spec/std/colorize_spec.cr @@ -87,78 +87,78 @@ describe "colorize" do end it "colorizes foreground" do - colorize("hello").black.to_s.should eq("\e[30mhello\e[0m") - colorize("hello").red.to_s.should eq("\e[31mhello\e[0m") - colorize("hello").green.to_s.should eq("\e[32mhello\e[0m") - colorize("hello").yellow.to_s.should eq("\e[33mhello\e[0m") - colorize("hello").blue.to_s.should eq("\e[34mhello\e[0m") - colorize("hello").magenta.to_s.should eq("\e[35mhello\e[0m") - colorize("hello").cyan.to_s.should eq("\e[36mhello\e[0m") - colorize("hello").light_gray.to_s.should eq("\e[37mhello\e[0m") - colorize("hello").dark_gray.to_s.should eq("\e[90mhello\e[0m") - colorize("hello").light_red.to_s.should eq("\e[91mhello\e[0m") - colorize("hello").light_green.to_s.should eq("\e[92mhello\e[0m") - colorize("hello").light_yellow.to_s.should eq("\e[93mhello\e[0m") - colorize("hello").light_blue.to_s.should eq("\e[94mhello\e[0m") - colorize("hello").light_magenta.to_s.should eq("\e[95mhello\e[0m") - colorize("hello").light_cyan.to_s.should eq("\e[96mhello\e[0m") - colorize("hello").white.to_s.should eq("\e[97mhello\e[0m") + colorize("hello").black.to_s.should eq("\e[30mhello\e[39m") + colorize("hello").red.to_s.should eq("\e[31mhello\e[39m") + colorize("hello").green.to_s.should eq("\e[32mhello\e[39m") + colorize("hello").yellow.to_s.should eq("\e[33mhello\e[39m") + colorize("hello").blue.to_s.should eq("\e[34mhello\e[39m") + colorize("hello").magenta.to_s.should eq("\e[35mhello\e[39m") + colorize("hello").cyan.to_s.should eq("\e[36mhello\e[39m") + colorize("hello").light_gray.to_s.should eq("\e[37mhello\e[39m") + colorize("hello").dark_gray.to_s.should eq("\e[90mhello\e[39m") + colorize("hello").light_red.to_s.should eq("\e[91mhello\e[39m") + colorize("hello").light_green.to_s.should eq("\e[92mhello\e[39m") + colorize("hello").light_yellow.to_s.should eq("\e[93mhello\e[39m") + colorize("hello").light_blue.to_s.should eq("\e[94mhello\e[39m") + colorize("hello").light_magenta.to_s.should eq("\e[95mhello\e[39m") + colorize("hello").light_cyan.to_s.should eq("\e[96mhello\e[39m") + colorize("hello").white.to_s.should eq("\e[97mhello\e[39m") end it "colorizes foreground with 8-bit color" do - colorize("hello").fore(Colorize::Color256.new(123u8)).to_s.should eq("\e[38;5;123mhello\e[0m") - colorize("hello").fore(123u8).to_s.should eq("\e[38;5;123mhello\e[0m") - colorize("hello", 123_u8).to_s.should eq("\e[38;5;123mhello\e[0m") + colorize("hello").fore(Colorize::Color256.new(123u8)).to_s.should eq("\e[38;5;123mhello\e[39m") + colorize("hello").fore(123u8).to_s.should eq("\e[38;5;123mhello\e[39m") + colorize("hello", 123_u8).to_s.should eq("\e[38;5;123mhello\e[39m") end it "colorizes foreground with true color" do - colorize("hello").fore(Colorize::ColorRGB.new(12u8, 34u8, 56u8)).to_s.should eq("\e[38;2;12;34;56mhello\e[0m") - colorize("hello").fore(12u8, 34u8, 56u8).to_s.should eq("\e[38;2;12;34;56mhello\e[0m") - colorize("hello", 12u8, 34u8, 56u8).to_s.should eq("\e[38;2;12;34;56mhello\e[0m") + colorize("hello").fore(Colorize::ColorRGB.new(12u8, 34u8, 56u8)).to_s.should eq("\e[38;2;12;34;56mhello\e[39m") + colorize("hello").fore(12u8, 34u8, 56u8).to_s.should eq("\e[38;2;12;34;56mhello\e[39m") + colorize("hello", 12u8, 34u8, 56u8).to_s.should eq("\e[38;2;12;34;56mhello\e[39m") end it "colorizes background" do - colorize("hello").on_black.to_s.should eq("\e[40mhello\e[0m") - colorize("hello").on_red.to_s.should eq("\e[41mhello\e[0m") - colorize("hello").on_green.to_s.should eq("\e[42mhello\e[0m") - colorize("hello").on_yellow.to_s.should eq("\e[43mhello\e[0m") - colorize("hello").on_blue.to_s.should eq("\e[44mhello\e[0m") - colorize("hello").on_magenta.to_s.should eq("\e[45mhello\e[0m") - colorize("hello").on_cyan.to_s.should eq("\e[46mhello\e[0m") - colorize("hello").on_light_gray.to_s.should eq("\e[47mhello\e[0m") - colorize("hello").on_dark_gray.to_s.should eq("\e[100mhello\e[0m") - colorize("hello").on_light_red.to_s.should eq("\e[101mhello\e[0m") - colorize("hello").on_light_green.to_s.should eq("\e[102mhello\e[0m") - colorize("hello").on_light_yellow.to_s.should eq("\e[103mhello\e[0m") - colorize("hello").on_light_blue.to_s.should eq("\e[104mhello\e[0m") - colorize("hello").on_light_magenta.to_s.should eq("\e[105mhello\e[0m") - colorize("hello").on_light_cyan.to_s.should eq("\e[106mhello\e[0m") - colorize("hello").on_white.to_s.should eq("\e[107mhello\e[0m") + colorize("hello").on_black.to_s.should eq("\e[40mhello\e[49m") + colorize("hello").on_red.to_s.should eq("\e[41mhello\e[49m") + colorize("hello").on_green.to_s.should eq("\e[42mhello\e[49m") + colorize("hello").on_yellow.to_s.should eq("\e[43mhello\e[49m") + colorize("hello").on_blue.to_s.should eq("\e[44mhello\e[49m") + colorize("hello").on_magenta.to_s.should eq("\e[45mhello\e[49m") + colorize("hello").on_cyan.to_s.should eq("\e[46mhello\e[49m") + colorize("hello").on_light_gray.to_s.should eq("\e[47mhello\e[49m") + colorize("hello").on_dark_gray.to_s.should eq("\e[100mhello\e[49m") + colorize("hello").on_light_red.to_s.should eq("\e[101mhello\e[49m") + colorize("hello").on_light_green.to_s.should eq("\e[102mhello\e[49m") + colorize("hello").on_light_yellow.to_s.should eq("\e[103mhello\e[49m") + colorize("hello").on_light_blue.to_s.should eq("\e[104mhello\e[49m") + colorize("hello").on_light_magenta.to_s.should eq("\e[105mhello\e[49m") + colorize("hello").on_light_cyan.to_s.should eq("\e[106mhello\e[49m") + colorize("hello").on_white.to_s.should eq("\e[107mhello\e[49m") end it "colorizes background with 8-bit color" do - colorize("hello").back(Colorize::Color256.new(123u8)).to_s.should eq("\e[48;5;123mhello\e[0m") - colorize("hello").back(123u8).to_s.should eq("\e[48;5;123mhello\e[0m") + colorize("hello").back(Colorize::Color256.new(123u8)).to_s.should eq("\e[48;5;123mhello\e[49m") + colorize("hello").back(123u8).to_s.should eq("\e[48;5;123mhello\e[49m") end it "colorizes background with true color" do - colorize("hello").back(Colorize::ColorRGB.new(12u8, 34u8, 56u8)).to_s.should eq("\e[48;2;12;34;56mhello\e[0m") - colorize("hello").back(12u8, 34u8, 56u8).to_s.should eq("\e[48;2;12;34;56mhello\e[0m") + colorize("hello").back(Colorize::ColorRGB.new(12u8, 34u8, 56u8)).to_s.should eq("\e[48;2;12;34;56mhello\e[49m") + colorize("hello").back(12u8, 34u8, 56u8).to_s.should eq("\e[48;2;12;34;56mhello\e[49m") end it "colorizes mode" do - colorize("hello").bold.to_s.should eq("\e[1mhello\e[0m") - colorize("hello").bright.to_s.should eq("\e[1mhello\e[0m") - colorize("hello").dim.to_s.should eq("\e[2mhello\e[0m") - colorize("hello").italic.to_s.should eq("\e[3mhello\e[0m") - colorize("hello").underline.to_s.should eq("\e[4mhello\e[0m") - colorize("hello").blink.to_s.should eq("\e[5mhello\e[0m") - colorize("hello").blink_fast.to_s.should eq("\e[6mhello\e[0m") - colorize("hello").reverse.to_s.should eq("\e[7mhello\e[0m") - colorize("hello").hidden.to_s.should eq("\e[8mhello\e[0m") - colorize("hello").strikethrough.to_s.should eq("\e[9mhello\e[0m") - colorize("hello").double_underline.to_s.should eq("\e[21mhello\e[0m") - colorize("hello").overline.to_s.should eq("\e[53mhello\e[0m") + colorize("hello").bold.to_s.should eq("\e[1mhello\e[22m") + colorize("hello").bright.to_s.should eq("\e[1mhello\e[22m") + colorize("hello").dim.to_s.should eq("\e[2mhello\e[22m") + colorize("hello").italic.to_s.should eq("\e[3mhello\e[23m") + colorize("hello").underline.to_s.should eq("\e[4mhello\e[24m") + colorize("hello").blink.to_s.should eq("\e[5mhello\e[25m") + colorize("hello").blink_fast.to_s.should eq("\e[6mhello\e[26m") + colorize("hello").reverse.to_s.should eq("\e[7mhello\e[27m") + colorize("hello").hidden.to_s.should eq("\e[8mhello\e[28m") + colorize("hello").strikethrough.to_s.should eq("\e[9mhello\e[29m") + colorize("hello").double_underline.to_s.should eq("\e[21mhello\e[24m") + colorize("hello").overline.to_s.should eq("\e[53mhello\e[55m") end it "prints colorize ANSI escape codes" do @@ -182,24 +182,24 @@ describe "colorize" do end it "colorizes mode combination" do - colorize("hello").bold.dim.underline.blink.reverse.hidden.to_s.should eq("\e[1;2;4;5;7;8mhello\e[0m") + colorize("hello").bold.dim.underline.blink.reverse.hidden.to_s.should eq("\e[1;2;4;5;7;8mhello\e[22;22;24;25;27;28m") end it "colorizes foreground with background" do - colorize("hello").blue.on_green.to_s.should eq("\e[34;42mhello\e[0m") + colorize("hello").blue.on_green.to_s.should eq("\e[34;42mhello\e[39;49m") end it "colorizes foreground with background with mode" do - colorize("hello").blue.on_green.bold.to_s.should eq("\e[34;42;1mhello\e[0m") + colorize("hello").blue.on_green.bold.to_s.should eq("\e[34;42;1mhello\e[39;49;22m") end it "colorizes foreground with symbol" do - colorize("hello", :red).to_s.should eq("\e[31mhello\e[0m") - colorize("hello").fore(:red).to_s.should eq("\e[31mhello\e[0m") + colorize("hello", :red).to_s.should eq("\e[31mhello\e[39m") + colorize("hello").fore(:red).to_s.should eq("\e[31mhello\e[39m") end it "colorizes mode with symbol" do - colorize("hello").mode(:bold).to_s.should eq("\e[1mhello\e[0m") + colorize("hello").mode(:bold).to_s.should eq("\e[1mhello\e[22m") end it "raises on unknown foreground color" do @@ -215,7 +215,7 @@ describe "colorize" do end it "inspects" do - colorize("hello", :red).inspect.should eq("\e[31m\"hello\"\e[0m") + colorize("hello", :red).inspect.should eq("\e[31m\"hello\"\e[39m") end it "colorizes with surround" do @@ -227,7 +227,7 @@ describe "colorize" do end io << "bye" end - io.to_s.should eq("\e[31mhello\e[0;32mworld\e[0;31mbye\e[0m") + io.to_s.should eq("\e[31mhello\e[39;32mworld\e[39;31mbye\e[39m") end it "colorizes with surround and reset" do @@ -239,7 +239,7 @@ describe "colorize" do end io << "bye" end - io.to_s.should eq("\e[31mhello\e[0;32;1mworld\e[0;31mbye\e[0m") + io.to_s.should eq("\e[31mhello\e[39;32;1mworld\e[39;22;31mbye\e[39m") end it "colorizes with surround and no reset" do @@ -251,7 +251,7 @@ describe "colorize" do end io << "bye" end - io.to_s.should eq("\e[31mhelloworldbye\e[0m") + io.to_s.should eq("\e[31mhelloworldbye\e[39m") end it "colorizes with surround and default" do @@ -263,11 +263,11 @@ describe "colorize" do end io << "bye" end - io.to_s.should eq("\e[31mhello\e[0mworld\e[31mbye\e[0m") + io.to_s.should eq("\e[31mhello\e[39mworld\e[31mbye\e[39m") end it "colorizes with to_s" do - colorize(ColorizeToS.new).red.to_s.should eq("\e[31mhello\e[0;34mworld\e[0;31mbye\e[0m") + colorize(ColorizeToS.new).red.to_s.should eq("\e[31mhello\e[39;34mworld\e[39;31mbye\e[39m") end it "toggles off" do @@ -276,6 +276,13 @@ describe "colorize" do end it "toggles off and on" do - colorize("hello").toggle(false).black.toggle(true).to_s.should eq("\e[30mhello\e[0m") + colorize("hello").toggle(false).black.toggle(true).to_s.should eq("\e[30mhello\e[39m") + end + + it "colorizes nested strings" do + colorize("hello #{colorize("foo").red} bar").underline.to_s.should eq("\e[4mhello \e[31mfoo\e[39m bar\e[24m") + + # TODO: Ideally this should work + # colorize("hello #{colorize("foo").red} bar").green.to_s.should eq "\e[32mhello \e[39m\e[31mfoo\e[39m\e[32m bar\e[39m" end end diff --git a/spec/std/crystal/syntax_highlighter/colorize_spec.cr b/spec/std/crystal/syntax_highlighter/colorize_spec.cr index 74bc591ac51b..4f53911e8c7d 100644 --- a/spec/std/crystal/syntax_highlighter/colorize_spec.cr +++ b/spec/std/crystal/syntax_highlighter/colorize_spec.cr @@ -27,29 +27,29 @@ end describe Crystal::SyntaxHighlighter::Colorize do describe ".highlight" do - it_highlights %(foo = bar("baz\#{PI + 1}") # comment), %(foo \e[91m=\e[0m bar(\e[93m"baz\#{\e[0m\e[36mPI\e[0m \e[91m+\e[0m \e[35m1\e[0m\e[93m}"\e[0m) \e[90m# comment\e[0m) + it_highlights %(foo = bar("baz\#{PI + 1}") # comment), %(foo \e[91m=\e[39m bar(\e[93m"baz\#{\e[39m\e[36mPI\e[39m \e[91m+\e[39m \e[35m1\e[39m\e[93m}"\e[39m) \e[90m# comment\e[39m) it_highlights "foo", "foo" it_highlights "foo bar", "foo bar" it_highlights "foo\nbar", "foo\nbar" - it_highlights "# foo", %(\e[90m# foo\e[0m) - it_highlights "# bar\n", %(\e[90m# bar\e[0m\n) - it_highlights "# foo\n# bar\n", %(\e[90m# foo\e[0m\n\e[90m# bar\e[0m\n) - it_highlights %(# <">), %(\e[90m# <">\e[0m) + it_highlights "# foo", %(\e[90m# foo\e[39m) + it_highlights "# bar\n", %(\e[90m# bar\e[39m\n) + it_highlights "# foo\n# bar\n", %(\e[90m# foo\e[39m\n\e[90m# bar\e[39m\n) + it_highlights %(# <">), %(\e[90m# <">\e[39m) - it_highlights "42", %(\e[35m42\e[0m) - it_highlights "3.14", %(\e[35m3.14\e[0m) - it_highlights "123_i64", %(\e[35m123_i64\e[0m) + it_highlights "42", %(\e[35m42\e[39m) + it_highlights "3.14", %(\e[35m3.14\e[39m) + it_highlights "123_i64", %(\e[35m123_i64\e[39m) - it_highlights "'a'", %(\e[93m'a'\e[0m) - it_highlights "'<'", %(\e[93m'<'\e[0m) + it_highlights "'a'", %(\e[93m'a'\e[39m) + it_highlights "'<'", %(\e[93m'<'\e[39m) - it_highlights ":foo", %(\e[35m:foo\e[0m) - it_highlights %(:"foo"), %(\e[35m:"foo"\e[0m) + it_highlights ":foo", %(\e[35m:foo\e[39m) + it_highlights %(:"foo"), %(\e[35m:"foo"\e[39m) - it_highlights "Foo", %(\e[36mFoo\e[0m) - it_highlights "Foo::Bar", %(\e[36mFoo\e[0m\e[36m::\e[0m\e[36mBar\e[0m) + it_highlights "Foo", %(\e[36mFoo\e[39m) + it_highlights "Foo::Bar", %(\e[36mFoo\e[39m\e[36m::\e[39m\e[36mBar\e[39m) %w( def if else elsif end class module include @@ -61,16 +61,16 @@ describe Crystal::SyntaxHighlighter::Colorize do protected uninitialized instance_sizeof instance_alignof offsetof annotation verbatim ).each do |kw| - it_highlights kw, %(\e[91m#{kw}\e[0m) + it_highlights kw, %(\e[91m#{kw}\e[39m) end - it_highlights "self", %(\e[34mself\e[0m) + it_highlights "self", %(\e[34mself\e[39m) %w(true false nil).each do |lit| - it_highlights lit, %(\e[35m#{lit}\e[0m) + it_highlights lit, %(\e[35m#{lit}\e[39m) end - it_highlights "def foo", %(\e[91mdef\e[0m \e[92mfoo\e[0m) + it_highlights "def foo", %(\e[91mdef\e[39m \e[92mfoo\e[39m) %w( [] []? []= <=> @@ -78,54 +78,54 @@ describe Crystal::SyntaxHighlighter::Colorize do == < <= > >= != =~ !~ & | ^ ~ ** >> << % ).each do |op| - it_highlights %(def #{op}), %(\e[91mdef\e[0m \e[92m#{op}\e[0m) + it_highlights %(def #{op}), %(\e[91mdef\e[39m \e[92m#{op}\e[39m) end - it_highlights %(def //), %(\e[91mdef\e[0m \e[92m/\e[0m\e[92m/\e[0m) + it_highlights %(def //), %(\e[91mdef\e[39m \e[92m/\e[39m\e[92m/\e[39m) %w( + - * &+ &- &* &** / // = == < <= > >= ! != =~ !~ & | ^ ~ ** >> << % [] []? []= <=> === && || += -= *= /= //= &= |= ^= **= >>= <<= %= &+= &-= &*= &&= ||= ).each do |op| - it_highlights "1 #{op} 2", %(\e[35m1\e[0m \e[91m#{op}\e[0m \e[35m2\e[0m) + it_highlights "1 #{op} 2", %(\e[35m1\e[39m \e[91m#{op}\e[39m \e[35m2\e[39m) end - it_highlights %(1/2), %(\e[35m1\e[0m\e[91m/\e[0m\e[35m2\e[0m) - it_highlights %(1 /2), %(\e[35m1\e[0m \e[91m/\e[0m\e[35m2\e[0m) - it_highlights %(1/ 2), %(\e[35m1\e[0m\e[91m/\e[0m \e[35m2\e[0m) + it_highlights %(1/2), %(\e[35m1\e[39m\e[91m/\e[39m\e[35m2\e[39m) + it_highlights %(1 /2), %(\e[35m1\e[39m \e[91m/\e[39m\e[35m2\e[39m) + it_highlights %(1/ 2), %(\e[35m1\e[39m\e[91m/\e[39m \e[35m2\e[39m) - it_highlights %(a/b), %(a\e[91m/\e[0mb) - it_highlights %(a/ b), %(a\e[91m/\e[0m b) - it_highlights %(a / b), %(a \e[91m/\e[0m b) + it_highlights %(a/b), %(a\e[91m/\e[39mb) + it_highlights %(a/ b), %(a\e[91m/\e[39m b) + it_highlights %(a / b), %(a \e[91m/\e[39m b) - it_highlights %(a /b/), %(a \e[93m/b/\e[0m) + it_highlights %(a /b/), %(a \e[93m/b/\e[39m) it_highlights %($1), %($1) it_highlights %($2?), %($2?) it_highlights %($?), %($?) it_highlights %($~), %($~) - it_highlights %("foo"), %(\e[93m"foo"\e[0m) - it_highlights %("<>"), %(\e[93m"<>"\e[0m) - it_highlights %("foo\#{bar}baz"), %(\e[93m"foo\#{\e[0mbar\e[93m}baz"\e[0m) - it_highlights %("foo\#{[1, bar, "str"]}baz"), %(\e[93m"foo\#{\e[0m[\e[35m1\e[0m, bar, \e[93m"str"\e[0m]\e[93m}baz"\e[0m) - it_highlights %("nest1\#{foo + "nest2\#{1 + 1}bar"}baz"), %(\e[93m"nest1\#{\e[0mfoo \e[91m+\e[0m \e[93m"nest2\#{\e[0m\e[35m1\e[0m \e[91m+\e[0m \e[35m1\e[0m\e[93m}bar"\e[0m\e[93m}baz"\e[0m) - it_highlights "/foo/xim", %(\e[93m/foo/\e[0mxim) - it_highlights "`foo`", %(\e[93m`foo`\e[0m) - it_highlights "%(foo)", %(\e[93m%(foo)\e[0m) - it_highlights "%", %(\e[93m%\e[0m) - it_highlights "%q(foo)", %(\e[93m%q(foo)\e[0m) - it_highlights "%Q(foo)", %(\e[93m%Q(foo)\e[0m) - it_highlights "%r(foo)xim", %(\e[93m%r(foo)\e[0mxim) - it_highlights "%x(foo)", %(\e[93m%x(foo)\e[0m) - - it_highlights "%w(foo bar baz)", %(\e[93m%w(foo bar baz)\e[0m) - it_highlights "%w(foo bar\n baz)", %(\e[93m%w(foo bar\n baz)\e[0m) - it_highlights "%w", %(\e[93m%w\e[0m) - it_highlights "%i(foo bar baz)", %(\e[93m%i(foo bar baz)\e[0m) - - it_highlights "Set{1, 2, 3}", %(\e[36mSet\e[0m{\e[35m1\e[0m, \e[35m2\e[0m, \e[35m3\e[0m}) + it_highlights %("foo"), %(\e[93m"foo"\e[39m) + it_highlights %("<>"), %(\e[93m"<>"\e[39m) + it_highlights %("foo\#{bar}baz"), %(\e[93m"foo\#{\e[39mbar\e[93m}baz"\e[39m) + it_highlights %("foo\#{[1, bar, "str"]}baz"), %(\e[93m"foo\#{\e[39m[\e[35m1\e[39m, bar, \e[93m"str"\e[39m]\e[93m}baz"\e[39m) + it_highlights %("nest1\#{foo + "nest2\#{1 + 1}bar"}baz"), %(\e[93m"nest1\#{\e[39mfoo \e[91m+\e[39m \e[93m"nest2\#{\e[39m\e[35m1\e[39m \e[91m+\e[39m \e[35m1\e[39m\e[93m}bar"\e[39m\e[93m}baz"\e[39m) + it_highlights "/foo/xim", %(\e[93m/foo/\e[39mxim) + it_highlights "`foo`", %(\e[93m`foo`\e[39m) + it_highlights "%(foo)", %(\e[93m%(foo)\e[39m) + it_highlights "%", %(\e[93m%\e[39m) + it_highlights "%q(foo)", %(\e[93m%q(foo)\e[39m) + it_highlights "%Q(foo)", %(\e[93m%Q(foo)\e[39m) + it_highlights "%r(foo)xim", %(\e[93m%r(foo)\e[39mxim) + it_highlights "%x(foo)", %(\e[93m%x(foo)\e[39m) + + it_highlights "%w(foo bar baz)", %(\e[93m%w(foo bar baz)\e[39m) + it_highlights "%w(foo bar\n baz)", %(\e[93m%w(foo bar\n baz)\e[39m) + it_highlights "%w", %(\e[93m%w\e[39m) + it_highlights "%i(foo bar baz)", %(\e[93m%i(foo bar baz)\e[39m) + + it_highlights "Set{1, 2, 3}", %(\e[36mSet\e[39m{\e[35m1\e[39m, \e[35m2\e[39m, \e[35m3\e[39m}) it_highlights <<-CRYSTAL, <<-ANSI foo, bar = <<-FOO, <<-BAR @@ -134,16 +134,16 @@ describe Crystal::SyntaxHighlighter::Colorize do bar BAR CRYSTAL - foo, bar \e[91m=\e[0m \e[93m<<-FOO\e[0m, \e[93m<<-BAR\e[0m + foo, bar \e[91m=\e[39m \e[93m<<-FOO\e[39m, \e[93m<<-BAR\e[39m \e[93m foo - FOO\e[0m + FOO\e[39m \e[93m bar - BAR\e[0m + BAR\e[39m ANSI end describe ".highlight!" do - it_highlights! %(foo = bar("baz\#{PI + 1}") # comment), %(foo \e[91m=\e[0m bar(\e[93m"baz\#{\e[0m\e[36mPI\e[0m \e[91m+\e[0m \e[35m1\e[0m\e[93m}"\e[0m) \e[90m# comment\e[0m) + it_highlights! %(foo = bar("baz\#{PI + 1}") # comment), %(foo \e[91m=\e[39m bar(\e[93m"baz\#{\e[39m\e[36mPI\e[39m \e[91m+\e[39m \e[35m1\e[39m\e[93m}"\e[39m) \e[90m# comment\e[39m) it_highlights! <<-CRYSTAL foo, bar = <<-FOO, <<-BAR diff --git a/src/colorize.cr b/src/colorize.cr index 41ab5d11b997..0ee5d333e9b4 100644 --- a/src/colorize.cr +++ b/src/colorize.cr @@ -335,6 +335,20 @@ private def each_code(mode : Colorize::Mode, &) yield "53" if mode.overline? end +private def each_reset_code(mode : Colorize::Mode, &) + yield "22" if mode.bold? + yield "22" if mode.dim? + yield "23" if mode.italic? + yield "24" if mode.underline? + yield "25" if mode.blink? + yield "26" if mode.blink_fast? + yield "27" if mode.reverse? + yield "28" if mode.hidden? + yield "29" if mode.strikethrough? + yield "24" if mode.double_underline? + yield "55" if mode.overline? +end + # A colorized object. Colors and text decorations can be modified. struct Colorize::Object(T) private COLORS = %w(default black red green yellow blue magenta cyan light_gray dark_gray light_red light_green light_yellow light_blue light_magenta light_cyan white) @@ -550,8 +564,24 @@ struct Colorize::Object(T) printed = false unless last_color_is_default - io << '0' - printed = true + unless @@last_color[:fore] == ColorANSI::Default + io << 39 + printed = true + end + + unless @@last_color[:back] == ColorANSI::Default + io << ';' if printed + io << 49 + printed = true + end + + unless @@last_color[:mode].none? + each_reset_code(@@last_color[:mode]) do |code| + io << ';' if printed + io << code + printed = true + end + end end unless fore_is_default