parity-RedCloth 4.2.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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