shortcode 0.0.1 → 0.0.2

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.md CHANGED
@@ -1,45 +1,94 @@
1
1
  # Shortcode
2
2
 
3
- A ruby gem for parsing Wordpress style shortcodes. The gem uses a PEG (Parsing Expression Grammar) parser rather than using regular expressions so its easier to understand, test and extend.
3
+ A ruby gem for parsing Wordpress style shortcodes. The gem uses a [PEG](http://en.wikipedia.org/wiki/Parsing_expression_grammar) (Parsing Expression Grammar) parser rather than using regular expressions so its easier to understand, test and extend.
4
4
 
5
5
  ## Installation
6
6
 
7
7
  Add this line to your application's Gemfile:
8
8
 
9
- gem 'shortcode'
9
+ ```ruby
10
+ gem 'shortcode'
11
+ ```
10
12
 
11
13
  And then execute:
12
14
 
13
- $ bundle
15
+ ```
16
+ $ bundle
17
+ ```
14
18
 
15
19
  Or install it yourself as:
16
20
 
17
- $ gem install shortcode
21
+ ```
22
+ $ gem install shortcode
23
+ ```
18
24
 
19
25
  ## Usage
20
26
 
21
- Example usage
27
+ ### Example
22
28
 
23
- parser = Shortcode::Parser.new
24
- transformer = Shortcode::Transformer.new
25
- transformer.apply(parser.parse("[quote]Hello World[/quote]"))
29
+ Shortcode can be used in one of two ways, the parser and transformer can be called seperatly or the `process` method can be used which performs both the parsing and transforming and returns the result.
26
30
 
27
- Configuration
31
+ The former is good if you want to work with the intemediary hash returned by the parser
28
32
 
29
- Shortcode.setup do |config|
33
+ ```ruby
34
+ parser = Shortcode::Parser.new
35
+ transformer = Shortcode::Transformer.new
36
+ parsed_hash = parser.parse("[quote]Hello World[/quote]")
37
+ transformer.apply(parsed_hash)
38
+ ```
30
39
 
31
- # the template parser to use
32
- config.template_parser = :haml # :erb or :haml supported, :haml is default
40
+ The shorthand wraps up the above code into a single method call for convenience
33
41
 
34
- # location of the template files
35
- config.template_path = "support/templates/haml"
42
+ ```ruby
43
+ Shortcode.process("[quote]Hello World[/quote]")
44
+ ```
36
45
 
37
- # a list of block tags to support e.g. [quote]Hello World[/quote]
38
- config.block_tags = [:quote, :collapsible_list, :item, :timeline_person]
46
+ ### Configuration
39
47
 
40
- # a list of self closing tags to support e.g. [gallery]
41
- config.self_closing_tags = [:timeline_event, :timeline_info]
42
- end
48
+ ```ruby
49
+ Shortcode.setup do |config|
50
+
51
+ # the template parser to use
52
+ config.template_parser = :haml # :erb or :haml supported, :haml is default
53
+
54
+ # location of the template files
55
+ config.template_path = "support/templates/haml"
56
+
57
+ # a list of block tags to support e.g. [quote]Hello World[/quote]
58
+ config.block_tags = [:quote]
59
+
60
+ # a list of self closing tags to support e.g. [youtube id="12345"]
61
+ config.self_closing_tags = [:youtube]
62
+ end
63
+ ```
64
+
65
+ ### Templates
66
+
67
+ Each shortcode tag needs a template file to translate the shortcode into html. Templates can be written in HAML or erb and work in
68
+ a similar way to views in Rails. The main content of a tag is passed via the instance variable `@content`. Any attributes defined on a tag are passed in via an `@attributes` hash, shortcodes can have any number of attributes. For instance a quote shortcode might look like this:
69
+
70
+ [quote author="Homer Simpson"]Doh![/quote]
71
+
72
+ And the haml template to render the shortcode
73
+
74
+ ```haml
75
+ %blockquote
76
+ %p.quotation= @content
77
+ -if @attributes[:author]
78
+ %p.citation
79
+ %span.author= @attributes[:author]
80
+ ```
81
+
82
+ Shortcodes can be nested inside other shortcodes, there are no limits imposed on the nesting depth. This can be useful when creating complex content such as a collapsible list that can have any content inside each element. We could have the following shortcodes
83
+
84
+ [collapsible_list]
85
+ [item]
86
+ [youtube id="12345"]
87
+ [/item]
88
+ [item]Hellow World[/item]
89
+ [/collapsible_list]
90
+
91
+ Three templates would be required to support the above content, `[:collapsible_list, :item, :youtube]`. Each template is rendered in isolation and has no knowledge of parent or child elements.
43
92
 
44
93
  ## Contributing
45
94
 
data/lib/shortcode.rb CHANGED
@@ -15,16 +15,30 @@ module Shortcode
15
15
 
16
16
  # Set the supported block_tags
17
17
  mattr_accessor :block_tags
18
- @@block_tags = [:quote, :collapsible_list, :item, :timeline_person]
18
+ @@block_tags = [:quote]
19
19
 
20
20
  # Set the supported self_closing_tags
21
21
  mattr_accessor :self_closing_tags
22
- @@self_closing_tags = [:timeline_event, :timeline_info]
22
+ @@self_closing_tags = [:youtube]
23
23
 
24
24
  def self.setup
25
25
  yield self
26
26
  end
27
27
 
28
+ def self.process(code)
29
+ transformer.apply(parser.parse(code))
30
+ end
31
+
32
+ private
33
+
34
+ def self.parser
35
+ @@parser ||= Shortcode::Parser.new
36
+ end
37
+
38
+ def self.transformer
39
+ @@transformer ||= Shortcode::Transformer.new
40
+ end
41
+
28
42
  end
29
43
 
30
44
  require 'shortcode/version'
data/lib/shortcode/tag.rb CHANGED
@@ -1,14 +1,14 @@
1
1
  class Shortcode::Tag
2
2
 
3
- def initialize(name, opts=[])
3
+ def initialize(name, attributes=[])
4
4
  @name = name.downcase
5
- set_options opts
5
+ set_attributes attributes
6
6
  end
7
7
 
8
- def set_options(opts)
8
+ def set_attributes(attributes)
9
9
  hash = {}
10
- opts.each { |o| hash[o[:key].to_sym] = o[:value] }
11
- @options = hash
10
+ attributes.each { |o| hash[o[:key].to_sym] = o[:value] }
11
+ @attributes = hash
12
12
  end
13
13
 
14
14
  def markup
@@ -18,8 +18,8 @@ class Shortcode::Tag
18
18
  raise Shortcode::TemplateNotFound, "Searched in:", template_files
19
19
  end
20
20
 
21
- def wrap(text='')
22
- @text = text
21
+ def wrap(content='')
22
+ @content = content
23
23
  render_template
24
24
  end
25
25
 
@@ -1,3 +1,3 @@
1
1
  module Shortcode
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
data/shortcode.gemspec CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |spec|
10
10
  spec.email = ["jamie@kernowsoul.com"]
11
11
  spec.description = "Gem for parsing wordpress style shortcodes"
12
12
  spec.summary = "Gem for parsing wordpress style shortcodes"
13
- spec.homepage = ""
13
+ spec.homepage = "https://github.com/kernow/shortcode"
14
14
  spec.license = "MIT"
15
15
 
16
16
  spec.files = `git ls-files`.split($/)
@@ -0,0 +1,31 @@
1
+ require 'spec_helper'
2
+ require 'parslet/rig/rspec'
3
+ require 'pp'
4
+
5
+ describe Shortcode do
6
+
7
+ let(:simple_quote) { load_fixture :simple_quote }
8
+ let(:simple_quote_output) { load_fixture :simple_quote_output, :html }
9
+
10
+ context "simple_quote" do
11
+
12
+ it "converts into html" do
13
+ Shortcode.process(simple_quote).should == simple_quote_output
14
+ end
15
+
16
+ end
17
+
18
+ context "erb templates" do
19
+
20
+ before(:each) do
21
+ Shortcode.setup do |config|
22
+ config.template_parser = :erb
23
+ config.template_path = File.join File.dirname(__FILE__), "support/templates/erb"
24
+ end
25
+ end
26
+
27
+ it "converts into html" do
28
+ Shortcode.process(simple_quote).gsub("\n",'').should == simple_quote_output.gsub("\n",'')
29
+ end
30
+ end
31
+ end
data/spec/spec_helper.rb CHANGED
@@ -10,6 +10,8 @@ RSpec.configure do |config|
10
10
  Shortcode.setup do |config|
11
11
  config.template_parser = :haml
12
12
  config.template_path = File.join File.dirname(__FILE__), "support/templates/haml"
13
+ config.block_tags = [:quote, :collapsible_list, :item, :timeline_person]
14
+ config.self_closing_tags = [:timeline_event, :timeline_info]
13
15
  end
14
16
  end
15
17
  end
@@ -1,11 +1,11 @@
1
1
  <blockquote>
2
- <p class='quotation'><%= @text %></p>
3
- <% if @options[:author] || @options[:title] %>
2
+ <p class='quotation'><%= @content %></p>
3
+ <% if @attributes[:author] || @attributes[:title] %>
4
4
  <p class='citation'>
5
- <% if @options[:author] %>
6
- <span class='author'><%= @options[:author] %></span>
5
+ <% if @attributes[:author] %>
6
+ <span class='author'><%= @attributes[:author] %></span>
7
7
  <% end %>
8
- <% if @options[:title] <% end %><span class='position'><%= @options[:title] %></span>
8
+ <% if @attributes[:title] <% end %><span class='position'><%= @attributes[:title] %></span>
9
9
  <% end %>
10
10
  </p>
11
11
  <% end %>
@@ -1,2 +1,2 @@
1
1
  .collapsible
2
- = @text
2
+ = @content
@@ -1,3 +1,3 @@
1
1
  %section
2
- %h5= @options[:title]
3
- %div= @text
2
+ %h5= @attributes[:title]
3
+ %div= @content
@@ -1,8 +1,8 @@
1
1
  %blockquote
2
- %p.quotation= @text
3
- -if @options[:author] || @options[:title]
2
+ %p.quotation= @content
3
+ -if @attributes[:author] || @attributes[:title]
4
4
  %p.citation
5
- -if @options[:author]
6
- %span.author= @options[:author]
7
- -if @options[:title]
8
- %span.position= @options[:title]
5
+ -if @attributes[:author]
6
+ %span.author= @attributes[:author]
7
+ -if @attributes[:title]
8
+ %span.position= @attributes[:title]
@@ -3,8 +3,8 @@
3
3
  %tbody
4
4
  %tr
5
5
  %th{scope: :row}
6
- = @options[:date]
6
+ = @attributes[:date]
7
7
  %td.event
8
- %span.description= @options[:title]
9
- -if @options[:link]
10
- %a.read_more{href: @options[:link]} Read More
8
+ %span.description= @attributes[:title]
9
+ -if @attributes[:link]
10
+ %a.read_more{href: @attributes[:link]} Read More
@@ -3,6 +3,6 @@
3
3
  %tbody
4
4
  %tr
5
5
  %th{scope: :row}
6
- = @options[:date]
6
+ = @attributes[:date]
7
7
  %td.information
8
- %p= @options[:title]
8
+ %p= @attributes[:title]
@@ -3,13 +3,13 @@
3
3
  %tbody
4
4
  %tr
5
5
  %th{scope: :row}
6
- = @options[:date]
6
+ = @attributes[:date]
7
7
  %td.team_news
8
- %img{src: @options[:image]}
9
- %h4= @options[:title]
10
- %span.name= @options[:name]
11
- %span.position= @options[:position]
12
- -if @options[:link]
13
- %a.read_more{href: @options[:link]} View Profile
8
+ %img{src: @attributes[:image]}
9
+ %h4= @attributes[:title]
10
+ %span.name= @attributes[:name]
11
+ %span.position= @attributes[:position]
12
+ -if @attributes[:link]
13
+ %a.read_more{href: @attributes[:link]} View Profile
14
14
  .description
15
- %p= @text
15
+ %p= @content
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: shortcode
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-08-05 00:00:00.000000000 Z
12
+ date: 2013-08-07 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: parslet
@@ -128,6 +128,7 @@ files:
128
128
  - lib/shortcode/version.rb
129
129
  - shortcode.gemspec
130
130
  - spec/parser_spec.rb
131
+ - spec/shortcode_spec.rb
131
132
  - spec/spec_helper.rb
132
133
  - spec/support/fixtures.rb
133
134
  - spec/support/fixtures/complex_snippet.txt
@@ -155,7 +156,7 @@ files:
155
156
  - spec/support/templates/haml/timeline_person.html.haml
156
157
  - spec/tag_spec.rb
157
158
  - spec/transformer_spec.rb
158
- homepage: ''
159
+ homepage: https://github.com/kernow/shortcode
159
160
  licenses:
160
161
  - MIT
161
162
  post_install_message:
@@ -182,6 +183,7 @@ specification_version: 3
182
183
  summary: Gem for parsing wordpress style shortcodes
183
184
  test_files:
184
185
  - spec/parser_spec.rb
186
+ - spec/shortcode_spec.rb
185
187
  - spec/spec_helper.rb
186
188
  - spec/support/fixtures.rb
187
189
  - spec/support/fixtures/complex_snippet.txt