From 52f6fa0d0dbcf9244e93a16be7c6f685530b31b5 Mon Sep 17 00:00:00 2001 From: "Yann Esposito (Yogsototh)" Date: Wed, 6 Jan 2010 12:34:12 +0100 Subject: [PATCH] ajout du plugin pour la coloration syntaxique --- lib/syntaxColorize.rb | 68 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 lib/syntaxColorize.rb diff --git a/lib/syntaxColorize.rb b/lib/syntaxColorize.rb new file mode 100644 index 000000000..79bcad200 --- /dev/null +++ b/lib/syntaxColorize.rb @@ -0,0 +1,68 @@ +module Nanoc3::Helpers + + module SyntaxColorize + + require 'nanoc3/helpers/capturing' + include Nanoc3::Helpers::Capturing + + def syntax_colorize(lang, type=:ultraviolet, &block) + # Capture block + data = capture(&block) + + # Remove whitespace + lines = data.split("\n") + min_indent = lines.inject(nil) do |memo, line| + next memo if line =~ /^\s*$/ + next memo if line !~ /^(\s*)/ + [ memo, $1.size ].compact.min + end + lines.each do |line| + line[0,min_indent] = '' + end + data = lines.join("\n") + + # Process + case type + when :ultraviolet + begin + require 'uv' + if lang =~ /^(zsh|bash|sh|csh|shell)$/ + lang='shell-unix-generic' + end + filtered_data = Uv.parse(data, 'xhtml', lang, false, 'twilight') + rescue LoadError + unless $_WARNED_ABOUT_ULTRAVIOLET + warn "WARNING: Couldn't load uv; please install the ultraviolet gem. This message will not appear again." + end + $_WARNED_ABOUT_ULTRAVIOLET = true + + filtered_data = '
' + h(data) + '
' + end + + # Convert to HTML + filtered_data = filtered_data.strip.sub(%r{/ ?>}, '>') # convert to HTML + + # Add missing in
+        filtered_data.sub!(/^\s*(
)\s*/) { |m| "#{m}" }
+        filtered_data.sub!(/\s*(<\/pre>)\s*$/) { |m| "#{m}" }
+      when :coderay
+        # Find filter
+        klass = Nanoc3::Filter.named(:coderay)
+        filter = klass.new(@item_rep.assigns)
+        
+        # Filter captured data
+        filtered_data = filter.run(data, :language => lang).strip
+      else
+        raise ArgumentError, "invalid type: #{type}"
+      end
+
+      # Append filtered data to buffer
+      buffer = eval('_erbout', block.binding)
+      buffer << '
' if type == :coderay
+      buffer << filtered_data
+      buffer << '
' if type == :coderay + end + + end + +end