parity-RedCloth 4.2.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (65) hide show
  1. checksums.yaml +7 -0
  2. data/.gemtest +0 -0
  3. data/.rspec +1 -0
  4. data/CHANGELOG +265 -0
  5. data/COPYING +18 -0
  6. data/Gemfile +7 -0
  7. data/README.rdoc +215 -0
  8. data/Rakefile +18 -0
  9. data/bin/redcloth +28 -0
  10. data/doc/textile_reference.html +631 -0
  11. data/ext/redcloth_scan/extconf.rb +6 -0
  12. data/ext/redcloth_scan/redcloth.h +220 -0
  13. data/ext/redcloth_scan/redcloth_attributes.c +650 -0
  14. data/ext/redcloth_scan/redcloth_inline.c +8153 -0
  15. data/ext/redcloth_scan/redcloth_scan.c +24407 -0
  16. data/lib/case_sensitive_require/RedCloth.rb +6 -0
  17. data/lib/redcloth/erb_extension.rb +27 -0
  18. data/lib/redcloth/formatters/base.rb +63 -0
  19. data/lib/redcloth/formatters/html.rb +352 -0
  20. data/lib/redcloth/formatters/latex.rb +331 -0
  21. data/lib/redcloth/formatters/latex_entities.yml +2414 -0
  22. data/lib/redcloth/textile_doc.rb +113 -0
  23. data/lib/redcloth/version.rb +34 -0
  24. data/lib/redcloth.rb +45 -0
  25. data/lib/tasks/pureruby.rake +17 -0
  26. data/redcloth.gemspec +54 -0
  27. data/spec/benchmark_spec.rb +15 -0
  28. data/spec/custom_tags_spec.rb +50 -0
  29. data/spec/erb_spec.rb +10 -0
  30. data/spec/extension_spec.rb +26 -0
  31. data/spec/fixtures/basic.yml +1028 -0
  32. data/spec/fixtures/code.yml +257 -0
  33. data/spec/fixtures/definitions.yml +82 -0
  34. data/spec/fixtures/extra_whitespace.yml +64 -0
  35. data/spec/fixtures/filter_html.yml +177 -0
  36. data/spec/fixtures/filter_pba.yml +20 -0
  37. data/spec/fixtures/html.yml +348 -0
  38. data/spec/fixtures/images.yml +279 -0
  39. data/spec/fixtures/instiki.yml +38 -0
  40. data/spec/fixtures/links.yml +291 -0
  41. data/spec/fixtures/lists.yml +462 -0
  42. data/spec/fixtures/poignant.yml +89 -0
  43. data/spec/fixtures/sanitize_html.yml +42 -0
  44. data/spec/fixtures/table.yml +434 -0
  45. data/spec/fixtures/textism.yml +509 -0
  46. data/spec/fixtures/threshold.yml +762 -0
  47. data/spec/formatters/class_filtered_html_spec.rb +7 -0
  48. data/spec/formatters/filtered_html_spec.rb +7 -0
  49. data/spec/formatters/html_no_breaks_spec.rb +9 -0
  50. data/spec/formatters/html_spec.rb +13 -0
  51. data/spec/formatters/id_filtered_html_spec.rb +7 -0
  52. data/spec/formatters/latex_spec.rb +13 -0
  53. data/spec/formatters/lite_mode_html_spec.rb +7 -0
  54. data/spec/formatters/no_span_caps_html_spec.rb +7 -0
  55. data/spec/formatters/sanitized_html_spec.rb +7 -0
  56. data/spec/formatters/style_filtered_html_spec.rb +7 -0
  57. data/spec/parser_spec.rb +102 -0
  58. data/spec/spec_helper.rb +36 -0
  59. data/tasks/compile.rake +47 -0
  60. data/tasks/gems.rake +37 -0
  61. data/tasks/ragel_extension_task.rb +127 -0
  62. data/tasks/release.rake +15 -0
  63. data/tasks/rspec.rake +13 -0
  64. data/tasks/rvm.rake +79 -0
  65. metadata +239 -0
@@ -0,0 +1,113 @@
1
+ module RedCloth
2
+ class TextileDoc < String
3
+ #
4
+ # Accessors for setting security restrictions.
5
+ #
6
+ # This is a nice thing if you're using RedCloth for
7
+ # formatting in public places (e.g. Wikis) where you
8
+ # don't want users to abuse HTML for bad things.
9
+ #
10
+ # If +:filter_html+ is set, HTML which wasn't
11
+ # created by the Textile processor will be escaped.
12
+ # Alternatively, if +:sanitize_html+ is set,
13
+ # HTML can pass through the Textile processor but
14
+ # unauthorized tags and attributes will be removed.
15
+ #
16
+ # If +:filter_styles+ is set, it will also disable
17
+ # the style markup specifier. ('{color: red}')
18
+ #
19
+ # If +:filter_classes+ is set, it will also disable
20
+ # class attributes. ('!(classname)image!')
21
+ #
22
+ # If +:filter_ids+ is set, it will also disable
23
+ # id attributes. ('!(classname#id)image!')
24
+ #
25
+ attr_accessor :filter_html, :sanitize_html, :filter_styles, :filter_classes, :filter_ids
26
+
27
+ #
28
+ # Deprecated accessor for toggling hard breaks.
29
+ #
30
+ # Traditional RedCloth converted single newlines
31
+ # to HTML break tags, but later versions required
32
+ # +:hard_breaks+ be set to enable this behavior.
33
+ # +:hard_breaks+ is once again the default.
34
+ #
35
+ attr_accessor :hard_breaks
36
+
37
+ # Accessor for toggling lite mode.
38
+ #
39
+ # In lite mode, block-level rules are ignored. This means
40
+ # that tables, paragraphs, lists, and such aren't available.
41
+ # Only the inline markup for bold, italics, entities and so on.
42
+ #
43
+ # r = RedCloth.new( "And then? She *fell*!", [:lite_mode] )
44
+ # r.to_html
45
+ # #=> "And then? She <strong>fell</strong>!"
46
+ #
47
+ attr_accessor :lite_mode
48
+
49
+ #
50
+ # Accessor for toggling span caps.
51
+ #
52
+ # Textile places `span' tags around capitalized
53
+ # words by default, but this wreaks havoc on Wikis.
54
+ # If +:no_span_caps+ is set, this will be
55
+ # suppressed.
56
+ #
57
+ attr_accessor :no_span_caps
58
+
59
+ #
60
+ # If +:auto_link+ is set, plaintext urls will be
61
+ # turned into anchor elements.
62
+ #
63
+ # r = RedCloth.new( "Welcome http://zombo.com/", [:auto_link] )
64
+ # r.to_html
65
+ # #=> "<p>Welcome <a href="http://zombo.com/">http://zombo.com/</a></p>"
66
+ #
67
+ attr_accessor :auto_link_urls
68
+
69
+ # Returns a new RedCloth object, based on _string_, observing
70
+ # any _restrictions_ specified.
71
+ #
72
+ # r = RedCloth.new( "h1. A *bold* man" )
73
+ # #=> "h1. A *bold* man"
74
+ # r.to_html
75
+ # #=>"<h1>A <b>bold</b> man</h1>"
76
+ #
77
+ def initialize( string, restrictions = [] )
78
+ restrictions.each { |r| method("#{r}=").call( true ) }
79
+ super( string )
80
+ end
81
+
82
+ #
83
+ # Generates HTML from the Textile contents.
84
+ #
85
+ # RedCloth.new( "And then? She *fell*!" ).to_html
86
+ # #=>"<p>And then? She <strong>fell</strong>!</p>"
87
+ #
88
+ def to_html( *rules )
89
+ apply_rules(rules)
90
+
91
+ to(RedCloth::Formatters::HTML)
92
+ end
93
+
94
+ #
95
+ # Generates LaTeX from the Textile contents.
96
+ #
97
+ # RedCloth.new( "And then? She *fell*!" ).to_latex
98
+ # #=> "And then? She \\textbf{fell}!\n\n"
99
+ #
100
+ def to_latex( *rules )
101
+ apply_rules(rules)
102
+
103
+ to(RedCloth::Formatters::LATEX)
104
+ end
105
+
106
+ private
107
+ def apply_rules(rules)
108
+ rules.each do |r|
109
+ method(r).call(self) if self.respond_to?(r)
110
+ end
111
+ end
112
+ end
113
+ end
@@ -0,0 +1,34 @@
1
+ module RedCloth
2
+ module VERSION
3
+ MAJOR = 4
4
+ MINOR = 2
5
+ TINY = 9
6
+ RELEASE_CANDIDATE = nil
7
+
8
+ STRING = [MAJOR, MINOR, TINY, RELEASE_CANDIDATE].compact.join('.')
9
+ TAG = "REL_#{[MAJOR, MINOR, TINY, RELEASE_CANDIDATE].compact.join('_')}".upcase.gsub(/\.|-/, '_')
10
+ FULL_VERSION = "#{[MAJOR, MINOR, TINY, RELEASE_CANDIDATE].compact.join('.')}"
11
+
12
+ class << self
13
+ def to_s
14
+ STRING
15
+ end
16
+
17
+ def ==(arg)
18
+ STRING == arg
19
+ end
20
+ end
21
+ end
22
+
23
+ NAME = "RedCloth"
24
+ GEM_NAME = NAME
25
+ URL = "http://redcloth.org/"
26
+ description = "Textile parser for Ruby."
27
+
28
+ if RedCloth.const_defined?(:EXTENSION_LANGUAGE)
29
+ SUMMARY = "#{NAME}-#{VERSION::FULL_VERSION}-#{EXTENSION_LANGUAGE}"
30
+ else
31
+ SUMMARY = "#{NAME}-#{VERSION::FULL_VERSION}"
32
+ end
33
+ DESCRIPTION = SUMMARY + " - #{description}\n#{URL}"
34
+ end
data/lib/redcloth.rb ADDED
@@ -0,0 +1,45 @@
1
+ # If this is a frozen gem in Rails 2.1 and RedCloth 3.x was already
2
+ # loaded by Rails' ActionView::Helpers::TextHelper, the user will get
3
+ # "redcloth_scan.bundle: Class is not a module (TypeError)"
4
+ # This hack is to work around that Rails loading problem. The problem
5
+ # appears to be fixed in Edge Rails [51e4106].
6
+ Object.send(:remove_const, :RedCloth) if Object.const_defined?(:RedCloth) && RedCloth.is_a?(Class)
7
+
8
+ require 'rbconfig'
9
+ begin
10
+ conf = Object.const_get(defined?(RbConfig) ? :RbConfig : :Config)::CONFIG
11
+ prefix = conf['arch'] =~ /mswin|mingw/ ? "#{conf['MAJOR']}.#{conf['MINOR']}/" : ''
12
+ lib = "#{prefix}redcloth_scan"
13
+ require lib
14
+ rescue LoadError => e
15
+ e.message << %{\nCouldn't load #{lib}\nThe $LOAD_PATH was:\n#{$LOAD_PATH.join("\n")}}
16
+ raise e
17
+ end
18
+
19
+ require 'redcloth/version'
20
+ require 'redcloth/textile_doc'
21
+ require 'redcloth/formatters/base'
22
+ require 'redcloth/formatters/html'
23
+ require 'redcloth/formatters/latex'
24
+
25
+ module RedCloth
26
+
27
+ # A convenience method for creating a new TextileDoc. See
28
+ # RedCloth::TextileDoc.
29
+ def self.new( *args, &block )
30
+ RedCloth::TextileDoc.new( *args, &block )
31
+ end
32
+
33
+ # Include extension modules (if any) in TextileDoc.
34
+ def self.include(*args)
35
+ RedCloth::TextileDoc.send(:include, *args)
36
+ end
37
+
38
+ end
39
+
40
+ begin
41
+ require 'erb'
42
+ require 'redcloth/erb_extension'
43
+ include ERB::Util
44
+ rescue LoadError
45
+ end
@@ -0,0 +1,17 @@
1
+ # Apparently this file gets loaded by Rails. Only want to define the pureruby
2
+ # task in the context of RedCloth compilation (echoe loaded).
3
+
4
+ if Gem::Specification.const_defined?(:PLATFORM_CROSS_TARGETS)
5
+ Gem::Specification::PLATFORM_CROSS_TARGETS << "pureruby"
6
+
7
+ task 'pureruby' do
8
+ reset_target 'pureruby'
9
+ end
10
+
11
+ if target = ARGV.detect do |arg|
12
+ # Hack to get the platform set before the Rakefile evaluates
13
+ Gem::Specification::PLATFORM_CROSS_TARGETS.include? arg
14
+ end
15
+ reset_target target
16
+ end
17
+ end
data/redcloth.gemspec ADDED
@@ -0,0 +1,54 @@
1
+ # -*- encoding: utf-8 -*-
2
+ redcloth_dir = Dir.pwd =~ /redcloth\/tmp/ ? File.expand_path("../../../..", Dir.pwd) : File.expand_path("..", __FILE__)
3
+ $LOAD_PATH.unshift File.join(redcloth_dir, 'lib')
4
+ require "redcloth/version"
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "parity-RedCloth"
8
+ s.version = RedCloth::VERSION.to_s
9
+ s.authors = ["Jason Garber", "why the lucky stiff", "Ola Bini", "Jimish Jobanputra"]
10
+ s.description = "Textile parser for Ruby with auto_link support."
11
+ s.summary = RedCloth::SUMMARY
12
+ s.email = "jimish@desidime.com"
13
+ s.homepage = "http://redcloth.org"
14
+ s.rubyforge_project = "redcloth"
15
+
16
+ s.rubygems_version = "1.3.7"
17
+ s.default_executable = "redcloth"
18
+
19
+ s.files = Dir['.gemtest', '.rspec', 'CHANGELOG', 'COPYING', 'Gemfile', 'README.rdoc', 'Rakefile', 'doc/**/*', 'bin/**/*', 'lib/**/*', 'redcloth.gemspec', 'spec/**/*', 'tasks/**/*']
20
+ s.test_files = Dir['spec/**/*']
21
+ s.executables = ['redcloth']
22
+ s.extra_rdoc_files = ["README.rdoc", "COPYING", "CHANGELOG"]
23
+ s.rdoc_options = ["--charset=UTF-8", "--line-numbers", "--inline-source", "--title", "RedCloth", "--main", "README.rdoc"]
24
+ s.require_paths += ["lib/case_sensitive_require", "ext"]
25
+
26
+ s.files -= Dir['lib/redcloth.jar']
27
+ s.files -= Dir['lib/**/*.dll']
28
+ s.files -= Dir['lib/**/*.bundle']
29
+ s.files -= Dir['lib/**/*.so']
30
+
31
+ s.platform = RUBY_PLATFORM[/java/] || 'ruby'
32
+ case s.platform.to_s
33
+ when /java/
34
+ s.files += ['lib/redcloth_scan.jar']
35
+ else # MRI or Rubinius
36
+ s.files += %w[attributes inline scan].map {|f| "ext/redcloth_scan/redcloth_#{f}.c"}
37
+ s.files += ["ext/redcloth_scan/redcloth.h"]
38
+ s.extensions = Dir['ext/**/extconf.rb']
39
+ end
40
+
41
+ s.add_development_dependency('bundler', '~> 1.9.1')
42
+ s.add_development_dependency('rake', '~> 10.0.3')
43
+ s.add_development_dependency('rspec', '~> 2.4')
44
+ s.add_development_dependency('diff-lcs', '~> 1.1.2')
45
+
46
+ # Have to load these even though they're only needed for
47
+ # gem packaging. Otherwise, Bundler complains that they're
48
+ # not installed even though they're not required.
49
+ # See https://github.com/carlhuda/bundler/issues/issue/1021
50
+ s.add_development_dependency('rvm', '~> 1.2.6')
51
+ s.add_development_dependency('rake-compiler', '~> 0.7.1')
52
+
53
+ s.license = "MIT"
54
+ end
@@ -0,0 +1,15 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
3
+ describe "Benchmarking", :type => :formatter do
4
+ version = RedCloth::VERSION.is_a?(Module) ? RedCloth::VERSION::STRING : RedCloth::VERSION
5
+ platform = RedCloth.const_defined?(:EXTENSION_LANGUAGE) ? RedCloth::EXTENSION_LANGUAGE : (version < "4.0.0" ? "ruby-regex" : "C")
6
+
7
+ it "should not be too slow" do
8
+ # puts "Benchmarking version #{version} compiled in #{platform}..."
9
+ fixtures.each do |name, doc|
10
+ if doc['html']
11
+ RedCloth.new(doc['in']).to_html
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,50 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
3
+ module FigureTag
4
+ def fig( opts )
5
+ label, img = opts[:text].split('|').map! {|str| str.strip}
6
+
7
+ html = %Q{<div class="img" id="figure-#{label.tr('.', '-')}">\n}
8
+ html << %Q{ <a class="fig" href="/images/#{img}">\n}
9
+ html << %Q{ <img src="/images/thumbs/#{img}" alt="Figure #{label}" />\n}
10
+ html << %Q{ </a>\n}
11
+ html << %Q{ <p>Figure #{label}</p>\n}
12
+ html << %Q{<div>\n}
13
+ end
14
+ end
15
+
16
+ describe "custom tags" do
17
+ it "should recognize the custom tag" do
18
+ input = %Q{The first line of text.\n\n}
19
+ input << %Q{fig. 1.1 | img.jpg\n\n}
20
+ input << %Q{The last line of text.\n}
21
+ r = RedCloth.new input
22
+ r.extend FigureTag
23
+
24
+ html = %Q{<p>The first line of text.</p>\n}
25
+ html << %Q{<div class="img" id="figure-1-1">\n}
26
+ html << %Q{ <a class="fig" href="/images/img.jpg">\n}
27
+ html << %Q{ <img src="/images/thumbs/img.jpg" alt="Figure 1.1" />\n}
28
+ html << %Q{ </a>\n}
29
+ html << %Q{ <p>Figure 1.1</p>\n}
30
+ html << %Q{<div>\n}
31
+ html << %Q{<p>The last line of text.</p>}
32
+
33
+ r.to_html.should == html
34
+ end
35
+
36
+ it "should fall back if custom tag isn't defined" do
37
+ r = RedCloth.new %Q/fig()>[no]{color:red}. 1.1 | img.jpg/
38
+
39
+ r.to_html.should == "<p>fig()>[no]{color:red}. 1.1 | img.jpg</p>"
40
+ end
41
+
42
+ it "should not call just regular string methods" do
43
+ r = RedCloth.new "next. "
44
+ r.extend FigureTag
45
+
46
+ html = "<p>next. </p>"
47
+
48
+ r.to_html.should == html
49
+ end
50
+ end
data/spec/erb_spec.rb ADDED
@@ -0,0 +1,10 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
3
+ describe "ERB helper" do
4
+ it "should add a textile tag to ERB" do
5
+ template = %{<%=t "This new ERB tag makes is so _easy_ to use *RedCloth*" %>}
6
+ expected = %{<p>This new <span class="caps">ERB</span> tag makes is so <em>easy</em> to use <strong>RedCloth</strong></p>}
7
+
8
+ ERB.new(template).result.should == expected
9
+ end
10
+ end
@@ -0,0 +1,26 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
3
+ # http://www.ralree.info/2006/9/13/extending-redcloth
4
+ module RedClothSmileyExtension
5
+ def refs_smiley(text)
6
+ text.gsub!(/(\s)~(:P|:D|:O|:o|:S|:\||;\)|:'\(|:\)|:\()/) do |m|
7
+ bef,ma = $~[1..2]
8
+ filename = "/images/emoticons/"+(ma.unpack("c*").join('_'))+".png"
9
+ "#{bef}<img src='#{filename}' title='#{ma}' class='smiley' />"
10
+ end
11
+ end
12
+ end
13
+
14
+ RedCloth.send(:include, RedClothSmileyExtension)
15
+
16
+ describe RedClothSmileyExtension do
17
+
18
+ it "should include the extension" do
19
+ input = %Q{You're so silly! ~:P}
20
+
21
+ html = %Q{<p>You&#8217;re so silly! <img src='/images/emoticons/58_80.png' title=':P' class='smiley' /></p>}
22
+
23
+ RedCloth.new(input).to_html(:textile, :refs_smiley).should == html
24
+ end
25
+
26
+ end