diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4f10e18 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +/.bundle/ +/.yardoc +/Gemfile.lock +/_yardoc/ +/coverage/ +/doc/ +/pkg/ +/tmp/ +.rbenv-gemsets diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..99ebcaa --- /dev/null +++ b/Gemfile @@ -0,0 +1,4 @@ +source 'https://rubygems.org' + +# Specify your gem's dependencies in markdown_checkboxes.gemspec +gemspec diff --git a/README.md b/README.md index 8f42dcb..1e790eb 100644 --- a/README.md +++ b/README.md @@ -61,6 +61,28 @@ Assuming you have your infrastructure set up accordingly, this should send an HT your post's body, as well as fire unobtrusive javascript after the action is completed (allowing you to do things like prevent a page refresh, and other cool js things) +### Passing html options + +Also, it is possible to pass html options to rendered checkboxes. + +You can pass second argument to `#render` method with hash of options: + +```ruby +markdown = '- [ ] - [x]' +html_options = { disabled: true } + +parser.render(markdown, html_options) do |data, updated_text| + # ... +end +``` + +Result will look like follows: + +```html + + +``` + ### Installation ``` diff --git a/Rakefile b/Rakefile index debc11c..5814915 100644 --- a/Rakefile +++ b/Rakefile @@ -4,5 +4,5 @@ Rake::TestTask.new do |t| t.libs << 'test' end -desc "Run tests" +desc 'Run tests' task :default => :test diff --git a/lib/markdown_checkboxes.rb b/lib/markdown_checkboxes.rb index 2fe350f..fd15e82 100644 --- a/lib/markdown_checkboxes.rb +++ b/lib/markdown_checkboxes.rb @@ -1,45 +1,37 @@ require 'redcarpet' require 'action_view' -require File.dirname(__FILE__) + '/markdown_checkboxes/data_struct' +require 'markdown_checkboxes/data_struct' class CheckboxMarkdown < Redcarpet::Markdown include ActionView::Helpers::FormTagHelper - VERSION = '1.0.0' + CHECKBOX_REGEX = /-\s?\[(x|\s)\]/ - def render(text, &block) - text = parse_with_checkboxes(text, &block) - super(text) + def render(text, html_options = {}, &block) + super(parse_with_checkboxes(text, html_options, &block)) end private - def parse_with_checkboxes(text, &block) - checkbox_regex = /-\s?\[(x|\s)\]/ + def parse_with_checkboxes(text, html_options, &block) + raw_text = html_options.delete(:raw_text) { text } - text.gsub(checkbox_regex).with_index do |current_match, current_index| - checked = current_match =~ /x/ ? true : false + text.gsub(CHECKBOX_REGEX).with_index do |current_match, current_index| + checked = current_match =~ /x/ + body = updated_body(raw_text, current_index, checked) - body = - text.gsub(checkbox_regex).with_index do |match, index| - if index == current_index - checked ? "- [ ]" : "- [x]" - else - match - end - end - - check_box_tag "check_#{current_index}", "", checked, data: data_options(body, &block) + check_box_tag("check_#{current_index}", '', checked, **html_options, data: data_options(body, &block)) end end - def data_options(body) - if block_given? - data_struct = DataStruct.new - yield(data_struct, body) - data_struct.serializable_hash - else - {} + def data_options(body, &block) + DataStruct.new(body, &block).data + end + + def updated_body(text, current_index, current_checked) + text.gsub(CHECKBOX_REGEX).with_index do |match, index| + next match if index != current_index + current_checked ? '- [ ]' : '- [x]' end end diff --git a/lib/markdown_checkboxes/data_struct.rb b/lib/markdown_checkboxes/data_struct.rb index 76aee11..77bf3df 100644 --- a/lib/markdown_checkboxes/data_struct.rb +++ b/lib/markdown_checkboxes/data_struct.rb @@ -1,20 +1,27 @@ class DataStruct attr_accessor :data - def initialize + def initialize(body) @data = {} + yield(self, body) if block_given? end - def serializable_hash - Hash[@data.map { |k,v| [k.to_s, v.to_s] }] + def method_missing(name, *args, &block) + return super if !is_setter(name) + @data[dashed(name)] = args.first.to_s end - def method_missing(name, *args, &block) - if name.to_s =~ /=$/ - @data[name.to_s.gsub('_', '-').chop] = args.first - else - super(name, *args, &block) - end + def respond_to_missing?(method_name, include_private = false) + is_setter(method_name) || @data.has_key?(dashed(method_name)) || super end -end + private + + def is_setter(method_name) + !!(method_name.to_s =~ /=\z/) + end + + def dashed(value) + value.to_s.gsub('_', '-').sub(/=\z/, '') + end +end diff --git a/markdown_checkboxes-1.0.0.gem b/markdown_checkboxes-1.0.0.gem deleted file mode 100644 index 8f2e5d1..0000000 Binary files a/markdown_checkboxes-1.0.0.gem and /dev/null differ diff --git a/markdown_checkboxes-1.1.0.gem b/markdown_checkboxes-1.1.0.gem new file mode 100644 index 0000000..5f7583c Binary files /dev/null and b/markdown_checkboxes-1.1.0.gem differ diff --git a/markdown_checkboxes.gemspec b/markdown_checkboxes.gemspec index ac704ff..c92a7ca 100644 --- a/markdown_checkboxes.gemspec +++ b/markdown_checkboxes.gemspec @@ -1,20 +1,38 @@ -require File.dirname(__FILE__) + '/lib/markdown_checkboxes' +# coding: utf-8 + +lib = File.expand_path('../lib', __FILE__) +$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) Gem::Specification.new do |s| s.name = 'markdown_checkboxes' - s.version = CheckboxMarkdown::VERSION - s.date = '2013-11-20' + s.version = '1.1.0' + s.date = '2017-03-28' s.summary = 'Markdown with checkbox support' s.description = 'Adding checkbox rendering functionality on top of the redcarpet markdown parser' s.authors = ['Brightbit Apps'] s.email = 'hello@brightbit.com' - s.files = ['lib/markdown_checkboxes.rb', 'lib/markdown_checkboxes/data_struct.rb'] s.homepage = 'http://rubygems.org/gems/markdown_checkboxes' s.license = 'MIT' - s.add_runtime_dependency "redcarpet", '>= 3.0.0' - s.add_runtime_dependency "actionpack", '>= 2.0.0' + if s.respond_to?(:metadata) + s.metadata['allowed_push_host'] = 'https://rubygems.org' + else + raise 'RubyGems 2.0 or newer is required to protect against ' \ + 'public gem pushes.' + end + + s.files = `git ls-files -z`.split("\x0").reject do |f| + f.match(%r{^(test|spec|features)/}) + f.match(/\.gem\z/) + end + + s.bindir = 'exe' + s.executables = s.files.grep(%r{^exe/}) { |f| File.basename(f) } + s.require_paths = %w(lib) + + s.add_runtime_dependency 'redcarpet', '~> 3.4' + s.add_runtime_dependency 'actionpack', '~> 5.0' - s.add_development_dependency "rake-compiler", "~> 0.8.3" - s.add_development_dependency "test-unit", "~> 2.5.4" + s.add_development_dependency 'rake-compiler', '~> 1.0' + s.add_development_dependency 'test-unit', '~> 3.2' end diff --git a/test/test_data_struct.rb b/test/test_data_struct.rb index fce82c2..27bb828 100644 --- a/test/test_data_struct.rb +++ b/test/test_data_struct.rb @@ -1,11 +1,11 @@ require 'test/unit' -require File.dirname(__FILE__) + '/../lib/markdown_checkboxes/data_struct' +require 'markdown_checkboxes/data_struct' class DataStructTest < Test::Unit::TestCase def setup - @struct = DataStruct.new - @struct.key = "value" + @struct = DataStruct.new('Lorem ipsum...') + @struct.key = 'value' @struct.test = true end @@ -13,19 +13,15 @@ def test_data_struct_exists assert @struct.is_a? DataStruct end - def test_methods_turn_into_key_value_pairs - assert_equal @struct.data["key"], "value" - assert_equal @struct.data["test"], true - end - - def test_serializable_hash - assert_equal @struct.serializable_hash, { "key" => "value", "test" => "true" } + def test_methods_turn_into_stringified_key_value_pairs + assert_equal @struct.data['key'], 'value' + assert_equal @struct.data['test'], 'true' end def test_underscores_turning_to_dashes - @struct.okc_thunder = "awesome" - assert @struct.data.has_key? "okc-thunder" - assert_equal @struct.data["okc-thunder"], 'awesome' + @struct.okc_thunder = 'awesome' + assert @struct.data.has_key?('okc-thunder') + assert_equal @struct.data['okc-thunder'], 'awesome' end def test_still_calls_real_method_missing @@ -34,5 +30,15 @@ def test_still_calls_real_method_missing end end -end + def test_responds_to_setters + assert_respond_to @struct, :setter= + assert_respond_to @struct, :alt_setter= + end + def test_responds_to_data_keys_getters + @struct.okc_thunder = 'awesome' + assert_respond_to @struct, :okc_thunder + refute_respond_to @struct, :getter + end + +end diff --git a/test/test_markdown_checkboxes.rb b/test/test_markdown_checkboxes.rb index 9d78c28..12b2d1b 100644 --- a/test/test_markdown_checkboxes.rb +++ b/test/test_markdown_checkboxes.rb @@ -1,10 +1,10 @@ require 'test/unit' -require File.dirname(__FILE__) + '/../lib/markdown_checkboxes' +require 'markdown_checkboxes' class MarkdownCheckboxesTest < Test::Unit::TestCase def setup - @m ||= CheckboxMarkdown.new(Redcarpet::Render::HTML.new()) + @m ||= CheckboxMarkdown.new(Redcarpet::Render::HTML.new) end def test_proper_markdown_inheritance @@ -13,32 +13,46 @@ def test_proper_markdown_inheritance end def test_standard_markdown - assert_equal @m.render("## Hello"), "
Bold
\n" + assert_equal @m.render('## Hello'), "Bold
\n" end def test_checkbox_existence - assert_match /