model_formatting 0.5 → 0.6.6

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/Gemfile CHANGED
@@ -3,9 +3,9 @@ source "http://gem.entp.com"
3
3
 
4
4
  gem 'rake'
5
5
  gem 'redcarpet', '~> 2.2'
6
- gem 'actionpack', '~> 3.0.0'
7
- gem 'activerecord', '~> 3.0.0'
8
- gem 'activesupport', '~> 3.0.0'
6
+ gem 'actionpack', '~> 3.2'
7
+ gem 'activerecord', '~> 3.2'
8
+ gem 'activesupport', '~> 3.2'
9
9
  gem 'tidy_ffi', '~> 0.1.2'
10
10
 
11
11
  group :development, :test do
@@ -2,55 +2,63 @@ GEM
2
2
  remote: http://rubygems.org/
3
3
  remote: http://gem.entp.com/
4
4
  specs:
5
- abstract (1.0.0)
6
- actionpack (3.0.12)
7
- activemodel (= 3.0.12)
8
- activesupport (= 3.0.12)
9
- builder (~> 2.1.2)
10
- erubis (~> 2.6.6)
11
- i18n (~> 0.5.0)
12
- rack (~> 1.2.5)
13
- rack-mount (~> 0.6.14)
14
- rack-test (~> 0.5.7)
15
- tzinfo (~> 0.3.23)
16
- activemodel (3.0.12)
17
- activesupport (= 3.0.12)
18
- builder (~> 2.1.2)
19
- i18n (~> 0.5.0)
20
- activerecord (3.0.12)
21
- activemodel (= 3.0.12)
22
- activesupport (= 3.0.12)
23
- arel (~> 2.0.10)
24
- tzinfo (~> 0.3.23)
25
- activesupport (3.0.12)
26
- arel (2.0.10)
27
- builder (2.1.2)
5
+ actionpack (3.2.15)
6
+ activemodel (= 3.2.15)
7
+ activesupport (= 3.2.15)
8
+ builder (~> 3.0.0)
9
+ erubis (~> 2.7.0)
10
+ journey (~> 1.0.4)
11
+ rack (~> 1.4.5)
12
+ rack-cache (~> 1.2)
13
+ rack-test (~> 0.6.1)
14
+ sprockets (~> 2.2.1)
15
+ activemodel (3.2.15)
16
+ activesupport (= 3.2.15)
17
+ builder (~> 3.0.0)
18
+ activerecord (3.2.15)
19
+ activemodel (= 3.2.15)
20
+ activesupport (= 3.2.15)
21
+ arel (~> 3.0.2)
22
+ tzinfo (~> 0.3.29)
23
+ activesupport (3.2.15)
24
+ i18n (~> 0.6, >= 0.6.4)
25
+ multi_json (~> 1.0)
26
+ arel (3.0.2)
27
+ builder (3.0.4)
28
28
  context (0.5.5)
29
- erubis (2.6.6)
30
- abstract (>= 1.0.0)
29
+ erubis (2.7.0)
31
30
  ffi (1.0.10)
32
- i18n (0.5.0)
31
+ hike (1.2.3)
32
+ i18n (0.6.5)
33
+ journey (1.0.4)
33
34
  matchy (0.4.0)
34
- rack (1.2.5)
35
- rack-mount (0.6.14)
36
- rack (>= 1.0.0)
37
- rack-test (0.5.7)
35
+ multi_json (1.8.2)
36
+ rack (1.4.5)
37
+ rack-cache (1.2)
38
+ rack (>= 0.4)
39
+ rack-test (0.6.2)
38
40
  rack (>= 1.0)
39
41
  rake (0.9.2)
40
42
  redcarpet (2.2.2)
43
+ sprockets (2.2.2)
44
+ hike (~> 1.2)
45
+ multi_json (~> 1.0)
46
+ rack (~> 1.0)
47
+ tilt (~> 1.1, != 1.3.0)
41
48
  tidy_ffi (0.1.3)
42
49
  ffi (>= 0.3.5)
43
- tzinfo (0.3.32)
50
+ tilt (1.4.1)
51
+ tzinfo (0.3.38)
44
52
 
45
53
  PLATFORMS
46
54
  ruby
47
55
 
48
56
  DEPENDENCIES
49
- actionpack (~> 3.0.0)
50
- activerecord (~> 3.0.0)
51
- activesupport (~> 3.0.0)
57
+ actionpack (~> 3.2)
58
+ activerecord (~> 3.2)
59
+ activesupport (~> 3.2)
52
60
  context (= 0.5.5)
53
61
  matchy (~> 0.4.0)
54
62
  rake
55
- redcarpet
63
+ redcarpet (~> 2.2)
56
64
  tidy_ffi (~> 0.1.2)
data/README CHANGED
@@ -1,3 +1,9 @@
1
- This is a plugin for Rails 2.2.x that performs automatic text-to-html formatting.
1
+ This is a plugin for Rails that performs automatic text-to-html formatting.
2
+
3
+ For rails 2.3, please use the 'rails23' branch (you can specify ~> 0.2 in your gemfile)
4
+
5
+ It uses the 'redcarpet' markdown library with a few other pre-processing steps.
6
+ Note: tests do not run on 1.9.x series due to a bug in the test frameworks we use,
7
+ but the code works fine.
2
8
 
3
9
  It is extracted from and used by [Tender](http://tenderapp.com/) and [Lighthouse](http://lighthouseapp.com/).
data/Rakefile CHANGED
@@ -1,21 +1,22 @@
1
1
  require 'rubygems/package_task'
2
- require 'rake/testtask'
2
+ # require 'rake/testtask'
3
3
 
4
4
  spec = Gem::Specification.new do |s|
5
5
  s.name = "model_formatting"
6
- s.version = "0.5"
6
+ s.version = "0.6.6"
7
7
  s.author = "ENTP"
8
8
  s.email = "company@entp.com"
9
9
  s.homepage = "http://github.com/entp"
10
10
  s.platform = Gem::Platform::RUBY
11
- s.summary = "Automatically format model attributes using redcarpet (markdown) and Tender/Lighthouse extensions."
11
+ s.summary = "Automatically format model attributes using Redcarpet (markdown) and Tender/Lighthouse extensions."
12
+ s.description = s.summary
12
13
  s.files = FileList['[a-zA-Z]*', 'bin/*', 'lib/**/*', 'rails/**/*', 'test/**/*']
13
14
  s.has_rdoc = false
14
15
  s.extra_rdoc_files = ["README"]
15
16
  s.add_dependency("redcarpet", "~>2.2")
16
- s.add_dependency("actionpack", "~>3.0.0")
17
- s.add_dependency("activerecord", "~>3.0.0")
18
- s.add_dependency("activesupport", "~>3.0.0")
17
+ s.add_dependency("actionpack", "~>3.2")
18
+ s.add_dependency("activerecord", "~>3.2")
19
+ s.add_dependency("activesupport", "~>3.2")
19
20
  s.add_dependency("tidy_ffi", "~>0.1.2")
20
21
  s.add_development_dependency("jeremymcanally-context", "~>0.5.5")
21
22
  s.add_development_dependency("jeremymcanally-matchy", "~>0.1.0")
@@ -27,7 +28,3 @@ Gem::PackageTask.new(spec) do |pkg|
27
28
  pkg.gem_spec = spec
28
29
  end
29
30
 
30
- Rake::TestTask.new do |t|
31
- t.test_files = FileList['test/*_test.rb']
32
- end
33
-
@@ -1,5 +1,6 @@
1
1
  require 'cgi'
2
2
  require 'active_support' # NilClass#blank?
3
+ require 'redcarpet_custom'
3
4
  module ModelFormatting
4
5
  class Part < Array
5
6
  attr_reader :format
@@ -97,7 +98,7 @@ module ModelFormatting
97
98
  format == :html ? "<div>#{string}</div>" : string
98
99
  end
99
100
 
100
- CODEBLOCK_RE = /^@@@( ([a-z]+)\s*)?$/
101
+ CODEBLOCK_RE = /^(@@@|```)( ([a-z]+)\s*)?$/
101
102
 
102
103
  # Parse a string into a given array of [CodeBlcok, FormattedBlock, CodeBlock, FormattedBlock]
103
104
  #
@@ -122,7 +123,7 @@ module ModelFormatting
122
123
  current_part = nil
123
124
  else
124
125
  if current_part then parts << current_part end
125
- current_part = CodePart.new(format, $2)
126
+ current_part = CodePart.new(format, $3)
126
127
  end
127
128
  in_code_block = !in_code_block
128
129
  else
@@ -178,11 +179,6 @@ module ModelFormatting
178
179
 
179
180
  def self.gfm(text)
180
181
  extract_tag(text, :pre) do |txt|
181
- # prevent foo_bar_baz from ending up with an italic word in the middle
182
- text.gsub!(/(^(?! {4}|\t)\w+_\w+_\w[\w_]*)/) do |x|
183
- x.gsub('_', '\_') if x.split('').sort.to_s[0..1] == '__'
184
- end
185
-
186
182
  # in very clear cases, let newlines become <br /> tags
187
183
  #text.gsub!(/(\A|^$\n)(^\w[^\n]*\n)(^\w[^\n]*$)+/m) do |x|
188
184
  # x.gsub(/^(.+)$/, "\\1 ")
@@ -195,14 +191,12 @@ module ModelFormatting
195
191
  begin
196
192
  require 'redcarpet'
197
193
  def self.process_markdown(text)
198
- markdown = Redcarpet::Markdown.new(Redcarpet::Render::HTML,
194
+ markdown = Redcarpet::Markdown.new(Redcarpet::Render::Custom,
199
195
  :no_intra_emphasis => true,
200
196
  :tables => true,
201
197
  :fenced_code_blocks => true,
202
- :space_after_headers => true,
203
- # :hard_wrap => true,
204
- # :with_toc_data => true,
205
- :autolink => true).render(text)
198
+ :space_after_headers => true
199
+ ).render(text)
206
200
  end
207
201
  rescue LoadError
208
202
  puts "No Redcarpet gem found. `gem install redcarpet`."
@@ -31,7 +31,7 @@ module ModelFormatting::Init
31
31
  unless respond_to?(:model_formatting_attributes)
32
32
  # use all these attributes instead of a single ModelFormatting::Config because
33
33
  # it's easier to support subclassing.
34
- class_inheritable_accessor :model_formatting_attributes,
34
+ class_attribute :model_formatting_attributes,
35
35
  :model_formatting_white_list, :model_formatting_context,
36
36
  :model_formatting_before_callback, :model_formatting_after_callback
37
37
  send :include, ModelFormatting::InstanceMethods
@@ -0,0 +1,27 @@
1
+ require 'redcarpet'
2
+ module Redcarpet::Render
3
+ class Custom < HTML
4
+ # include Redcarpet::Render::HTML
5
+ def header(title, level)
6
+ @headers ||= []
7
+ # you can use this permalink style: 1-foo-bar with the level in it
8
+ # permalink = "#{level}-#{title.gsub(/\W+/, "-")}"
9
+
10
+ # .. or just use title. you might like a better regex here, too
11
+ permalink = title.gsub(/\W+/, "-").downcase
12
+
13
+ # for extra credit: implement this as its own method
14
+ if @headers.include?(permalink)
15
+ permalink += "_1"
16
+ # my brain hurts
17
+ loop do
18
+ break if !@headers.include?(permalink)
19
+ # generate titles like foo-bar_1, foo-bar_2
20
+ permalink.gsub!(/\_(\d+)$/, "_#{$1.to_i + 1}")
21
+ end
22
+ end
23
+ @headers << permalink
24
+ %(\n<h#{level} id=\"#{permalink}\"><a name="#{permalink}" class="anchor" href="##{permalink}"></a>#{title}</h#{level}>\n)
25
+ end
26
+ end
27
+ end
@@ -5,7 +5,7 @@ module ModelFormatting
5
5
  class Test < Test::Unit::TestCase
6
6
  class Base < Struct.new(:body, :formatted_body, :title, :title_html, :bio, :full_bio)
7
7
  ModelFormatting::Init.setup_on self
8
- class_inheritable_accessor :before_save_callback
8
+ class_attribute :before_save_callback
9
9
 
10
10
  def self.before_save(method = nil)
11
11
  if method
@@ -7,6 +7,11 @@ class ModelFormattingTest < Test::Unit::TestCase
7
7
  parts.first.class.should == ModelFormatting::FormattedPart
8
8
  parts.first.should == 'foo'
9
9
  end
10
+
11
+ it "generates TOC titles" do
12
+ ModelFormatting.process(:html, "# Title One\n\n# Title Two\n\n## Title One").should == \
13
+ "<div><h1 id=\"title-one\"><a name=\"title-one\" class=\"anchor\" href=\n\"#title-one\" id=\"title-one\"></a>Title One</h1>\n<h1 id=\"title-two\"><a name=\"title-two\" class=\"anchor\" href=\n\"#title-two\" id=\"title-two\"></a>Title Two</h1>\n<h2 id=\"title-one_1\"><a name=\"title-one_1\" class=\"anchor\" href=\n\"#title-one_1\" id=\"title-one_1\"></a>Title One</h2></div>"
14
+ end
10
15
 
11
16
  it "parses empty code block into array of single CodeBlock" do
12
17
  parts = ModelFormatting.parse_text_parts(nil, nil, "@@@ foo\n@@@")
@@ -105,8 +110,8 @@ class ModelFormattingTest < Test::Unit::TestCase
105
110
  assert_equal "<pre>\nfoo_bar_baz\n</pre>", ModelFormatting.gfm("<pre>\nfoo_bar_baz\n</pre>")
106
111
  end
107
112
 
108
- it "escapes two or more underscores inside words" do
109
- assert_equal "foo\\_bar\\_baz", ModelFormatting.gfm("foo_bar_baz")
113
+ it "does not touch underscores inside words" do
114
+ assert_equal "foo_bar_baz", ModelFormatting.gfm("foo_bar_baz")
110
115
  end
111
116
 
112
117
  it "turns newlines into br tags in simple cases" do
metadata CHANGED
@@ -1,12 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: model_formatting
3
3
  version: !ruby/object:Gem::Version
4
- hash: 1
4
+ hash: 11
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
- - 5
9
- version: "0.5"
8
+ - 6
9
+ - 6
10
+ version: 0.6.6
10
11
  platform: ruby
11
12
  authors:
12
13
  - ENTP
@@ -14,12 +15,10 @@ autorequire:
14
15
  bindir: bin
15
16
  cert_chain: []
16
17
 
17
- date: 2013-01-19 00:00:00 Z
18
+ date: 2013-10-31 00:00:00 Z
18
19
  dependencies:
19
20
  - !ruby/object:Gem::Dependency
20
- name: redcarpet
21
- prerelease: false
22
- requirement: &id001 !ruby/object:Gem::Requirement
21
+ version_requirements: &id001 !ruby/object:Gem::Requirement
23
22
  none: false
24
23
  requirements:
25
24
  - - ~>
@@ -29,60 +28,57 @@ dependencies:
29
28
  - 2
30
29
  - 2
31
30
  version: "2.2"
31
+ requirement: *id001
32
+ prerelease: false
33
+ name: redcarpet
32
34
  type: :runtime
33
- version_requirements: *id001
34
35
  - !ruby/object:Gem::Dependency
35
- name: actionpack
36
- prerelease: false
37
- requirement: &id002 !ruby/object:Gem::Requirement
36
+ version_requirements: &id002 !ruby/object:Gem::Requirement
38
37
  none: false
39
38
  requirements:
40
39
  - - ~>
41
40
  - !ruby/object:Gem::Version
42
- hash: 7
41
+ hash: 3
43
42
  segments:
44
43
  - 3
45
- - 0
46
- - 0
47
- version: 3.0.0
44
+ - 2
45
+ version: "3.2"
46
+ requirement: *id002
47
+ prerelease: false
48
+ name: actionpack
48
49
  type: :runtime
49
- version_requirements: *id002
50
50
  - !ruby/object:Gem::Dependency
51
- name: activerecord
52
- prerelease: false
53
- requirement: &id003 !ruby/object:Gem::Requirement
51
+ version_requirements: &id003 !ruby/object:Gem::Requirement
54
52
  none: false
55
53
  requirements:
56
54
  - - ~>
57
55
  - !ruby/object:Gem::Version
58
- hash: 7
56
+ hash: 3
59
57
  segments:
60
58
  - 3
61
- - 0
62
- - 0
63
- version: 3.0.0
59
+ - 2
60
+ version: "3.2"
61
+ requirement: *id003
62
+ prerelease: false
63
+ name: activerecord
64
64
  type: :runtime
65
- version_requirements: *id003
66
65
  - !ruby/object:Gem::Dependency
67
- name: activesupport
68
- prerelease: false
69
- requirement: &id004 !ruby/object:Gem::Requirement
66
+ version_requirements: &id004 !ruby/object:Gem::Requirement
70
67
  none: false
71
68
  requirements:
72
69
  - - ~>
73
70
  - !ruby/object:Gem::Version
74
- hash: 7
71
+ hash: 3
75
72
  segments:
76
73
  - 3
77
- - 0
78
- - 0
79
- version: 3.0.0
74
+ - 2
75
+ version: "3.2"
76
+ requirement: *id004
77
+ prerelease: false
78
+ name: activesupport
80
79
  type: :runtime
81
- version_requirements: *id004
82
80
  - !ruby/object:Gem::Dependency
83
- name: tidy_ffi
84
- prerelease: false
85
- requirement: &id005 !ruby/object:Gem::Requirement
81
+ version_requirements: &id005 !ruby/object:Gem::Requirement
86
82
  none: false
87
83
  requirements:
88
84
  - - ~>
@@ -93,12 +89,12 @@ dependencies:
93
89
  - 1
94
90
  - 2
95
91
  version: 0.1.2
92
+ requirement: *id005
93
+ prerelease: false
94
+ name: tidy_ffi
96
95
  type: :runtime
97
- version_requirements: *id005
98
96
  - !ruby/object:Gem::Dependency
99
- name: jeremymcanally-context
100
- prerelease: false
101
- requirement: &id006 !ruby/object:Gem::Requirement
97
+ version_requirements: &id006 !ruby/object:Gem::Requirement
102
98
  none: false
103
99
  requirements:
104
100
  - - ~>
@@ -109,12 +105,12 @@ dependencies:
109
105
  - 5
110
106
  - 5
111
107
  version: 0.5.5
108
+ requirement: *id006
109
+ prerelease: false
110
+ name: jeremymcanally-context
112
111
  type: :development
113
- version_requirements: *id006
114
112
  - !ruby/object:Gem::Dependency
115
- name: jeremymcanally-matchy
116
- prerelease: false
117
- requirement: &id007 !ruby/object:Gem::Requirement
113
+ version_requirements: &id007 !ruby/object:Gem::Requirement
118
114
  none: false
119
115
  requirements:
120
116
  - - ~>
@@ -125,9 +121,11 @@ dependencies:
125
121
  - 1
126
122
  - 0
127
123
  version: 0.1.0
124
+ requirement: *id007
125
+ prerelease: false
126
+ name: jeremymcanally-matchy
128
127
  type: :development
129
- version_requirements: *id007
130
- description:
128
+ description: Automatically format model attributes using Redcarpet (markdown) and Tender/Lighthouse extensions.
131
129
  email: company@entp.com
132
130
  executables: []
133
131
 
@@ -138,13 +136,14 @@ extra_rdoc_files:
138
136
  files:
139
137
  - Gemfile
140
138
  - Gemfile.lock
141
- - README
142
139
  - Rakefile
140
+ - README
143
141
  - bin/model_formatting
144
- - lib/model_formatting.rb
145
142
  - lib/model_formatting/config.rb
146
143
  - lib/model_formatting/init.rb
147
144
  - lib/model_formatting/instance_methods.rb
145
+ - lib/model_formatting.rb
146
+ - lib/redcarpet_custom.rb
148
147
  - rails/init.rb
149
148
  - test/fixtures/mkd-extraction.txt
150
149
  - test/formatting_test.rb
@@ -182,6 +181,6 @@ rubyforge_project:
182
181
  rubygems_version: 1.8.24
183
182
  signing_key:
184
183
  specification_version: 3
185
- summary: Automatically format model attributes using redcarpet (markdown) and Tender/Lighthouse extensions.
184
+ summary: Automatically format model attributes using Redcarpet (markdown) and Tender/Lighthouse extensions.
186
185
  test_files: []
187
186