formdown 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 +12 -2
- data/lib/formdown/rails.rb +1 -1
- data/lib/formdown/renderer.rb +15 -0
- data/lib/formdown/tilt.rb +6 -0
- data/lib/formdown/version.rb +1 -1
- data/lib/formdown.rb +4 -91
- data/lib/kramdown/parser/formdown.rb +76 -0
- data/lib/tilt/formdown.rb +31 -0
- metadata +6 -2
data/README.md
CHANGED
@@ -89,15 +89,25 @@ In the rails Gemfile, include the formdown gem via:
|
|
89
89
|
gem "formdown", require: "formdown/rails"
|
90
90
|
```
|
91
91
|
|
92
|
-
Rails will pick up files with the extension `.fmd` and render them as HTML. For example, `app/views/user/my_form.fmd
|
92
|
+
Rails will pick up files with the extension `.fmd` and render them as HTML. For example, `app/views/user/my_form.html.fmd` would render the formdown document.
|
93
93
|
|
94
94
|
Its recommended to use a layout around the Formdown file to handle the form submission action and surrounding HTML content.
|
95
95
|
|
96
96
|
**Note**: There's currently no simple way of mapping Formdown fields to ActiveRecord model attributes.
|
97
97
|
|
98
|
+
### Middleman
|
99
|
+
|
100
|
+
In the Gemfile, include the formdown gem via:
|
101
|
+
|
102
|
+
```ruby
|
103
|
+
gem "formdown", require: "formdown/tilt"
|
104
|
+
```
|
105
|
+
|
106
|
+
Place your Formdown file in the [Middleman](http://middlemanapp.com/) source directory and the form will render (e.g. `source/my_form.html.fmd` will render the form at `/my_form.html`)
|
107
|
+
|
98
108
|
## Contributing
|
99
109
|
|
100
|
-
1. Fork it ( https://github.com/
|
110
|
+
1. Fork it ( https://github.com/bradgessler/formdown/fork )
|
101
111
|
2. Create your feature branch (`git checkout -b my-new-feature`)
|
102
112
|
3. Commit your changes (`git commit -am 'Add some feature'`)
|
103
113
|
4. Push to the branch (`git push origin my-new-feature`)
|
data/lib/formdown/rails.rb
CHANGED
@@ -16,4 +16,4 @@ module ActionView
|
|
16
16
|
end
|
17
17
|
|
18
18
|
# Register in the rails stack.
|
19
|
-
ActionView::Template.register_template_handler(
|
19
|
+
ActionView::Template.register_template_handler(*Formdown::FILE_EXTENSIONS, ActionView::Template::Handlers::Formdown.new)
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'kramdown'
|
2
|
+
require 'kramdown/parser/formdown'
|
3
|
+
require 'kramdown/document'
|
4
|
+
|
5
|
+
module Formdown
|
6
|
+
class Renderer
|
7
|
+
def initialize(content)
|
8
|
+
@document = ::Kramdown::Document.new(content, input: 'Formdown')
|
9
|
+
end
|
10
|
+
|
11
|
+
def to_html
|
12
|
+
@document.to_html
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
data/lib/formdown/version.rb
CHANGED
data/lib/formdown.rb
CHANGED
@@ -1,95 +1,8 @@
|
|
1
|
-
require
|
2
|
-
|
3
|
-
# Formdown extends the Markdown language with practical HTML form builder syntax.
|
4
|
-
#
|
5
|
-
# TODO
|
6
|
-
# - name: parameters should be applied at a different layer, NOT within this file. This will
|
7
|
-
# make sure that we don't clobber the users form submissions.
|
8
|
-
# - DRY up the methods below into more of a macro language. The constants, extractions, etc.
|
9
|
-
# are a common pattern.
|
10
|
-
|
11
|
-
require 'kramdown'
|
12
|
-
require 'kramdown/parser/kramdown'
|
13
|
-
require 'kramdown/document'
|
14
|
-
|
15
|
-
module Formdown
|
16
|
-
class Parser < Kramdown::Parser::Kramdown
|
17
|
-
def initialize(source, options)
|
18
|
-
super
|
19
|
-
@span_parsers.unshift :text_fields, :text_areas, :checkboxes, :buttons, :radio_buttons
|
20
|
-
end
|
21
|
-
|
22
|
-
TEXT_FIELD_START = /(_+)([@\#]?)\((.+?)\)/
|
23
|
-
|
24
|
-
def parse_text_fields
|
25
|
-
@src.pos += @src.matched_size
|
26
|
-
line, type, placeholder = TEXT_FIELD_START.match(@src.matched).captures
|
27
|
-
# Optionally pull out email or number types.
|
28
|
-
type = case type
|
29
|
-
when '@' then :email
|
30
|
-
when '#' then :number
|
31
|
-
else :text
|
32
|
-
end
|
33
|
-
@tree.children << Element.new(:html_element, :input, type: type, placeholder: placeholder, name: placeholder, size: line.size)
|
34
|
-
end
|
35
|
-
define_parser(:text_fields, TEXT_FIELD_START, '_{')
|
36
|
-
|
37
|
-
|
38
|
-
TEXT_AREA_START = /(_+)(\/+)\((.+?)\)/
|
39
|
-
|
40
|
-
def parse_text_areas
|
41
|
-
@src.pos += @src.matched_size
|
42
|
-
col, rows, placeholder = TEXT_AREA_START.match(@src.matched).captures
|
43
|
-
@tree.children << Element.new(:html_element, :textarea, placeholder: placeholder, name: placeholder, cols: col.size, rows: rows.size)
|
44
|
-
end
|
45
|
-
define_parser(:text_areas, TEXT_AREA_START, '_/')
|
46
|
-
|
47
|
-
|
48
|
-
CHECKBOX_FIELD_START = /\[([\sxX])?\]/
|
49
|
-
|
50
|
-
def parse_checkboxes
|
51
|
-
@src.pos += @src.matched_size
|
52
|
-
@tree.children << Element.new(:html_element, :input, type: :checkbox)
|
53
|
-
end
|
54
|
-
define_parser(:checkboxes, CHECKBOX_FIELD_START, '\[')
|
55
|
-
|
56
|
-
RADIO_BUTTON_FIELD_START = /\(([\sxX])?\)/
|
57
|
-
|
58
|
-
def parse_radio_buttons
|
59
|
-
@src.pos += @src.matched_size
|
60
|
-
@tree.children << Element.new(:html_element, :input, type: :radio)
|
61
|
-
end
|
62
|
-
define_parser(:radio_buttons, RADIO_BUTTON_FIELD_START, '\(')
|
63
|
-
|
64
|
-
BUTTON_START = /\[\s(.+)\s\]([\!])?/
|
65
|
-
|
66
|
-
def parse_buttons
|
67
|
-
@src.pos += @src.matched_size
|
68
|
-
value, type = BUTTON_START.match(@src.matched).captures
|
69
|
-
type = case type
|
70
|
-
when '!' then :submit
|
71
|
-
# else :button
|
72
|
-
else :submit # TODO - Should we even support other types of buttons? Probably not... just make it a submit.
|
73
|
-
end
|
74
|
-
@tree.children << Element.new(:html_element, :input, type: type, value: value)
|
75
|
-
end
|
76
|
-
define_parser(:buttons, BUTTON_START, '\[')
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
# Work around to get this build passing for Ruby 1.9 since the kramdown Parser.const_get()
|
81
|
-
# TODO - Patch kramdown to work with nested namespaces in Ruby 1.9.
|
82
|
-
# Details about the issue noted at https://github.com/gettalong/kramdown/commit/cd5423f23eb783a2c435e8545a98625cb280f286#diff-1f46a84d29e6ac9751ae5d75bafc25aeR88
|
83
|
-
FormdownParser = Formdown::Parser
|
1
|
+
require 'formdown/version'
|
84
2
|
|
85
3
|
module Formdown
|
86
|
-
|
87
|
-
|
88
|
-
@document = ::Kramdown::Document.new(content, input: 'FormdownParser')
|
89
|
-
end
|
4
|
+
# File extensions for various template handlers.
|
5
|
+
FILE_EXTENSIONS = %w[formdown fmd].freeze
|
90
6
|
|
91
|
-
|
92
|
-
@document.to_html
|
93
|
-
end
|
94
|
-
end
|
7
|
+
autoload :Renderer, 'formdown/renderer'
|
95
8
|
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
require 'kramdown/parser/kramdown'
|
2
|
+
|
3
|
+
# Formdown extends the Markdown language with practical HTML form builder syntax.
|
4
|
+
#
|
5
|
+
# TODO
|
6
|
+
# - name: Form values should be applied at a different layer, NOT within this file. This will
|
7
|
+
# make sure that we don't clobber the users form submissions.
|
8
|
+
# - DRY up the methods below into more of a macro language. The constants, extractions, etc.
|
9
|
+
# are a common pattern.
|
10
|
+
|
11
|
+
module Kramdown
|
12
|
+
module Parser
|
13
|
+
class Formdown < Kramdown::Parser::Kramdown
|
14
|
+
def initialize(source, options)
|
15
|
+
super
|
16
|
+
@span_parsers.unshift :text_fields, :text_areas, :checkboxes, :buttons, :radio_buttons
|
17
|
+
end
|
18
|
+
|
19
|
+
TEXT_FIELD_START = /(_+)([@\#]?)\((.+?)\)/
|
20
|
+
|
21
|
+
def parse_text_fields
|
22
|
+
@src.pos += @src.matched_size
|
23
|
+
line, type, placeholder = TEXT_FIELD_START.match(@src.matched).captures
|
24
|
+
# Optionally pull out email or number types.
|
25
|
+
type = case type
|
26
|
+
when '@' then :email
|
27
|
+
when '#' then :number
|
28
|
+
else :text
|
29
|
+
end
|
30
|
+
@tree.children << Element.new(:html_element, :input, type: type, placeholder: placeholder, name: placeholder, size: line.size)
|
31
|
+
end
|
32
|
+
define_parser(:text_fields, TEXT_FIELD_START, '_{')
|
33
|
+
|
34
|
+
|
35
|
+
TEXT_AREA_START = /(_+)(\/+)\((.+?)\)/
|
36
|
+
|
37
|
+
def parse_text_areas
|
38
|
+
@src.pos += @src.matched_size
|
39
|
+
col, rows, placeholder = TEXT_AREA_START.match(@src.matched).captures
|
40
|
+
@tree.children << Element.new(:html_element, :textarea, placeholder: placeholder, name: placeholder, cols: col.size, rows: rows.size)
|
41
|
+
end
|
42
|
+
define_parser(:text_areas, TEXT_AREA_START, '_/')
|
43
|
+
|
44
|
+
|
45
|
+
CHECKBOX_FIELD_START = /\[([\sxX])?\]/
|
46
|
+
|
47
|
+
def parse_checkboxes
|
48
|
+
@src.pos += @src.matched_size
|
49
|
+
@tree.children << Element.new(:html_element, :input, type: :checkbox)
|
50
|
+
end
|
51
|
+
define_parser(:checkboxes, CHECKBOX_FIELD_START, '\[')
|
52
|
+
|
53
|
+
RADIO_BUTTON_FIELD_START = /\(([\sxX])?\)/
|
54
|
+
|
55
|
+
def parse_radio_buttons
|
56
|
+
@src.pos += @src.matched_size
|
57
|
+
@tree.children << Element.new(:html_element, :input, type: :radio)
|
58
|
+
end
|
59
|
+
define_parser(:radio_buttons, RADIO_BUTTON_FIELD_START, '\(')
|
60
|
+
|
61
|
+
BUTTON_START = /\[\s(.+)\s\]([\!])?/
|
62
|
+
|
63
|
+
def parse_buttons
|
64
|
+
@src.pos += @src.matched_size
|
65
|
+
value, type = BUTTON_START.match(@src.matched).captures
|
66
|
+
type = case type
|
67
|
+
when '!' then :submit
|
68
|
+
# else :button
|
69
|
+
else :submit # TODO - Should we even support other types of buttons? Probably not... just make it a submit.
|
70
|
+
end
|
71
|
+
@tree.children << Element.new(:html_element, :input, type: type, value: value)
|
72
|
+
end
|
73
|
+
define_parser(:buttons, BUTTON_START, '\[')
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'formdown'
|
2
|
+
require 'tilt/template'
|
3
|
+
|
4
|
+
module Tilt
|
5
|
+
class FormdownTemplate < Template
|
6
|
+
# DUMB_QUOTES = [39, 39, 34, 34]
|
7
|
+
|
8
|
+
def self.engine_initialized?
|
9
|
+
defined? ::Formdown
|
10
|
+
end
|
11
|
+
|
12
|
+
def initialize_engine
|
13
|
+
require_template_library 'formdown'
|
14
|
+
end
|
15
|
+
|
16
|
+
def prepare
|
17
|
+
# options[:smart_quotes] = DUMB_QUOTES unless options[:smartypants]
|
18
|
+
# @engine = Formdown::Document.new(data, options)
|
19
|
+
@engine = Formdown::Renderer.new(data)
|
20
|
+
@output = nil
|
21
|
+
end
|
22
|
+
|
23
|
+
def evaluate(scope, locals, &block)
|
24
|
+
@output ||= @engine.to_html
|
25
|
+
end
|
26
|
+
|
27
|
+
def allows_script?
|
28
|
+
false
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: formdown
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
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: 2014-08-
|
12
|
+
date: 2014-08-04 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: kramdown
|
@@ -111,7 +111,11 @@ files:
|
|
111
111
|
- lib/formdown.rb
|
112
112
|
- lib/formdown/cli.rb
|
113
113
|
- lib/formdown/rails.rb
|
114
|
+
- lib/formdown/renderer.rb
|
115
|
+
- lib/formdown/tilt.rb
|
114
116
|
- lib/formdown/version.rb
|
117
|
+
- lib/kramdown/parser/formdown.rb
|
118
|
+
- lib/tilt/formdown.rb
|
115
119
|
- spec/fixtures/kitchen_sink.fmd
|
116
120
|
- spec/formdown_spec.rb
|
117
121
|
- spec/spec_helper.rb
|