radiant-smarty_pants_filter-extension 1.0.0
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.
- data/README +1 -0
- data/Rakefile +136 -0
- data/lib/radiant-smarty_pants_filter-extension.rb +2 -0
- data/lib/radiant-smarty_pants_filter-extension/version.rb +3 -0
- data/lib/smarty_pants_filter.rb +7 -0
- data/lib/smarty_pants_tags.rb +18 -0
- data/lib/tasks/smarty_pants_filter_extension_tasks.rake +28 -0
- data/radiant-smarty_pants_filter-extension.gemspec +30 -0
- data/smarty_pants_filter_extension.rb +18 -0
- data/smartypants.html +47 -0
- data/spec/models/smarty_pants_filter_spec.rb +19 -0
- data/spec/spec.opts +6 -0
- data/spec/spec_helper.rb +36 -0
- data/test/test_helper.rb +19 -0
- data/test/unit/smarty_pants_filter_test.rb +14 -0
- data/vendor/rubypants/README +114 -0
- data/vendor/rubypants/Rakefile +84 -0
- data/vendor/rubypants/install.rb +9 -0
- data/vendor/rubypants/rubypants.rb +490 -0
- data/vendor/rubypants/test_rubypants.rb +162 -0
- metadata +106 -0
data/README
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
Adds support for SmartyPants!
|
data/Rakefile
ADDED
@@ -0,0 +1,136 @@
|
|
1
|
+
begin
|
2
|
+
require 'jeweler'
|
3
|
+
Jeweler::Tasks.new do |gem|
|
4
|
+
gem.name = "radiant-smarty_pants_filter-extension"
|
5
|
+
gem.summary = %Q{Smarty Pants Filter Extension for Radiant CMS}
|
6
|
+
gem.description = %Q{Allows you to compose page parts or snippets using the SmartyPants text filter.}
|
7
|
+
gem.email = "radiant@radiantcms.org"
|
8
|
+
gem.homepage = "http://github.com/radiant/radiant-smarty_pants_filter-extension"
|
9
|
+
gem.authors = ["Radiant CMS dev team"]
|
10
|
+
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
11
|
+
end
|
12
|
+
rescue LoadError
|
13
|
+
puts "Jeweler (or a dependency) not available. This is only required if you plan to package smarty_pants_filter as a gem."
|
14
|
+
end
|
15
|
+
|
16
|
+
# In rails 1.2, plugins aren't available in the path until they're loaded.
|
17
|
+
# Check to see if the rspec plugin is installed first and require
|
18
|
+
# it if it is. If not, use the gem version.
|
19
|
+
|
20
|
+
# Determine where the RSpec plugin is by loading the boot
|
21
|
+
unless defined? RADIANT_ROOT
|
22
|
+
ENV["RAILS_ENV"] = "test"
|
23
|
+
case
|
24
|
+
when ENV["RADIANT_ENV_FILE"]
|
25
|
+
require File.dirname(ENV["RADIANT_ENV_FILE"]) + "/boot"
|
26
|
+
when File.dirname(__FILE__) =~ %r{vendor/radiant/vendor/extensions}
|
27
|
+
require "#{File.expand_path(File.dirname(__FILE__) + "/../../../../../")}/config/boot"
|
28
|
+
else
|
29
|
+
require "#{File.expand_path(File.dirname(__FILE__) + "/../../../")}/config/boot"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
require 'rake'
|
34
|
+
require 'rake/rdoctask'
|
35
|
+
require 'rake/testtask'
|
36
|
+
|
37
|
+
rspec_base = File.expand_path(RADIANT_ROOT + '/vendor/plugins/rspec/lib')
|
38
|
+
$LOAD_PATH.unshift(rspec_base) if File.exist?(rspec_base)
|
39
|
+
require 'spec/rake/spectask'
|
40
|
+
require 'cucumber'
|
41
|
+
require 'cucumber/rake/task'
|
42
|
+
|
43
|
+
# Cleanup the RADIANT_ROOT constant so specs will load the environment
|
44
|
+
Object.send(:remove_const, :RADIANT_ROOT)
|
45
|
+
|
46
|
+
extension_root = File.expand_path(File.dirname(__FILE__))
|
47
|
+
|
48
|
+
task :default => :spec
|
49
|
+
task :stats => "spec:statsetup"
|
50
|
+
|
51
|
+
desc "Run all specs in spec directory"
|
52
|
+
Spec::Rake::SpecTask.new(:spec) do |t|
|
53
|
+
t.spec_opts = ['--options', "\"#{extension_root}/spec/spec.opts\""]
|
54
|
+
t.spec_files = FileList['spec/**/*_spec.rb']
|
55
|
+
end
|
56
|
+
|
57
|
+
task :features => 'spec:integration'
|
58
|
+
|
59
|
+
namespace :spec do
|
60
|
+
desc "Run all specs in spec directory with RCov"
|
61
|
+
Spec::Rake::SpecTask.new(:rcov) do |t|
|
62
|
+
t.spec_opts = ['--options', "\"#{extension_root}/spec/spec.opts\""]
|
63
|
+
t.spec_files = FileList['spec/**/*_spec.rb']
|
64
|
+
t.rcov = true
|
65
|
+
t.rcov_opts = ['--exclude', 'spec', '--rails']
|
66
|
+
end
|
67
|
+
|
68
|
+
desc "Print Specdoc for all specs"
|
69
|
+
Spec::Rake::SpecTask.new(:doc) do |t|
|
70
|
+
t.spec_opts = ["--format", "specdoc", "--dry-run"]
|
71
|
+
t.spec_files = FileList['spec/**/*_spec.rb']
|
72
|
+
end
|
73
|
+
|
74
|
+
[:models, :controllers, :views, :helpers].each do |sub|
|
75
|
+
desc "Run the specs under spec/#{sub}"
|
76
|
+
Spec::Rake::SpecTask.new(sub) do |t|
|
77
|
+
t.spec_opts = ['--options', "\"#{extension_root}/spec/spec.opts\""]
|
78
|
+
t.spec_files = FileList["spec/#{sub}/**/*_spec.rb"]
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
desc "Run the Cucumber features"
|
83
|
+
Cucumber::Rake::Task.new(:integration) do |t|
|
84
|
+
t.fork = true
|
85
|
+
t.cucumber_opts = ['--format', (ENV['CUCUMBER_FORMAT'] || 'pretty')]
|
86
|
+
# t.feature_pattern = "#{extension_root}/features/**/*.feature"
|
87
|
+
t.profile = "default"
|
88
|
+
end
|
89
|
+
|
90
|
+
# Setup specs for stats
|
91
|
+
task :statsetup do
|
92
|
+
require 'code_statistics'
|
93
|
+
::STATS_DIRECTORIES << %w(Model\ specs spec/models)
|
94
|
+
::STATS_DIRECTORIES << %w(View\ specs spec/views)
|
95
|
+
::STATS_DIRECTORIES << %w(Controller\ specs spec/controllers)
|
96
|
+
::STATS_DIRECTORIES << %w(Helper\ specs spec/views)
|
97
|
+
::CodeStatistics::TEST_TYPES << "Model specs"
|
98
|
+
::CodeStatistics::TEST_TYPES << "View specs"
|
99
|
+
::CodeStatistics::TEST_TYPES << "Controller specs"
|
100
|
+
::CodeStatistics::TEST_TYPES << "Helper specs"
|
101
|
+
::STATS_DIRECTORIES.delete_if {|a| a[0] =~ /test/}
|
102
|
+
end
|
103
|
+
|
104
|
+
namespace :db do
|
105
|
+
namespace :fixtures do
|
106
|
+
desc "Load fixtures (from spec/fixtures) into the current environment's database. Load specific fixtures using FIXTURES=x,y"
|
107
|
+
task :load => :environment do
|
108
|
+
require 'active_record/fixtures'
|
109
|
+
ActiveRecord::Base.establish_connection(RAILS_ENV.to_sym)
|
110
|
+
(ENV['FIXTURES'] ? ENV['FIXTURES'].split(/,/) : Dir.glob(File.join(RAILS_ROOT, 'spec', 'fixtures', '*.{yml,csv}'))).each do |fixture_file|
|
111
|
+
Fixtures.create_fixtures('spec/fixtures', File.basename(fixture_file, '.*'))
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
desc 'Generate documentation for the smarty_pants_filter extension.'
|
119
|
+
Rake::RDocTask.new(:rdoc) do |rdoc|
|
120
|
+
rdoc.rdoc_dir = 'rdoc'
|
121
|
+
rdoc.title = 'SmartyPantsFilterExtension'
|
122
|
+
rdoc.options << '--line-numbers' << '--inline-source'
|
123
|
+
rdoc.rdoc_files.include('README')
|
124
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
125
|
+
end
|
126
|
+
|
127
|
+
# For extensions that are in transition
|
128
|
+
desc 'Test the smarty_pants_filter extension.'
|
129
|
+
Rake::TestTask.new(:test) do |t|
|
130
|
+
t.libs << 'lib'
|
131
|
+
t.pattern = 'test/**/*_test.rb'
|
132
|
+
t.verbose = true
|
133
|
+
end
|
134
|
+
|
135
|
+
# Load any custom rakefiles for extension
|
136
|
+
Dir[File.dirname(__FILE__) + '/tasks/*.rake'].sort.each { |f| require f }
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module SmartyPantsTags
|
2
|
+
include Radiant::Taggable
|
3
|
+
|
4
|
+
desc %{
|
5
|
+
Filters its contents with the SmartyPants filter.
|
6
|
+
|
7
|
+
*Usage:*
|
8
|
+
|
9
|
+
<pre><code><r:smarty_pants>"A revolutionary quotation."</r:smarty_pants></code></pre>
|
10
|
+
|
11
|
+
produces
|
12
|
+
|
13
|
+
<pre><code>“A revolutionary quotation.”</code></pre>
|
14
|
+
}
|
15
|
+
tag 'smarty_pants' do |tag|
|
16
|
+
SmartyPantsFilter.filter(tag.expand)
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
namespace :radiant do
|
2
|
+
namespace :extensions do
|
3
|
+
namespace :smarty_pants_filter do
|
4
|
+
|
5
|
+
desc "Runs the migration of the SmartyPants Filter extension"
|
6
|
+
task :migrate => :environment do
|
7
|
+
require 'radiant/extension_migrator'
|
8
|
+
if ENV["VERSION"]
|
9
|
+
SmartyPantsFilterExtension.migrator.migrate(ENV["VERSION"].to_i)
|
10
|
+
else
|
11
|
+
SmartyPantsFilterExtension.migrator.migrate
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
desc "Copies public assets of the SmartyPants Filter to the instance public/ directory."
|
16
|
+
task :update => :environment do
|
17
|
+
is_svn_or_dir = proc {|path| path =~ /\.svn/ || File.directory?(path) }
|
18
|
+
Dir[SmartyPantsFilterExtension.root + "/public/**/*"].reject(&is_svn_or_dir).each do |file|
|
19
|
+
path = file.sub(SmartyPantsFilterExtension.root, '')
|
20
|
+
directory = File.dirname(path)
|
21
|
+
puts "Copying #{path}..."
|
22
|
+
mkdir_p RAILS_ROOT + directory
|
23
|
+
cp file, RAILS_ROOT + path
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "radiant-smarty_pants_filter-extension/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "radiant-smarty_pants_filter-extension"
|
7
|
+
s.version = RadiantSmartyPantsFilterExtension::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["Radiant CMS Dev Team"]
|
10
|
+
s.email = ["radiant@radiantcms.org"]
|
11
|
+
s.homepage = "http://radiantcms.org/"
|
12
|
+
s.summary = %q{Markdown Filter for Radiant CMS}
|
13
|
+
s.description = %q{Allows you to compose page parts or snippets using the Markdown text filter.}
|
14
|
+
|
15
|
+
ignores = if File.exist?(".gitignore")
|
16
|
+
File.read(".gitignore").split("\n").inject([]) {|a,p| a + Dir[p] }
|
17
|
+
else
|
18
|
+
[]
|
19
|
+
end
|
20
|
+
s.files = Dir["**/*"] - ignores
|
21
|
+
s.test_files = Dir["test/**/*","spec/**/*","features/**/*"] - ignores
|
22
|
+
s.require_paths = ["lib"]
|
23
|
+
|
24
|
+
s.add_dependency "rubypants", "~> 0.2.0"
|
25
|
+
|
26
|
+
s.post_install_message = %{
|
27
|
+
Add this to your radiant project with:
|
28
|
+
config.gem "radiant-smarty_pants_filter-extension", :version => "~> #{RadiantSmartyPantsFilterExtension::VERSION}"
|
29
|
+
}
|
30
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
begin
|
2
|
+
require 'rubypants'
|
3
|
+
rescue LoadError
|
4
|
+
# If rubypants gem is not available, use packaged version
|
5
|
+
$LOAD_PATH.unshift "#{File.dirname(__FILE__)}/vendor/rubypants"
|
6
|
+
retry
|
7
|
+
end
|
8
|
+
|
9
|
+
class SmartyPantsFilterExtension < Radiant::Extension
|
10
|
+
version "1.0"
|
11
|
+
description "Allows you to compose page parts or snippets using the SmartyPants text filter."
|
12
|
+
url "http://daringfireball.net/projects/smartypants/"
|
13
|
+
|
14
|
+
def activate
|
15
|
+
SmartyPantsFilter
|
16
|
+
Page.send :include, SmartyPantsTags
|
17
|
+
end
|
18
|
+
end
|
data/smartypants.html
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
<p><a href="http://daringfireball.net/projects/smartypants/" target="_blank">SmartyPants</a>
|
2
|
+
is a simple text filter that will curl quotes and insert “smart”
|
3
|
+
punctuation. This is extremely useful if you prefer to compose documents using
|
4
|
+
standard HTML, but don’t want to worry about quotes and punctuation.</p>
|
5
|
+
|
6
|
+
<table id="filter-reference-table">
|
7
|
+
<thead>
|
8
|
+
<tr>
|
9
|
+
<th>To see this:</th>
|
10
|
+
<th>Type this:</th>
|
11
|
+
<tr>
|
12
|
+
</thead>
|
13
|
+
<tbody>
|
14
|
+
<tr>
|
15
|
+
<td>‘single quotes’</td>
|
16
|
+
<td><pre>'single quotes'</pre></td>
|
17
|
+
</tr>
|
18
|
+
<tr>
|
19
|
+
<td>“double quotes”</td>
|
20
|
+
<td><pre>"double quotes"</pre></td>
|
21
|
+
</tr>
|
22
|
+
<tr>
|
23
|
+
<td>“backtick quotes”</td>
|
24
|
+
<td><pre>``backtick quotes''</pre></td>
|
25
|
+
</tr>
|
26
|
+
<tr>
|
27
|
+
<td>John’s apostrophe</td>
|
28
|
+
<td><pre>John's apostrophe</pre></td>
|
29
|
+
</tr>
|
30
|
+
<tr>
|
31
|
+
<td>just an – en-dash</td>
|
32
|
+
<td><pre>just an -- en-dash</pre></td>
|
33
|
+
</tr>
|
34
|
+
<tr>
|
35
|
+
<td>just an—em-dash</td>
|
36
|
+
<td><pre>just an---em-dash</pre></td>
|
37
|
+
</tr>
|
38
|
+
<tr>
|
39
|
+
<td>ellipsis…</td>
|
40
|
+
<td><pre>ellipsis...</pre></td>
|
41
|
+
</tr>
|
42
|
+
</tbody>
|
43
|
+
</table>
|
44
|
+
|
45
|
+
<p>SmartyPants ignores characters within <code><pre></code>,
|
46
|
+
<code><code></code>, <code><kbd></code>, or
|
47
|
+
<code><script></code> tag blocks.</p>
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper'
|
2
|
+
|
3
|
+
describe SmartyPantsFilter do
|
4
|
+
it "should be named SmartyPants" do
|
5
|
+
SmartyPantsFilter.filter_name.should == "SmartyPants"
|
6
|
+
end
|
7
|
+
|
8
|
+
it "should filter text with quotes into smart quotes" do
|
9
|
+
SmartyPantsFilter.filter("<h1 class=\"headline\">Radiant's \"filters\" rock!</h1>").should ==
|
10
|
+
"<h1 class=\"headline\">Radiant’s “filters” rock!</h1>"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "<r:smarty_pants>" do
|
15
|
+
dataset :pages
|
16
|
+
it "should filter its contents with SmartyPants" do
|
17
|
+
pages(:home).should render('<r:smarty_pants>"A revolutionary quotation."</r:smarty_pants>').as("“A revolutionary quotation.”")
|
18
|
+
end
|
19
|
+
end
|
data/spec/spec.opts
ADDED
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
unless defined? RADIANT_ROOT
|
2
|
+
ENV["RAILS_ENV"] = "test"
|
3
|
+
case
|
4
|
+
when ENV["RADIANT_ENV_FILE"]
|
5
|
+
require ENV["RADIANT_ENV_FILE"]
|
6
|
+
when File.dirname(__FILE__) =~ %r{vendor/radiant/vendor/extensions}
|
7
|
+
require "#{File.expand_path(File.dirname(__FILE__) + "/../../../../../../")}/config/environment"
|
8
|
+
else
|
9
|
+
require "#{File.expand_path(File.dirname(__FILE__) + "/../../../../")}/config/environment"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
require "#{RADIANT_ROOT}/spec/spec_helper"
|
13
|
+
|
14
|
+
Dataset::Resolver.default << (File.dirname(__FILE__) + "/datasets")
|
15
|
+
|
16
|
+
if File.directory?(File.dirname(__FILE__) + "/matchers")
|
17
|
+
Dir[File.dirname(__FILE__) + "/matchers/*.rb"].each {|file| require file }
|
18
|
+
end
|
19
|
+
|
20
|
+
Spec::Runner.configure do |config|
|
21
|
+
# config.use_transactional_fixtures = true
|
22
|
+
# config.use_instantiated_fixtures = false
|
23
|
+
# config.fixture_path = RAILS_ROOT + '/spec/fixtures'
|
24
|
+
|
25
|
+
# You can declare fixtures for each behaviour like this:
|
26
|
+
# describe "...." do
|
27
|
+
# fixtures :table_a, :table_b
|
28
|
+
#
|
29
|
+
# Alternatively, if you prefer to declare them only once, you can
|
30
|
+
# do so here, like so ...
|
31
|
+
#
|
32
|
+
# config.global_fixtures = :table_a, :table_b
|
33
|
+
#
|
34
|
+
# If you declare global fixtures, be aware that they will be declared
|
35
|
+
# for all of your examples, even those that don't use them.
|
36
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
# Load the environment
|
3
|
+
unless defined? RADIANT_ROOT
|
4
|
+
ENV["RAILS_ENV"] = "test"
|
5
|
+
case
|
6
|
+
when ENV["RADIANT_ENV_FILE"]
|
7
|
+
require ENV["RADIANT_ENV_FILE"]
|
8
|
+
when File.dirname(__FILE__) =~ %r{vendor/radiant/vendor/extensions}
|
9
|
+
require "#{File.expand_path(File.dirname(__FILE__) + "/../../../../../../")}/config/environment"
|
10
|
+
else
|
11
|
+
require "#{File.expand_path(File.dirname(__FILE__) + "/../../../../")}/config/environment"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
require "#{RADIANT_ROOT}/test/test_helper"
|
15
|
+
|
16
|
+
class Test::Unit::TestCase
|
17
|
+
self.use_transactional_fixtures = true
|
18
|
+
self.use_instantiated_fixtures = false
|
19
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../test_helper'
|
2
|
+
|
3
|
+
class SmartyPantsFilterTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def test_filter_name
|
6
|
+
assert_equal 'SmartyPants', SmartyPantsFilter.filter_name
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_filter
|
10
|
+
assert_equal "<h1 class=\"headline\">Radiant’s “filters” rock!</h1>",
|
11
|
+
SmartyPantsFilter.filter("<h1 class=\"headline\">Radiant's \"filters\" rock!</h1>")
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
@@ -0,0 +1,114 @@
|
|
1
|
+
= RubyPants -- SmartyPants ported to Ruby
|
2
|
+
|
3
|
+
Ported by Christian Neukirchen <mailto:chneukirchen@gmail.com>
|
4
|
+
Copyright (C) 2004 Christian Neukirchen
|
5
|
+
|
6
|
+
Incooporates ideas, comments and documentation by Chad Miller
|
7
|
+
Copyright (C) 2004 Chad Miller
|
8
|
+
|
9
|
+
Original SmartyPants by John Gruber
|
10
|
+
Copyright (C) 2003 John Gruber
|
11
|
+
|
12
|
+
|
13
|
+
== RubyPants
|
14
|
+
|
15
|
+
RubyPants is a Ruby port of the smart-quotes library SmartyPants.
|
16
|
+
|
17
|
+
The original "SmartyPants" is a free web publishing plug-in for
|
18
|
+
Movable Type, Blosxom, and BBEdit that easily translates plain ASCII
|
19
|
+
punctuation characters into "smart" typographic punctuation HTML
|
20
|
+
entities.
|
21
|
+
|
22
|
+
See rubypants.rb for more information.
|
23
|
+
|
24
|
+
|
25
|
+
== Incompatibilities
|
26
|
+
|
27
|
+
RubyPants uses a different API than SmartyPants; it is compatible to
|
28
|
+
Red- and BlueCloth. Usually, you call RubyPants like this:
|
29
|
+
|
30
|
+
nicehtml = RubyPants.new(uglyhtml, options).to_html
|
31
|
+
|
32
|
+
where +options+ is an Array of Integers and/or Symbols (if you don't
|
33
|
+
pass any options, RubyPants will use <tt>[2]</tt> as default.)
|
34
|
+
|
35
|
+
*Note*:: This is incompatible to SmartyPants, which uses <tt>[1]</tt>
|
36
|
+
for default.
|
37
|
+
|
38
|
+
The exact meaning of numbers and symbols is documented at RubyPants#new.
|
39
|
+
|
40
|
+
|
41
|
+
== SmartyPants license:
|
42
|
+
|
43
|
+
Copyright (c) 2003 John Gruber
|
44
|
+
(http://daringfireball.net)
|
45
|
+
All rights reserved.
|
46
|
+
|
47
|
+
Redistribution and use in source and binary forms, with or without
|
48
|
+
modification, are permitted provided that the following conditions
|
49
|
+
are met:
|
50
|
+
|
51
|
+
* Redistributions of source code must retain the above copyright
|
52
|
+
notice, this list of conditions and the following disclaimer.
|
53
|
+
|
54
|
+
* Redistributions in binary form must reproduce the above copyright
|
55
|
+
notice, this list of conditions and the following disclaimer in
|
56
|
+
the documentation and/or other materials provided with the
|
57
|
+
distribution.
|
58
|
+
|
59
|
+
* Neither the name "SmartyPants" nor the names of its contributors
|
60
|
+
may be used to endorse or promote products derived from this
|
61
|
+
software without specific prior written permission.
|
62
|
+
|
63
|
+
This software is provided by the copyright holders and contributors
|
64
|
+
"as is" and any express or implied warranties, including, but not
|
65
|
+
limited to, the implied warranties of merchantability and fitness
|
66
|
+
for a particular purpose are disclaimed. In no event shall the
|
67
|
+
copyright owner or contributors be liable for any direct, indirect,
|
68
|
+
incidental, special, exemplary, or consequential damages (including,
|
69
|
+
but not limited to, procurement of substitute goods or services;
|
70
|
+
loss of use, data, or profits; or business interruption) however
|
71
|
+
caused and on any theory of liability, whether in contract, strict
|
72
|
+
liability, or tort (including negligence or otherwise) arising in
|
73
|
+
any way out of the use of this software, even if advised of the
|
74
|
+
possibility of such damage.
|
75
|
+
|
76
|
+
|
77
|
+
== RubyPants license
|
78
|
+
|
79
|
+
Copyright (C) 2004 Christian Neukirchen
|
80
|
+
|
81
|
+
RubyPants is a derivative work of SmartyPants and smartypants.py.
|
82
|
+
|
83
|
+
Redistribution and use in source and binary forms, with or without
|
84
|
+
modification, are permitted provided that the following conditions
|
85
|
+
are met:
|
86
|
+
|
87
|
+
* Redistributions of source code must retain the above copyright
|
88
|
+
notice, this list of conditions and the following disclaimer.
|
89
|
+
|
90
|
+
* Redistributions in binary form must reproduce the above copyright
|
91
|
+
notice, this list of conditions and the following disclaimer in
|
92
|
+
the documentation and/or other materials provided with the
|
93
|
+
distribution.
|
94
|
+
|
95
|
+
This software is provided by the copyright holders and contributors
|
96
|
+
"as is" and any express or implied warranties, including, but not
|
97
|
+
limited to, the implied warranties of merchantability and fitness
|
98
|
+
for a particular purpose are disclaimed. In no event shall the
|
99
|
+
copyright owner or contributors be liable for any direct, indirect,
|
100
|
+
incidental, special, exemplary, or consequential damages (including,
|
101
|
+
but not limited to, procurement of substitute goods or services;
|
102
|
+
loss of use, data, or profits; or business interruption) however
|
103
|
+
caused and on any theory of liability, whether in contract, strict
|
104
|
+
liability, or tort (including negligence or otherwise) arising in
|
105
|
+
any way out of the use of this software, even if advised of the
|
106
|
+
possibility of such damage.
|
107
|
+
|
108
|
+
|
109
|
+
== Links
|
110
|
+
|
111
|
+
John Gruber:: http://daringfireball.net
|
112
|
+
SmartyPants:: http://daringfireball.net/projects/smartypants
|
113
|
+
Chad Miller:: http://web.chad.org
|
114
|
+
Christian Neukirchen:: http://kronavita.de/chris
|