markababy 1.0.0 → 1.3.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 2b6a178f6e549aad27f67e34231d7846cbc671071070c7b1c0278f6d68ae2f4b
4
+ data.tar.gz: 6c0168a1e33b4a38f9d8836996cb9a30f50a193e3faf6d73257dc1e6605702a6
5
+ SHA512:
6
+ metadata.gz: 992a470b24c2761a51027872afb0523968f3ec464bb0e13ef54c77402a974a14d17d9ba98ac8c9ed2145c111f8dc5ec4ef6f32b84674bd0fc50bded13def160e
7
+ data.tar.gz: 462b050b3c49ae95525b9d927e30bb1226d2902b244ae4dd646c1d6e0dde68eea40ac2579d959aa54e887f2253583508b446da0c40f9d56ce8e708b44a4226d5
@@ -0,0 +1,4 @@
1
+ Copyright (c) 2011-2021 TIMCRAFT
2
+
3
+ This is an Open Source project licensed under the terms of the LGPLv3 license.
4
+ Please see <http://www.gnu.org/licenses/lgpl-3.0.html> for license text.
@@ -0,0 +1,64 @@
1
+ # markababy
2
+
3
+ [![Gem Version](https://badge.fury.io/rb/markababy.svg)](https://badge.fury.io/rb/markababy) [![Build Status](https://api.travis-ci.org/timcraft/markababy.svg?branch=master)](https://travis-ci.org/timcraft/markababy)
4
+
5
+
6
+ Markaby's little sister. A small library for writing HTML in Ruby.
7
+
8
+
9
+ ## Installation
10
+
11
+ $ gem install markababy
12
+
13
+
14
+ ## Example
15
+
16
+ Usage is similar to [Markaby](http://en.wikipedia.org/wiki/Markaby),
17
+ and easy to use directly from a Ruby script:
18
+
19
+ ```ruby
20
+ require 'markababy'
21
+
22
+ Markababy.markup do
23
+ html do
24
+ head { title 'Boats.com' }
25
+ body do
26
+ h1 'Boats.com has great deals'
27
+ ul do
28
+ li '$49 for a canoe'
29
+ li '$39 for a raft'
30
+ li '$29 for a huge boot that floats and can fit 5 people'
31
+ end
32
+ end
33
+ end
34
+ end
35
+ ```
36
+
37
+ Use `Markababy.capture` if you want to capture
38
+ the output as a string instead of printing it to STDOUT.
39
+
40
+
41
+ ## Rails template usage
42
+
43
+ Add markababy as a dependency to your Gemfile; do the bundle dance; then change
44
+ the extension on your template files from .erb to .rb and you can start writing
45
+ your templates in Ruby!
46
+
47
+ Controller instance variables and helpers will be available as methods.
48
+
49
+
50
+ ## Less is more
51
+
52
+ Some differences from Markaby:
53
+
54
+ * No auto-stringification
55
+ * No element classes or IDs
56
+ * No validation
57
+ * No XHTML
58
+
59
+
60
+ ## Alternatives
61
+
62
+ * https://github.com/timcraft/hom
63
+ * https://github.com/judofyr/tubby
64
+ * https://github.com/digital-fabric/rubyoshka
@@ -1,8 +1,9 @@
1
+ require 'markababy/builder'
1
2
  require 'cgi'
2
3
 
3
4
  module Markababy
4
5
  def self.capture(options = {}, &block)
5
- [].tap { |output| markup(options.merge(output: output), &block) }.join
6
+ [].tap { |output| markup(options.merge(:output => output), &block) }.join
6
7
  end
7
8
 
8
9
  def self.markup(options = {}, &block)
@@ -10,58 +11,18 @@ module Markababy
10
11
 
11
12
  options[:output] = $stdout unless options.has_key?(:output)
12
13
 
13
- options[:output] << "<!DOCTYPE html>\n" if options[:doctype]
14
+ options[:output] << doctype if options[:doctype]
14
15
 
15
16
  Builder.new(options, &block)
16
17
  end
17
18
 
18
- class Builder < BasicObject
19
- def initialize(options, &block)
20
- @options = options
21
-
22
- @output = @options[:output]
23
-
24
- @escape = @options[:escape]
25
-
26
- @context = @options[:context]
27
-
28
- instance_eval(&block)
29
- end
30
-
31
- def method_missing(sym, *args, &block)
32
- if !@context.nil? && @context.respond_to?(sym)
33
- return @context.send(sym, *args, &block)
34
- end
35
-
36
- attributes, content = [], []
37
-
38
- args.flatten.each do |arg|
39
- if arg.respond_to?(:to_hash)
40
- arg.to_hash.each { |k, v| attributes << ' %s="%s"' % [@escape[k.to_s], @escape[v.to_s]] }
41
- elsif arg.respond_to?(:id2name)
42
- attributes << ' %s' % @escape[arg.to_s]
43
- elsif arg.respond_to?(:html_safe?) && arg.html_safe?
44
- content << arg.to_s
45
- else
46
- content << @escape[arg.to_s]
47
- end
48
- end
49
-
50
- @output << (attributes.empty? ? "<#{sym}>" : "<#{sym}#{attributes.join}>")
51
-
52
- @output << content.join unless content.empty?
53
-
54
- instance_eval(&block) unless block.nil?
55
-
56
- @output << "</#{sym}>" unless content.empty? && block.nil?
57
- end
19
+ def self.doctype
20
+ @doctype ||= "<!DOCTYPE html>\n".freeze
21
+ end
58
22
 
59
- def text(content)
60
- if content.respond_to?(:html_safe?) && content.html_safe?
61
- @output << content.to_s
62
- else
63
- @output << @escape[content.to_s]
64
- end
65
- end
23
+ if defined?(Rails)
24
+ require 'markababy/rails_template_context'
25
+ require 'markababy/rails_template_handler'
26
+ require 'markababy/railtie'
66
27
  end
67
28
  end
@@ -0,0 +1,59 @@
1
+ module Markababy
2
+ class Builder < BasicObject
3
+ def initialize(options, &block)
4
+ @options = options
5
+
6
+ @output = @options[:output]
7
+
8
+ @escape = @options[:escape]
9
+
10
+ @context = @options[:context]
11
+
12
+ instance_eval(&block)
13
+ end
14
+
15
+ def context_responds_to?(name)
16
+ @context.respond_to?(name)
17
+ end
18
+
19
+ def method_missing(sym, *args, &block)
20
+ if @context && context_responds_to?(sym)
21
+ return @context.send(sym, *args, &block)
22
+ end
23
+
24
+ attributes, content = [], []
25
+
26
+ args.flatten.each do |arg|
27
+ if arg.respond_to?(:to_hash)
28
+ arg.to_hash.each { |k, v| attributes << ' %s="%s"' % [@escape[k.to_s], @escape[v.to_s]] }
29
+ elsif arg.respond_to?(:id2name)
30
+ attributes << ' %s' % @escape[arg.to_s]
31
+ elsif arg.respond_to?(:html_safe?) && arg.html_safe?
32
+ content << arg.to_s
33
+ else
34
+ content << @escape[arg.to_s]
35
+ end
36
+ end
37
+
38
+ @output << (attributes.empty? ? "<#{sym}>" : "<#{sym}#{attributes.join}>")
39
+
40
+ @output << content.join unless content.empty?
41
+
42
+ instance_eval(&block) unless block.nil?
43
+
44
+ @output << "</#{sym}>" unless content.empty? && block.nil?
45
+ end
46
+
47
+ def text(content)
48
+ if content.respond_to?(:html_safe?) && content.html_safe?
49
+ @output << content.to_s
50
+ else
51
+ @output << @escape[content.to_s]
52
+ end
53
+ end
54
+
55
+ def self.const_missing(name)
56
+ ::Object.const_get(name)
57
+ end
58
+ end
59
+ end
@@ -1,12 +1,9 @@
1
- require 'markababy'
2
- require 'action_view'
3
-
4
1
  module Markababy
5
2
  class RailsTemplateContext
6
3
  def initialize(controller)
7
4
  @controller = controller
8
5
 
9
- @ivars = @controller.instance_variables - @controller.class.new.instance_variables
6
+ @ivars = @controller.instance_variables.map(&:to_sym)
10
7
  end
11
8
 
12
9
  def respond_to_missing?(sym, include_private = false)
@@ -23,19 +20,4 @@ module Markababy
23
20
  end
24
21
  end
25
22
  end
26
-
27
- module RailsTemplateHandler
28
- def self.call(template)
29
- "self.output_buffer = ''\n" +
30
- "Markababy.capture(output: self.output_buffer, context: Markababy::RailsTemplateContext.new(self)) do\n" +
31
- "#{template.source}\n" +
32
- "end\n"
33
- end
34
-
35
- def self.extended(base)
36
- base.register_default_template_handler :rb, self
37
- end
38
- end
39
-
40
- ActionView::Template.extend RailsTemplateHandler
41
23
  end
@@ -0,0 +1,10 @@
1
+ module Markababy
2
+ module RailsTemplateHandler
3
+ def self.call(template, source)
4
+ "self.output_buffer = ''\n" +
5
+ "Markababy.capture(:output => self.output_buffer, :context => Markababy::RailsTemplateContext.new(self)) do\n" +
6
+ "#{template.source}\n" +
7
+ "end\n"
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,9 @@
1
+ module Markababy
2
+ class Railtie < Rails::Railtie
3
+ initializer 'markababy.action_view' do |app|
4
+ ActiveSupport.on_load(:action_view) do
5
+ ActionView::Template.register_default_template_handler :rb, RailsTemplateHandler
6
+ end
7
+ end
8
+ end
9
+ end
@@ -1,14 +1,19 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'markababy'
3
- s.version = '1.0.0'
3
+ s.version = '1.3.2'
4
+ s.license = 'LGPL-3.0'
4
5
  s.platform = Gem::Platform::RUBY
5
6
  s.authors = ['Tim Craft']
6
7
  s.email = ['mail@timcraft.com']
7
- s.homepage = 'http://github.com/timcraft/markababy'
8
+ s.homepage = 'https://github.com/timcraft/markababy'
8
9
  s.description = 'Markaby\'s little sister'
9
10
  s.summary = 'See description'
10
- s.files = Dir.glob('{lib,spec}/**/*') + %w(README.txt Rakefile markababy.gemspec)
11
- s.add_development_dependency('activesupport', ['>= 3.0.3'])
12
- s.add_development_dependency('actionpack', ['>= 3.0.3'])
11
+ s.files = Dir.glob('lib/**/*.rb') + %w(LICENSE.txt README.md markababy.gemspec)
12
+ s.required_ruby_version = '>= 1.9.3'
13
13
  s.require_path = 'lib'
14
+ s.metadata = {
15
+ 'homepage' => 'https://github.com/timcraft/markababy',
16
+ 'source_code_uri' => 'https://github.com/timcraft/markababy',
17
+ 'bug_tracker_uri' => 'https://github.com/timcraft/markababy/issues'
18
+ }
14
19
  end
metadata CHANGED
@@ -1,38 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: markababy
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
5
- prerelease:
4
+ version: 1.3.2
6
5
  platform: ruby
7
6
  authors:
8
7
  - Tim Craft
9
- autorequire:
8
+ autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2011-10-11 00:00:00.000000000Z
13
- dependencies:
14
- - !ruby/object:Gem::Dependency
15
- name: activesupport
16
- requirement: &10149360 !ruby/object:Gem::Requirement
17
- none: false
18
- requirements:
19
- - - ! '>='
20
- - !ruby/object:Gem::Version
21
- version: 3.0.3
22
- type: :development
23
- prerelease: false
24
- version_requirements: *10149360
25
- - !ruby/object:Gem::Dependency
26
- name: actionpack
27
- requirement: &10149030 !ruby/object:Gem::Requirement
28
- none: false
29
- requirements:
30
- - - ! '>='
31
- - !ruby/object:Gem::Version
32
- version: 3.0.3
33
- type: :development
34
- prerelease: false
35
- version_requirements: *10149030
11
+ date: 2021-01-04 00:00:00.000000000 Z
12
+ dependencies: []
36
13
  description: Markaby's little sister
37
14
  email:
38
15
  - mail@timcraft.com
@@ -40,36 +17,38 @@ executables: []
40
17
  extensions: []
41
18
  extra_rdoc_files: []
42
19
  files:
43
- - lib/markababy/rails.rb
20
+ - LICENSE.txt
21
+ - README.md
44
22
  - lib/markababy.rb
45
- - spec/markababy_rails_spec.rb
46
- - spec/markababy_spec.rb
47
- - spec/views/index.html.rb
48
- - README.txt
49
- - Rakefile
23
+ - lib/markababy/builder.rb
24
+ - lib/markababy/rails_template_context.rb
25
+ - lib/markababy/rails_template_handler.rb
26
+ - lib/markababy/railtie.rb
50
27
  - markababy.gemspec
51
- homepage: http://github.com/timcraft/markababy
52
- licenses: []
53
- post_install_message:
28
+ homepage: https://github.com/timcraft/markababy
29
+ licenses:
30
+ - LGPL-3.0
31
+ metadata:
32
+ homepage: https://github.com/timcraft/markababy
33
+ source_code_uri: https://github.com/timcraft/markababy
34
+ bug_tracker_uri: https://github.com/timcraft/markababy/issues
35
+ post_install_message:
54
36
  rdoc_options: []
55
37
  require_paths:
56
38
  - lib
57
39
  required_ruby_version: !ruby/object:Gem::Requirement
58
- none: false
59
40
  requirements:
60
- - - ! '>='
41
+ - - ">="
61
42
  - !ruby/object:Gem::Version
62
- version: '0'
43
+ version: 1.9.3
63
44
  required_rubygems_version: !ruby/object:Gem::Requirement
64
- none: false
65
45
  requirements:
66
- - - ! '>='
46
+ - - ">="
67
47
  - !ruby/object:Gem::Version
68
48
  version: '0'
69
49
  requirements: []
70
- rubyforge_project:
71
- rubygems_version: 1.8.10
72
- signing_key:
73
- specification_version: 3
50
+ rubygems_version: 3.2.3
51
+ signing_key:
52
+ specification_version: 4
74
53
  summary: See description
75
54
  test_files: []
data/README.txt DELETED
@@ -1,29 +0,0 @@
1
- Markaby's little sister.
2
-
3
- Usage is similar to Markaby, and easy to use directly from a Ruby script:
4
-
5
- require 'markababy'
6
-
7
- Markababy.markup do
8
- html do
9
- head { title 'Boats.com' }
10
- body do
11
- h1 'Boats.com has great deals'
12
- ul do
13
- li '$49 for a canoe'
14
- li '$39 for a raft'
15
- li '$29 for a huge boot that floats and can fit 5 people'
16
- end
17
- end
18
- end
19
- end
20
-
21
- Use Markababy.capture if you want to capture the output as a string instead
22
- of printing it to $stdout.
23
-
24
- Some differences from Markaby:
25
-
26
- * No auto-stringification
27
- * No element classes or IDs
28
- * No validation
29
- * No XHTML
data/Rakefile DELETED
@@ -1,5 +0,0 @@
1
- require 'rake/testtask'
2
-
3
- Rake::TestTask.new do |t|
4
- t.test_files = FileList['spec/*_spec.rb']
5
- end
@@ -1,28 +0,0 @@
1
- require 'minitest/autorun'
2
- require 'abstract_controller'
3
- require 'markababy'
4
- require 'markababy/rails'
5
-
6
- class DummyController < AbstractController::Base
7
- # cf. http://amberbit.com/blog/render-views-partials-outside-controllers-rails-3
8
-
9
- include AbstractController::Rendering
10
- include AbstractController::Layouts
11
- include AbstractController::Helpers
12
-
13
- self.view_paths = 'spec/views'
14
-
15
- def index
16
- @message = 'Controller says hello!'
17
-
18
- render template: 'index'
19
- end
20
- end
21
-
22
- describe DummyController do
23
- it 'should return the correct markup' do
24
- output = '<html><head><title>Controller says hello!</title><p>12,345,678</p></head></html>'
25
-
26
- DummyController.new.index.must_equal output
27
- end
28
- end
@@ -1,73 +0,0 @@
1
- require 'minitest/autorun'
2
- require 'markababy'
3
- require 'active_support/core_ext/string/output_safety'
4
-
5
- class ExampleContext
6
- def baconize(word)
7
- "#{word} bacon!"
8
- end
9
- end
10
-
11
- describe Markababy do
12
- it 'should render tags without attributes or content correctly' do
13
- Markababy.capture { br }.must_equal '<br>'
14
- end
15
-
16
- it 'should render tags with content correctly' do
17
- Markababy.capture { title 'Untitled' }.must_equal '<title>Untitled</title>'
18
- end
19
-
20
- it 'should escape content correctly' do
21
- Markababy.capture { h1 'Apples & Oranges' }.must_equal '<h1>Apples &amp; Oranges</h1>'
22
- end
23
-
24
- it 'should render tags with an attribute hash correctly' do
25
- Markababy.capture { input type: :text, size: 40 }.must_equal '<input type="text" size="40">'
26
- end
27
-
28
- it 'should render tags with an attribute array correctly' do
29
- Markababy.capture { input [{type: :text}, :disabled] }.must_equal '<input type="text" disabled>'
30
- end
31
-
32
- it 'should render tags with attributes and content correctly' do
33
- Markababy.capture { div 'O hai', class: 'name' }.must_equal '<div class="name">O hai</div>'
34
- end
35
-
36
- it 'should render nested tags correctly' do
37
- Markababy.capture { h1 { span 'Chunky bacon!' } }.must_equal '<h1><span>Chunky bacon!</span></h1>'
38
- end
39
-
40
- it 'should allow output target to be specified' do
41
- output = []
42
-
43
- Markababy.markup(output: output) { hr }
44
-
45
- output.join.must_equal '<hr>'
46
- end
47
-
48
- it 'should allow context for method lookup to be specified' do
49
- output = Markababy.capture(context: ExampleContext.new) { h1 baconize('Super chunky') }
50
-
51
- output.must_equal '<h1>Super chunky bacon!</h1>'
52
- end
53
-
54
- it 'should provide a method for rendering text content' do
55
- output = Markababy.capture { h1 { text 'Hello '; strong 'World' } }
56
-
57
- output.must_equal '<h1>Hello <strong>World</strong></h1>'
58
- end
59
-
60
- it 'should respect the html_safe? method' do
61
- Markababy.capture { text 'Hello&nbsp;World'.html_safe }.must_equal 'Hello&nbsp;World'
62
-
63
- output = Markababy.capture { h1 'Hello <strong>World</strong>'.html_safe }
64
-
65
- output.must_equal '<h1>Hello <strong>World</strong></h1>'
66
- end
67
-
68
- it 'should provide an option for including a doctype declaration' do
69
- output = Markababy.capture(doctype: true) { html { body { p 'INSERT CONTENT HERE' } } }
70
-
71
- output.must_equal "<!DOCTYPE html>\n<html><body><p>INSERT CONTENT HERE</p></body></html>"
72
- end
73
- end
@@ -1,7 +0,0 @@
1
- html {
2
- head {
3
- title message
4
-
5
- p number_with_delimiter(12345678)
6
- }
7
- }