hoshi 1.0.3 → 1.1.1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5712bb65af3f082b487149e20c16dc7d7ad796e9
4
- data.tar.gz: ad41a5906aaa48aaab16c0b912375c91a7d2f64d
3
+ metadata.gz: ca598007027aa97210dfa948d34d79b3a1d9d533
4
+ data.tar.gz: 66e539e52fd1d0cf65e10a6b17447bda15b1b926
5
5
  SHA512:
6
- metadata.gz: 5d64a05cc2610dfb1d197aaea201c2511f733fafff11161f564b83f42f4a4154c3efe4ac41527e948d3afc13ca5e586d0a29637df3e25b8639926ae564eae490
7
- data.tar.gz: 117bf21e0b303d8edcb7b4a86ccacd442bbd11a969eaad00ed7715db6cc141a20c633f384bd525e4f3bf14a939a56c1043eee063069a1170deb89fcb5d9c0ed1
6
+ metadata.gz: c52c4c1f843a6bde06813bc637de617c7613b89445c23b252ff242e99f1744f8a76714996949fe1805e54024b893fb85523f05cc094ad8af18dbfd376c327022
7
+ data.tar.gz: e0c86d605ebee271e95b71d9b1f7c09812181ced4a3fe60c69d2417920a195d30dc3031953ca1c642dce1fc64f4091f7b5490b9dc88a5963b4c87cafc993b23d
data/README CHANGED
@@ -2,22 +2,27 @@
2
2
 
3
3
  == Summary
4
4
 
5
- Hoshi is a library for creating real, first-class HTML/XML views. So,
6
- unlike template libraries, you can take advantage of mixins,
7
- inheritance, and all the other wonderful features of Ruby's object
8
- system. There is also support for easy RSS feeds and CGI.
5
+ Hoshi is a library for creating real, first-class HTML/XML views. It is a
6
+ generator, so unlike template libraries, you can take advantage of mixins,
7
+ inheritance, and all the other wonderful features of Ruby's object system.
8
+
9
+ In addition to HTML5 and plain XML, Hoshi supports RSS2 and SVG, as well as some
10
+ older standards like HTML4 and XHTML1. (If you need anything more specific, it
11
+ is easy to extend, and if you want to contribute, patches are welcome.)
9
12
 
10
13
  Hoshi is designed to:
11
- * Generate clean HTML/XHTML/XML with minimal effort
12
- * Be easy for a coder to use and understand
14
+ * Generate clean HTML/XML with minimal effort
15
+ * Be simple, to avoid bugs and keep it easy to use, understand, and modify
13
16
  * Take full advantage of Ruby's object sytem
14
17
  * Be more readable and easier to write than bare HTML
15
18
 
16
- It is semi-modeled after Markaby, but with a much more straightforward
17
- implementation and different semantics (e.g., no instance_eval, so scope
18
- inside a tag is as expected).
19
+ It was initially inspired by (and partially modeled on) Markaby, but the
20
+ implementation is more straightforward so the semantics are cleaner (e.g., no
21
+ instance_eval, meaning scope inside blocks supplied to tags has no gotcha's).
19
22
 
20
- See doc/LICENSE for the license, doc/examples for examples.
23
+ See doc/LICENSE for the license, doc/examples for examples. See test/ for the
24
+ tests, and run `rake test` to execute them. (The tests take a fraction of a
25
+ second to execute.)
21
26
 
22
27
  == Installation
23
28
 
@@ -29,7 +34,7 @@ or by downloading from github (http://github.com/pete/hoshi).
29
34
 
30
35
  == Usage
31
36
 
32
- These examples and more featured in the fabulous doc/examples directory.
37
+ These examples
33
38
  Also, there is a program included called html2hoshi (and associated
34
39
  lib/html2hoshi.rb; see Hoshi.from_html) that takes HTML as input and
35
40
  converts it to Ruby code using Hoshi.
@@ -46,7 +51,7 @@ These should be fairly straightforward:
46
51
  html {
47
52
  head {
48
53
  title "Hello, world!"
49
- link :rel => 'stylesheet', :href => '/css/hoshi.css'
54
+ link rel: 'stylesheet', href: '/css/hoshi.css'
50
55
  }
51
56
 
52
57
  body {
@@ -71,13 +76,13 @@ You can get a little more complicated:
71
76
  html {
72
77
  head {
73
78
  title t
74
- script(:type => 'text/javascript') {
79
+ script(type: 'text/javascript') {
75
80
  raw "alert(\"Hi, I'm some javascript, I suppose.\");"
76
81
  }
77
82
  }
78
83
 
79
84
  body {
80
- h1 t, :class => 'page_title'
85
+ h1 t, class: 'page_title'
81
86
 
82
87
  yield
83
88
  }
@@ -93,7 +98,6 @@ You can get a little more complicated:
93
98
  end
94
99
  end
95
100
 
96
-
97
101
  class Fibonacci < Hoshi::View :xhtml1
98
102
  include Layout
99
103
 
@@ -126,7 +130,8 @@ You can get a little more complicated:
126
130
 
127
131
  === Block-based
128
132
 
129
- For simpler cases where you only intend to produce markup, perhaps for use as a templating engine.
133
+ For simpler cases where you just need to produce a little markup. Useful for
134
+ small scripts.
130
135
 
131
136
  require 'hoshi'
132
137
 
@@ -135,7 +140,7 @@ For simpler cases where you only intend to produce markup, perhaps for use as a
135
140
  html {
136
141
  head {
137
142
  title "Hello, world!"
138
- link :rel => 'stylesheet', :href => '/css/hoshi.css'
143
+ link rel: 'stylesheet', href: '/css/hoshi.css'
139
144
  }
140
145
 
141
146
  body {
@@ -149,37 +154,33 @@ For simpler cases where you only intend to produce markup, perhaps for use as a
149
154
 
150
155
  == Bugs
151
156
 
152
- There needs to be some work done on correcting the tags; I suspect I'm
153
- missing or miscategorizing some of them.
154
-
155
- I'd like to perhaps add a layer for serializing objects in the standard
156
- HTML5 method (i.e., the Schema.org/microdata stuff). That's very
157
- speculative at the moment.
157
+ There needs to be some work done on correcting the tags; I suspect I'm missing
158
+ or miscategorizing some of them. If you come across a case where Hoshi emits
159
+ invalid HTML/XML/etc., please let me know.
158
160
 
159
- There are some requirements that were expedient at the time (requiring
160
- metaid and hpricot, embedding the gemspec in the Rakefile, etc.) that
161
- could use cleanup. Hash is monkey-patched, and using the new Ruby 2
162
- refinements feature would be nicer.
161
+ That's the only known bug likely to affect you. See doc/TODO for a more
162
+ detailed roadmap.
163
163
 
164
164
  == Credits
165
165
 
166
166
  Author:
167
- Pete Elmore -- (pete(a)debu.gs)
167
+ Pete Elmore, Rekka Labs -- ( pete(a)debu.gs )
168
168
 
169
- Pretty heavily indebted to:
169
+ The initial design is pretty heavily indebted to:
170
170
  _why the lucky stiff's Markaby library
171
171
 
172
- Initial design discussion:
173
- Dan Yoder
174
-
175
172
  Simple block version:
176
173
  Nolan Darilek -- (nolan(a)thewordnerd.info)
177
174
 
178
- Homie that be lookin' out for my broken deps:
179
- Lars Lethonen
175
+ Friends that have reported bugs:
176
+ Lars Lethonen, opsangeles -- ( http://opsangeles.com/ )
177
+ Hunter, Spore Labs -- ( https://github.com/madhermit )
180
178
 
181
179
  The guys that paid me to do the initial version:
182
- AT&T Interactive.
180
+ AT&T Interactive. (Now yp.com; they have changed names and owners.)
181
+
182
+ The company that covers development now:
183
+ Rekka Labs -- http://rekka.io/ (Yes, you can hire us.)
183
184
 
184
185
  Also, I guess I should credit Attractive Eighties Women
185
186
  (http://attractiveeightieswomen.com/), since I was blasting them the
data/Rakefile CHANGED
@@ -16,11 +16,10 @@ spec = Gem::Specification.new { |s|
16
16
  Dir['bin/*'].map(&File.method(:basename)).map(&s.executables.method(:<<))
17
17
 
18
18
  s.name = 'hoshi'
19
- s.rubyforge_project = 'hoshi-view'
20
19
  s.summary = "Nice, object-oriented, first-class views."
21
20
  s.homepage = "http://debu.gs/#{s.name}"
22
- %w(metaid hpricot).each &s.method(:add_dependency)
23
- s.version = '1.0.3'
21
+ %w(hpricot).each &s.method(:add_dependency)
22
+ s.version = '1.1.1'
24
23
  }
25
24
 
26
25
  Gem::PackageTask.new(spec) { |pkg|
@@ -29,7 +28,7 @@ Gem::PackageTask.new(spec) { |pkg|
29
28
 
30
29
  task(:install => :package) {
31
30
  g = "pkg/#{spec.name}-#{spec.version}.gem"
32
- system "sudo gem install -l #{g}"
31
+ system "gem install -l #{g}"
33
32
  }
34
33
 
35
34
  task(:test) {
@@ -1,4 +1,4 @@
1
- Copyright (c) 2008,2013 Pete Elmore (pete at debu.gs)
1
+ Copyright (c) 2008-2017 Pete Elmore (pete at debu.gs)
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining a
4
4
  copy of this software and associated documentation files (the "Software"),
data/doc/TODO CHANGED
@@ -1,10 +1,24 @@
1
- TODO for 1.0:
2
- * Separate the tags by close type in the various View sub-classes. (The most
3
- tedious thing on the list, but required for compliance.)
4
- * Still not too happy about the way RSS feeds are done, going to rework.
1
+ TODO:
2
+ · Still not too happy about the way RSS feeds are done, going to rework.
3
+ · I do not use Atom as often as I use RSS, but Atom support would be nice.
4
+ · html2hoshi should move to its own gem.
5
+ · Fix some of the heuristics, default to safe() rather than raw() more often.
6
+ This is based on usage, but it breaks compatibility, so it'll require
7
+ some caution. (Possibly make it configurable or part of blocks' state.)
5
8
 
6
- TODO for later:
7
- * Have html2hoshi do a smarter job of deciding doctypes, not using permissive!
8
- so much.
9
- * View logic helpers.
10
- * Ooh, ooh, SVG!
9
+ Ongoing:
10
+ · Separate the tags by close type in the various View sub-classes. (The most
11
+ tedious thing on the list, but required for compliance.) My current strategy
12
+ is to run things through validator.w3c.org and whenever it complains, I change
13
+ the tag. Most of the HTML I do nowadays is HTML5, so the older versions of
14
+ HTML no longer get checked very often.
15
+
16
+ Speculative (i.e., these may be bad ideas and they might not ever get done):
17
+ · HTML5 microdata serialization using Schema.org conventions. This should
18
+ work as easily as JSON serialization in a perfect world.
19
+ · Possibly add some higher-level patterns for Bootstrap/Foundation/etc.
20
+ Ideally, they end up presenting the same API, so changing a parent class
21
+ or a mixin is all that is needed to change frameworks.
22
+ · Integrate HTML validation into the tests, and make some validation tests.
23
+ · Expanding the DSL for views. There are not a lot of things I've missed in
24
+ the API so far, though, and the special-cased things are largely unused.
@@ -1,6 +1,6 @@
1
1
  require 'hoshi'
2
2
 
3
- str = Hoshi::View::HTML4.build {
3
+ str = Hoshi::View::HTML5.build {
4
4
  doctype
5
5
  html {
6
6
  head {
@@ -4,7 +4,7 @@ require 'hoshi/tag'
4
4
  require 'hoshi/view'
5
5
 
6
6
  # This is the namespace for all of Hoshi, which currently only includes
7
- # Hoshi::View and Hoshi::Tag . For an overview, see doc/README . For
7
+ # Hoshi::View and Hoshi::Tag . For an overview, see the README. For
8
8
  # specifics, check out Hoshi::View .
9
9
  module Hoshi
10
10
  # This is a cosmetic method; you may do Hoshi::View[:type],
@@ -1,14 +1,20 @@
1
- # TODO: When 1.9 goes away, monkey-patching should be changed to refinements.
1
+ # TODO: When 1.9 goes away, this monkey-patch should be changed to refinements, or
2
+ # just moved into a private instance method for Hoshi::Tag.
2
3
  # See: http://blog.headius.com/2012/11/refining-ruby.html
3
4
 
4
5
  class Hash
5
6
  # Makes this hash fit to be put into a tag.
6
- # {a: 1, b: "two", c: true}.to_html_options # => 'a="one" b="two" c'
7
+ # {a: 1, b: "two", c: true, d: false}.to_html_options # => 'a="one" b="two" c'
8
+ # Note that true and false are special-cased, true to allow for attributes that
9
+ # do not have a value and false for convenience, to allow for, e.g., inline
10
+ # conditionals.
7
11
  def to_html_options double_quotes = true
8
12
  qchar = double_quotes ? '"' : "'"
9
13
  map { |k,v|
10
14
  if v == true # Intentional.
11
15
  k.to_s
16
+ elsif v == false
17
+ ''
12
18
  else
13
19
  "#{k}=#{qchar}#{v.to_s.gsub(qchar, CGI.escapeHTML(qchar))}#{qchar}"
14
20
  end
@@ -1,13 +1,10 @@
1
- require 'metaid'
2
1
  require 'cgi'
3
2
 
4
- require 'hoshi/view-tag'
5
-
6
3
  module Hoshi
7
4
  # The View class is the super-class for views you create with Hoshi. More
8
5
  # likely, though, you'll be using one of View's many sub-classes as the
9
6
  # super-class for your view, like this:
10
- # class MyView < Hoshi::View :html4
7
+ # class MyView < Hoshi::View :html5
11
8
  # or
12
9
  # class MyView < Hoshi::View::XHTML1Frameset
13
10
  # Of course, using View[] is the preferred method for the sake of brevity.
@@ -17,6 +14,25 @@ module Hoshi
17
14
  class View
18
15
  class ValidationError < StandardError; end
19
16
 
17
+ # This creates an instance method for this view which appends a tag.
18
+ # Most of these are handled for you. The arguments to this method
19
+ # match those to Tag.new. See also View.permissive!.
20
+ # tag('h1')
21
+ # def show_an_h1
22
+ # h1 "I have been shown"
23
+ # end
24
+ def self.tag(name, close_type = nil)
25
+ define_method(name) { |*opts,&b|
26
+ if b
27
+ tag name, close_type, *opts, &b
28
+ else
29
+ tag name, close_type, *opts
30
+ end
31
+ }
32
+ # Inline tags.
33
+ define_method("_#{name}") { |*opts| _tag name, close_type, *opts }
34
+ end
35
+
20
36
  # A short-hand for creating multiple tags via View.tag. For tags that
21
37
  # do not require closing, see View.open_tags.
22
38
  def self.tags *names
@@ -0,0 +1,47 @@
1
+ class Hoshi::View
2
+ class SVG < self
3
+ # camelCase looks awful on method names, and we can't have
4
+ # hyphenated ones, so we start with a tag list from MDN:
5
+ # https://developer.mozilla.org/en-US/docs/Web/SVG/Element
6
+ tag_list = %w(
7
+ a altGlyph altGlyphDef altGlyphItem animate animateColor
8
+ animateMotion animateTransform circle clipPath color-profile
9
+ cursor defs desc ellipse feBlend feColorMatrix
10
+ feComponentTransfer feComposite feConvolveMatrix
11
+ feDiffuseLighting feDisplacementMap feDistantLight feFlood
12
+ feFuncA feFuncB feFuncG feFuncR feGaussianBlur feImage feMerge
13
+ feMergeNode feMorphology feOffset fePointLight
14
+ feSpecularLighting feSpotLight feTile feTurbulence filter font
15
+ font-face font-face-format font-face-name font-face-src
16
+ font-face-uri foreignObject g glyph glyphRef hkern image line
17
+ linearGradient marker mask metadata missing-glyph mpath path
18
+ pattern polygon polyline radialGradient rect script set stop
19
+ style svg switch symbol text textPath title tref tspan use view
20
+ vkern
21
+ )
22
+
23
+ self_closing_tags *tag_list.grep(/^[a-z]+$/i)
24
+ tag_list.grep(/[A-Z]/).each { |camel|
25
+ alias_method camel.
26
+ gsub(/([a-z])([A-Z])/) { "#{$1}_#{$2}" }.downcase.to_sym,
27
+ camel.to_sym
28
+ }
29
+ tag_list.grep(/-/).each { |hyphen|
30
+ define_method(hyphen.gsub('-', '_')) { |*opts,&b|
31
+ if b
32
+ tag hyphen, :self, *opts, &b
33
+ else
34
+ tag hyphen, :self, *opts
35
+ end
36
+ }
37
+ }
38
+
39
+ dtd! '<?xml version="1.0" encoding="UTF-8"?>\n' \
40
+ '<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" '\
41
+ '"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">'
42
+
43
+ def self.content_type
44
+ "image/svg+xml"
45
+ end
46
+ end
47
+ end
metadata CHANGED
@@ -1,29 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hoshi
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 1.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pete Elmore
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-06-12 00:00:00.000000000 Z
11
+ date: 2017-06-27 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: metaid
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: '0'
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - ">="
25
- - !ruby/object:Gem::Version
26
- version: '0'
27
13
  - !ruby/object:Gem::Dependency
28
14
  name: hpricot
29
15
  requirement: !ruby/object:Gem::Requirement
@@ -61,7 +47,6 @@ files:
61
47
  - lib/hoshi.rb
62
48
  - lib/hoshi/monkey_patches.rb
63
49
  - lib/hoshi/tag.rb
64
- - lib/hoshi/view-tag.rb
65
50
  - lib/hoshi/view.rb
66
51
  - lib/hoshi/view/html.rb
67
52
  - lib/hoshi/view/html3.rb
@@ -70,6 +55,7 @@ files:
70
55
  - lib/hoshi/view/html4_transitional.rb
71
56
  - lib/hoshi/view/html5.rb
72
57
  - lib/hoshi/view/rss2.rb
58
+ - lib/hoshi/view/svg.rb
73
59
  - lib/hoshi/view/xhtml.rb
74
60
  - lib/hoshi/view/xhtml1.rb
75
61
  - lib/hoshi/view/xhtml1_frameset.rb
@@ -95,8 +81,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
95
81
  - !ruby/object:Gem::Version
96
82
  version: '0'
97
83
  requirements: []
98
- rubyforge_project: hoshi-view
99
- rubygems_version: 2.2.2
84
+ rubyforge_project:
85
+ rubygems_version: 2.6.11
100
86
  signing_key:
101
87
  specification_version: 4
102
88
  summary: Nice, object-oriented, first-class views.
@@ -1,22 +0,0 @@
1
- module Hoshi
2
- class View
3
- # This creates an instance method for this view which appends a tag.
4
- # Most of these are handled for you. The arguments to this method
5
- # match those to Tag.new. See also View#permissive!.
6
- # tag('h1')
7
- # def show_an_h1
8
- # h1 "I have been shown"
9
- # end
10
- def self.tag(name, close_type = nil)
11
- define_method(name) { |*opts,&b|
12
- if b
13
- tag name, close_type, *opts, &b
14
- else
15
- tag name, close_type, *opts
16
- end
17
- }
18
- # Inline tags.
19
- define_method("_#{name}") { |*opts| _tag name, close_type, *opts }
20
- end
21
- end
22
- end