Class: PublifyApp::Textfilter::Code

Inherits:
TextFilterPlugin::MacroPre
  • Object
show all
Defined in:
lib/publify_app/textfilter_code.rb

Constant Summary collapse

DEFAULT_OPTIONS =
{ css: :class,
wrap: :span,
line_numbers: nil,
tab_width: 2,
bold_every: 5,
hint: false,
line_number_start: 1 }.freeze

Class Method Summary collapse

Class Method Details

.help_textObject



20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/publify_app/textfilter_code.rb', line 20

def self.help_text
  %{
You can use `<publify:code>` to include syntax-highlighted code blocks.  Example:

    <publify:code lang="ruby">
    class Foo
def bar
  "abcde"
end
    end
    </publify:code>

This uses the Ruby [Syntax](http://coderay.rubychan.de) module.  Options:

* **lang**.  Sets the programming language.  Currently supported languages are
*C, C++ (&#42;), CSS, Delphi, diff, Groovy (&#42;), HTML, Java, JavaScript, JSON,
PHP (&#42;), Python (&#42;), RHTML, Ruby, Scheme, SQL (&#42;), XHTML, XML, YAML.
&#42; Only available in CodeRay >= 0.9.1
* **linenumber**.  Turns on line numbering.  Use `linenumber="true"` to enable.
* **title**.  Adds a title block to the top of the code block.
}
end

.macrofilter(attrib, text = "") ⇒ Object



43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/publify_app/textfilter_code.rb', line 43

def self.macrofilter(attrib, text = "")
  lang = attrib["lang"]
  title = attrib["title"]
  options = if attrib["linenumber"] == "true"
              DEFAULT_OPTIONS.merge(line_numbers: :table,
                                    wrap: :div)
            else
              DEFAULT_OPTIONS
            end

  text = text.to_s.delete("\r").delete_prefix("\n").chomp

  begin
    text = CodeRay.scan(text, lang.downcase.to_sym).span(options)
  rescue
    text = HTMLEntities.new("xhtml1").encode(text)
  end
  text = "<notextile>#{text}</notextile>"

  titlecode = if title
                "<div class=\"codetitle\">#{title}</div>"
              else
                ""
              end

  "<div class=\"CodeRay\"><pre>#{titlecode}#{text}</pre></div>"
end