hypertext 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/CHANGELOG +0 -0
- data/CONTRIBUTING +19 -0
- data/LICENSE +19 -0
- data/README.md +49 -0
- data/hypertext.gemspec +14 -0
- data/lib/hypertext.rb +95 -0
- data/makefile +4 -0
- data/test/all.rb +75 -0
- data/test/helper.rb +1 -0
- metadata +66 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 4ed751f7bacf414010a50e266e61ad2124e9694b2f58e063c86c07aafdf6a7d0
|
4
|
+
data.tar.gz: f49d0b5f3ebed4ca55ca4ccb1d92eb01491f52069698ab8636da2cb6acae61a0
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 8f2fe8239fe6cf432af39a8b2382abe3097b1e9f0b092374cfadc588f5f595a1f690d42ae152c1a389e813d27d2481daa9c2f205ed4f3c10a0624a015d9d969e
|
7
|
+
data.tar.gz: f6da75a9e0c066a835e35abd2583b063b85c0d39d04aa0fe35036a7648625b93e22b0bb296beecd58fef3264f593975da6666ab1d9dfa7352bbb3cd800fad308
|
data/CHANGELOG
ADDED
File without changes
|
data/CONTRIBUTING
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
This code tries to solve a particular problem with a very simple
|
2
|
+
implementation. We try to keep the code to a minimum while making
|
3
|
+
it as clear as possible. The design is very likely finished, and
|
4
|
+
if some feature is missing it is possible that it was left out on
|
5
|
+
purpose. That said, new usage patterns may arise, and when that
|
6
|
+
happens we are ready to adapt if necessary.
|
7
|
+
|
8
|
+
A good first step for contributing is to meet us on IRC and discuss
|
9
|
+
ideas. We spend a lot of time on #lesscode at freenode, always ready
|
10
|
+
to talk about code and simplicity. If connecting to IRC is not an
|
11
|
+
option, you can create an issue explaining the proposed change and
|
12
|
+
a use case. We pay a lot of attention to use cases, because our
|
13
|
+
goal is to keep the code base simple. Usually the result of a
|
14
|
+
conversation is the creation of a different tool.
|
15
|
+
|
16
|
+
Please don't start the conversation with a pull request. The code
|
17
|
+
should come at last, and even though it may help to convey an idea,
|
18
|
+
more often than not it draws the attention to a particular
|
19
|
+
implementation.
|
data/LICENSE
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
Copyright (c) 2021 Michel Martens
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
|
+
of this software and associated documentation files (the "Software"), to deal
|
5
|
+
in the Software without restriction, including without limitation the rights
|
6
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
7
|
+
copies of the Software, and to permit persons to whom the Software is
|
8
|
+
furnished to do so, subject to the following conditions:
|
9
|
+
|
10
|
+
The above copyright notice and this permission notice shall be included in
|
11
|
+
all copies or substantial portions of the Software.
|
12
|
+
|
13
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
16
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
17
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
18
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
19
|
+
THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
Hypertext
|
2
|
+
=========
|
3
|
+
|
4
|
+
Hypertext authoring
|
5
|
+
|
6
|
+
Description
|
7
|
+
-----------
|
8
|
+
|
9
|
+
Hypertext allows you to write HTML from Ruby.
|
10
|
+
|
11
|
+
Usage
|
12
|
+
-----
|
13
|
+
|
14
|
+
A basic example would look like this:
|
15
|
+
|
16
|
+
```ruby
|
17
|
+
html = Hypertext.new do |h|
|
18
|
+
h.tag :div, class: "greeting" do |h|
|
19
|
+
h.tag :h1 do |h|
|
20
|
+
h.text "hello world"
|
21
|
+
end
|
22
|
+
|
23
|
+
h.tag :hr
|
24
|
+
|
25
|
+
h.tag :p do |h|
|
26
|
+
h.text "nice to meet you"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
puts html.to_s
|
32
|
+
|
33
|
+
# <div class="greeting">
|
34
|
+
# <h1>
|
35
|
+
# hello world
|
36
|
+
# </h1>
|
37
|
+
# <hr />
|
38
|
+
# <p>
|
39
|
+
# nice to meet you
|
40
|
+
# </p>
|
41
|
+
# </div>
|
42
|
+
```
|
43
|
+
|
44
|
+
Installation
|
45
|
+
------------
|
46
|
+
|
47
|
+
```
|
48
|
+
$ gem install hypertext
|
49
|
+
```
|
data/hypertext.gemspec
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = "hypertext"
|
3
|
+
s.version = "0.0.1"
|
4
|
+
s.summary = "Hypertext authoring"
|
5
|
+
s.description = "Hypertext authoring with Ruby"
|
6
|
+
s.authors = ["Michel Martens"]
|
7
|
+
s.email = ["michel@soveran.com"]
|
8
|
+
s.homepage = "https://github.com/soveran/hypertext"
|
9
|
+
s.license = "MIT"
|
10
|
+
|
11
|
+
s.files = `git ls-files`.split("\n")
|
12
|
+
|
13
|
+
s.add_development_dependency "cutest"
|
14
|
+
end
|
data/lib/hypertext.rb
ADDED
@@ -0,0 +1,95 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
#
|
3
|
+
# Copyright (c) 2021 Michel Martens
|
4
|
+
#
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
# of this software and associated documentation files (the "Software"), to deal
|
7
|
+
# in the Software without restriction, including without limitation the rights
|
8
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
# copies of the Software, and to permit persons to whom the Software is
|
10
|
+
# furnished to do so, subject to the following conditions:
|
11
|
+
#
|
12
|
+
# The above copyright notice and this permission notice shall be included in
|
13
|
+
# all copies or substantial portions of the Software.
|
14
|
+
#
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
# THE SOFTWARE.
|
22
|
+
|
23
|
+
class Hypertext
|
24
|
+
ENTITIES = {
|
25
|
+
"'" => ''',
|
26
|
+
'&' => '&',
|
27
|
+
'"' => '"',
|
28
|
+
'<' => '<',
|
29
|
+
'>' => '>',
|
30
|
+
}
|
31
|
+
|
32
|
+
def self.render(array, indent = " ", level = 0)
|
33
|
+
array.map do |element|
|
34
|
+
if Array === element
|
35
|
+
render(element, indent, level + 1)
|
36
|
+
else
|
37
|
+
sprintf "%s%s\n", indent * level, element
|
38
|
+
end
|
39
|
+
end.join
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.escape(str)
|
43
|
+
str.gsub(/['&\"<>]/, ENTITIES)
|
44
|
+
end
|
45
|
+
|
46
|
+
def initialize
|
47
|
+
@dom = []
|
48
|
+
|
49
|
+
if block_given?
|
50
|
+
yield self
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def tag(name, attributes = {}, &block)
|
55
|
+
atts = compile(attributes)
|
56
|
+
|
57
|
+
if block_given?
|
58
|
+
@dom.push "<#{name}#{atts}>"
|
59
|
+
@dom.push yield(self.class.new).to_a
|
60
|
+
@dom.push "</#{name}>"
|
61
|
+
else
|
62
|
+
@dom.push "<#{name}#{atts} />"
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def text(value)
|
67
|
+
@dom.push(escape(value))
|
68
|
+
end
|
69
|
+
|
70
|
+
def to_a
|
71
|
+
@dom
|
72
|
+
end
|
73
|
+
|
74
|
+
def to_s(indent = " ")
|
75
|
+
self.class.render(@dom, indent)
|
76
|
+
end
|
77
|
+
|
78
|
+
private
|
79
|
+
|
80
|
+
def escape(str)
|
81
|
+
self.class.escape(str)
|
82
|
+
end
|
83
|
+
|
84
|
+
def compile(attributes)
|
85
|
+
attributes.map do |key, val|
|
86
|
+
case val
|
87
|
+
when false
|
88
|
+
when true
|
89
|
+
%[ #{key}]
|
90
|
+
else
|
91
|
+
%[ #{key}="#{escape(val.to_s)}"]
|
92
|
+
end
|
93
|
+
end.join
|
94
|
+
end
|
95
|
+
end
|
data/makefile
ADDED
data/test/all.rb
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
scope "Hypertext" do
|
2
|
+
test "text" do
|
3
|
+
expected = "hello world\n"
|
4
|
+
|
5
|
+
observed = Hypertext.new
|
6
|
+
observed.text "hello world"
|
7
|
+
|
8
|
+
assert_equal expected, observed.to_s
|
9
|
+
end
|
10
|
+
|
11
|
+
test "self-closing tags" do
|
12
|
+
expected = "<br />\n"
|
13
|
+
|
14
|
+
observed = Hypertext.new
|
15
|
+
observed.tag :br
|
16
|
+
|
17
|
+
assert_equal expected, observed.to_s
|
18
|
+
end
|
19
|
+
|
20
|
+
test "opening and closing tags" do
|
21
|
+
expected = "<span>\n hello world\n</span>\n"
|
22
|
+
|
23
|
+
observed = Hypertext.new
|
24
|
+
observed.tag :span do |ht|
|
25
|
+
ht.text "hello world"
|
26
|
+
end
|
27
|
+
|
28
|
+
assert_equal expected, observed.to_s
|
29
|
+
end
|
30
|
+
|
31
|
+
test "nested tags" do
|
32
|
+
expected = "<div>\n <p>\n hello world\n </p>\n</div>\n"
|
33
|
+
|
34
|
+
observed = Hypertext.new
|
35
|
+
observed.tag :div do |ht|
|
36
|
+
ht.tag :p do |ht|
|
37
|
+
ht.text "hello world"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
assert_equal expected, observed.to_s
|
42
|
+
end
|
43
|
+
|
44
|
+
test "passing a block to Hypertext.new" do
|
45
|
+
expected = "<br />\n"
|
46
|
+
|
47
|
+
observed = Hypertext.new do |ht|
|
48
|
+
ht.tag :br
|
49
|
+
end
|
50
|
+
|
51
|
+
assert_equal expected, observed.to_s
|
52
|
+
end
|
53
|
+
|
54
|
+
test "tags with attributes" do
|
55
|
+
expected = "<input type=\"text\" name=\"person[name]\" value=\"Foo\" />\n"
|
56
|
+
|
57
|
+
observed = Hypertext.new do |ht|
|
58
|
+
ht.tag :input, :type => "text", :name => "person[name]", :value => "Foo"
|
59
|
+
end
|
60
|
+
|
61
|
+
assert_equal expected, observed.to_s
|
62
|
+
end
|
63
|
+
|
64
|
+
test "custom indentation" do
|
65
|
+
expected = "<p>\n....hello world\n</p>\n"
|
66
|
+
|
67
|
+
observed = Hypertext.new do |ht|
|
68
|
+
ht.tag :p do |ht|
|
69
|
+
ht.text "hello world"
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
assert_equal expected, observed.to_s("....")
|
74
|
+
end
|
75
|
+
end
|
data/test/helper.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require_relative "../lib/hypertext"
|
metadata
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: hypertext
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Michel Martens
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2021-03-06 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: cutest
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
description: Hypertext authoring with Ruby
|
28
|
+
email:
|
29
|
+
- michel@soveran.com
|
30
|
+
executables: []
|
31
|
+
extensions: []
|
32
|
+
extra_rdoc_files: []
|
33
|
+
files:
|
34
|
+
- CHANGELOG
|
35
|
+
- CONTRIBUTING
|
36
|
+
- LICENSE
|
37
|
+
- README.md
|
38
|
+
- hypertext.gemspec
|
39
|
+
- lib/hypertext.rb
|
40
|
+
- makefile
|
41
|
+
- test/all.rb
|
42
|
+
- test/helper.rb
|
43
|
+
homepage: https://github.com/soveran/hypertext
|
44
|
+
licenses:
|
45
|
+
- MIT
|
46
|
+
metadata: {}
|
47
|
+
post_install_message:
|
48
|
+
rdoc_options: []
|
49
|
+
require_paths:
|
50
|
+
- lib
|
51
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - ">="
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '0'
|
56
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - ">="
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '0'
|
61
|
+
requirements: []
|
62
|
+
rubygems_version: 3.0.3
|
63
|
+
signing_key:
|
64
|
+
specification_version: 4
|
65
|
+
summary: Hypertext authoring
|
66
|
+
test_files: []
|