qipowl 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.document +11 -0
- data/.gitignore +17 -0
- data/.rspec +2 -0
- data/.travis.yml +3 -0
- data/.yardopts +3 -0
- data/Gemfile +17 -0
- data/LICENSE +20 -0
- data/README.md +345 -0
- data/Rakefile +21 -0
- data/bin/bowler +44 -0
- data/config/bowlers/cmd.yaml +3 -0
- data/config/bowlers/html.yaml +128 -0
- data/config/bowlers/html_supplemental.yaml +3 -0
- data/config/bowlers/markdown2html.yaml +23 -0
- data/extras/demo/main.rb +34 -0
- data/extras/demo/public/apple-touch-icon-114x114-precomposed.png +0 -0
- data/extras/demo/public/apple-touch-icon-144x144-precomposed.png +0 -0
- data/extras/demo/public/apple-touch-icon-57x57-precomposed.png +0 -0
- data/extras/demo/public/apple-touch-icon-72x72-precomposed.png +0 -0
- data/extras/demo/public/apple-touch-icon-precomposed.png +0 -0
- data/extras/demo/public/apple-touch-icon.png +0 -0
- data/extras/demo/public/css/bootstrap-theme.css +384 -0
- data/extras/demo/public/css/bootstrap-theme.min.css +1 -0
- data/extras/demo/public/css/bootstrap.css +6805 -0
- data/extras/demo/public/css/bootstrap.min.css +9 -0
- data/extras/demo/public/css/main.css +22 -0
- data/extras/demo/public/favicon.ico +0 -0
- data/extras/demo/public/fonts/glyphicons-halflings-regular.eot +0 -0
- data/extras/demo/public/fonts/glyphicons-halflings-regular.svg +228 -0
- data/extras/demo/public/fonts/glyphicons-halflings-regular.ttf +0 -0
- data/extras/demo/public/fonts/glyphicons-halflings-regular.woff +0 -0
- data/extras/demo/public/html.html +262 -0
- data/extras/demo/public/index.html +110 -0
- data/extras/demo/public/js/main.js +1 -0
- data/extras/demo/public/js/vendor/bootstrap.js +1999 -0
- data/extras/demo/public/js/vendor/bootstrap.min.js +6 -0
- data/extras/demo/public/js/vendor/jquery-1.10.1.min.js +6 -0
- data/extras/demo/public/js/vendor/modernizr-2.6.2-respond-1.1.0.min.js +11 -0
- data/extras/drafts/parsing.md +137 -0
- data/extras/support/typo +66 -0
- data/features/bowler.feature +8 -0
- data/features/html.feature +229 -0
- data/features/step_definitions/bowler_steps.rb +39 -0
- data/features/step_definitions/html_steps.rb +11 -0
- data/features/support/env.rb +7 -0
- data/images/owl-old.png +0 -0
- data/images/owl-old.xcf +0 -0
- data/images/owl.png +0 -0
- data/images/owl.xcf +0 -0
- data/lib/qipowl/bowlers/cmd.rb +26 -0
- data/lib/qipowl/bowlers/html.rb +409 -0
- data/lib/qipowl/bowlers/htmldoc.rb +268 -0
- data/lib/qipowl/bowlers/yaml.rb +63 -0
- data/lib/qipowl/core/bowler.rb +251 -0
- data/lib/qipowl/core/mapper.rb +92 -0
- data/lib/qipowl/core/monkeypatches.rb +168 -0
- data/lib/qipowl/core/ruler.rb +106 -0
- data/lib/qipowl/utils/hash_recursive_merge.rb +72 -0
- data/lib/qipowl/utils/logging.rb +14 -0
- data/lib/qipowl/version.rb +3 -0
- data/lib/qipowl.rb +50 -0
- data/qipowl.gemspec +42 -0
- data/qipowl.komodoproject +4 -0
- data/spec/bowler_spec.rb +11 -0
- data/spec/spec_helper.rb +15 -0
- data/spec/string_spec.rb +32 -0
- data/spec/yaml_test.yaml +10 -0
- metadata +254 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: 11832e5a92068dd4a814b706480c20aae99c3a30
|
4
|
+
data.tar.gz: 01dc0566c1f58d83664dff49c923dc68d5b58eeb
|
5
|
+
!binary "U0hBNTEy":
|
6
|
+
metadata.gz: f4ee26556053853856c043979387e2fedd29901d0b199902bbff5bbd9ce0b37bfe5f5c3e819d77643655c811d8b2df42c2318ae4f7b4f536aea7e8452c39cefd
|
7
|
+
data.tar.gz: eeac33cd357ad9c0c5ebf3785c4ecb4a98289ac5498c3291b1c19029ed3ab431d7a7befdd03741e1a32a12a3b594f291943c8cc76a75d61c97939e090864904a
|
data/.document
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
# .document is used by rdoc and yard to know how to generate documentation
|
2
|
+
# for example, it can be used to control how rdoc gets built when you do `gem install foo`
|
3
|
+
|
4
|
+
README.rdoc
|
5
|
+
lib/**/*.rb
|
6
|
+
bin/*
|
7
|
+
|
8
|
+
# Files below this - are treated as 'extra files', and aren't parsed for ruby code
|
9
|
+
-
|
10
|
+
features/**/*.feature
|
11
|
+
LICENSE
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.travis.yml
ADDED
data/.yardopts
ADDED
data/Gemfile
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
|
3
|
+
# Specify your gem's dependencies in typogrowl.gemspec
|
4
|
+
gemspec
|
5
|
+
|
6
|
+
gem 'htmlbeautifier', :git => 'https://github.com/threedaymonk/htmlbeautifier'
|
7
|
+
gem 'aquarium', '~> 0.6', :git => 'git://github.com/deanwampler/Aquarium.git'
|
8
|
+
gem "crochets", :git => 'git://github.com/mudasobwa/crochets.git'
|
9
|
+
|
10
|
+
#gem "diff-lcs", :git => 'git://github.com/halostatue/diff-lcs.git'
|
11
|
+
|
12
|
+
#gem "rspec-core", :git => 'git://github.com/rspec/rspec-core.git'
|
13
|
+
#gem "rspec-expectations", :path => '../rspec-expectations'
|
14
|
+
#gem "rspec-mocks", :git => 'git://github.com/rspec/rspec-mocks.git'
|
15
|
+
# gem "rspec", :git => 'git://github.com/rspec/rspec.git'
|
16
|
+
|
17
|
+
gem 'rake', :group => :test
|
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2013 Alexei Matyushkin
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,345 @@
|
|
1
|
+
![qipowl](/images/owl.png)
|
2
|
+
|
3
|
+
## Name
|
4
|
+
|
5
|
+
_qipowl_ (pronounced as **keep all**)
|
6
|
+
|
7
|
+
[![Build Status](https://travis-ci.org/mudasobwa/qipowl.png)](https://travis-ci.org/mudasobwa/qipowl)
|
8
|
+
[![Gemnasium](https://gemnasium.com/mudasobwa/qipowl.png?travis)](https://gemnasium.com/mudasobwa/qipowl)
|
9
|
+
[![Stories in Ready](https://badge.waffle.io/mudasobwa/qipowl.png?label=ready)](http://waffle.io/mudasobwa/qipowl)
|
10
|
+
|
11
|
+
**Status:** Minimum viable product
|
12
|
+
|
13
|
+
---
|
14
|
+
|
15
|
+
[Introduction into techniques](http://rocket-science.ru/qipowl/)
|
16
|
+
|
17
|
+
## Intro
|
18
|
+
|
19
|
+
_qipowl_ is the next generation parser environment. It’s not the
|
20
|
+
library for parsing, rather it is the framework to build extensive
|
21
|
+
parsers for virtually every markup anyone may imagine.
|
22
|
+
|
23
|
+
The main idea of _qipowl_ is to yield the power of
|
24
|
+
[DSL in Ruby](http://jroller.com/rolsen/entry/building_a_dsl_in_ruby).
|
25
|
+
The whole input text is treated neither more nor less than `DSL`.
|
26
|
+
That gives the user an ability to make virtually every term in input text
|
27
|
+
the _operating entity_.
|
28
|
+
|
29
|
+
## Examples
|
30
|
+
|
31
|
+
This chapter should be the last one, but who wants to read technical details
|
32
|
+
without any clue of how they might be applied? So, here we go.
|
33
|
+
|
34
|
+
### Shipping with: Markright
|
35
|
+
|
36
|
+
Right is looking right past up and down, right? _qipowl_ comes with built-in
|
37
|
+
markright parser, which is superset of markdown.
|
38
|
+
|
39
|
+
_qipowl_ markright utilizes UTF-8 heavily. The standard markup (here and further:
|
40
|
+
_qipowl markup_, or _qp_) lays on unicode characters instead of
|
41
|
+
legacy asterisks and underscores in markdown. It brings the better
|
42
|
+
readability to plain text before it’s processed with _qipowl_ and
|
43
|
+
allows more readable `DSL` for processing. For instance, the input:
|
44
|
+
|
45
|
+
§3 Emphasized text
|
46
|
+
|
47
|
+
There are four standard modifiers for emphasizing text:
|
48
|
+
▶ “≡” — bold
|
49
|
+
▶ “≈” — italic
|
50
|
+
▶ “↓” — small
|
51
|
+
▶ “λ” — code
|
52
|
+
|
53
|
+
The formers are to surround the target text piece.
|
54
|
+
This text contains:
|
55
|
+
• ≡bold≡,
|
56
|
+
• ≈italics≈,
|
57
|
+
• ↓small↓
|
58
|
+
• and even some λcodeλ.
|
59
|
+
|
60
|
+
will be processed as:
|
61
|
+
|
62
|
+
```html
|
63
|
+
<h3>Emphasized text</h3>
|
64
|
+
<p class='dropcap'>There are four standard modifiers for emphasizing text:</p>
|
65
|
+
<dl><dt>“≡”</dt><dd>bold</dd>
|
66
|
+
<dt>“≈”</dt><dd>italic</dd>
|
67
|
+
<dt>“↓”</dt><dd>small</dd>
|
68
|
+
<dt>“λ”</dt><dd>code</dd></dl>
|
69
|
+
<p class='dropcap'>The formers are to surround the target text piece.
|
70
|
+
This text contains:</p>
|
71
|
+
<ul><li><strong>bold</strong>,</li>
|
72
|
+
<li><em>italics</em>,</li>
|
73
|
+
<li><small>small</small></li>
|
74
|
+
<li>and even some <code>code</code>.</li></ul>
|
75
|
+
```
|
76
|
+
|
77
|
+
The valuable subset of HTML5 is implemented directly, plus the user may
|
78
|
+
eventually extend the list of understandable tags.
|
79
|
+
|
80
|
+
The markup-specific symbols, like “▶” and “•” in the previous example
|
81
|
+
may be mapped to keyboard (see `typo` file within `data` directory of the
|
82
|
+
project.
|
83
|
+
|
84
|
+
## Internals
|
85
|
+
|
86
|
+
_qipowl_ markup implementation consists of two parts: markup definition
|
87
|
+
(kinda `yaml` file) and markup processor. The latter derives from base
|
88
|
+
processor implementation `Qipowl::Bowler`.
|
89
|
+
|
90
|
+
### Markup definition
|
91
|
+
|
92
|
+
_qipowl_ understands six types of ‘operators’:
|
93
|
+
|
94
|
+
* flush
|
95
|
+
* block
|
96
|
+
* magnet
|
97
|
+
* inplace
|
98
|
+
* linewide
|
99
|
+
* handshake
|
100
|
+
* kiss
|
101
|
+
* custom
|
102
|
+
|
103
|
+
#### :flush
|
104
|
+
|
105
|
+
The operators in this group are executed immediately and do not break
|
106
|
+
the control flow. Technically, they are simply being substituted with
|
107
|
+
their representation.
|
108
|
+
|
109
|
+
:flush
|
110
|
+
:⏎ : :br
|
111
|
+
|
112
|
+
means that “⏎” anywhere in text will be substituted with “<br>”
|
113
|
+
|
114
|
+
#### :block
|
115
|
+
|
116
|
+
This group contains operators, which are driving the blocks. Such a block
|
117
|
+
should start with the operator and ends with it. Operator may receive an
|
118
|
+
additional parameter, located on the same string as the opening operator.
|
119
|
+
|
120
|
+
:block
|
121
|
+
:Λ : :pre
|
122
|
+
|
123
|
+
means that the following block:
|
124
|
+
|
125
|
+
Λ ruby
|
126
|
+
@mapping[:block].each { |tag, htmltag|
|
127
|
+
break if tag < :inplace
|
128
|
+
}
|
129
|
+
Λ
|
130
|
+
|
131
|
+
is to be left intouch (except of html is escaped inside)
|
132
|
+
and surrounded with `pre` tags:
|
133
|
+
|
134
|
+
<pre class='ruby'>
|
135
|
+
@mapping[:block].each { |tag, htmltag|
|
136
|
+
break if tag < :inplace
|
137
|
+
}
|
138
|
+
</pre>
|
139
|
+
|
140
|
+
This operator is the only one which preserves the line breaks.
|
141
|
+
|
142
|
+
#### :magnet
|
143
|
+
|
144
|
+
Almost the same as `:inplace` but does not require closing match.
|
145
|
+
Operates on the following text piece until the space. E.g.
|
146
|
+
|
147
|
+
:magnet
|
148
|
+
:☎ : :span†phone
|
149
|
+
|
150
|
+
will produce
|
151
|
+
|
152
|
+
<span class='phone'>☎ +1(987)5554321</span>
|
153
|
+
|
154
|
+
for the markup:
|
155
|
+
|
156
|
+
☎ +1(987)5554321
|
157
|
+
|
158
|
+
#### :inplace
|
159
|
+
|
160
|
+
Acts mostly like `:block` but inside one text block (text blocks are
|
161
|
+
likely paragraphs, delimited with double carriage returns.) Requires
|
162
|
+
closing element. Inplace operators are of highest priority and may
|
163
|
+
overlap.
|
164
|
+
|
165
|
+
:inplace
|
166
|
+
:≡ : :strong
|
167
|
+
|
168
|
+
will convert
|
169
|
+
|
170
|
+
That is ≡bold≡ text.
|
171
|
+
|
172
|
+
into
|
173
|
+
|
174
|
+
That is <strong>bold</strong> text.
|
175
|
+
|
176
|
+
#### :linewide
|
177
|
+
|
178
|
+
Those are not require closings, since they are operated on the _rest_ of
|
179
|
+
the text. Support nesting by prepending tags with _non-breakable space_:
|
180
|
+
|
181
|
+
:linewide
|
182
|
+
:• : li
|
183
|
+
|
184
|
+
The following syntax
|
185
|
+
|
186
|
+
• Line item 1
|
187
|
+
• Nested li 1
|
188
|
+
• Nested li 2
|
189
|
+
• Line item 2
|
190
|
+
|
191
|
+
will produce:
|
192
|
+
|
193
|
+
<ul><li>Line item 1</li>
|
194
|
+
<ul><li>Nested li 1</li>
|
195
|
+
<li>Nested li 2</li></ul>
|
196
|
+
<li>Line item 2</li></ul>
|
197
|
+
|
198
|
+
#### :handshake
|
199
|
+
|
200
|
+
**TODO** rewrite examples for latex
|
201
|
+
|
202
|
+
The group contains operators, acting on left and right operands between
|
203
|
+
the delimiters given. By default it takes the whole line from `^` till `$`.
|
204
|
+
|
205
|
+
:handshake :
|
206
|
+
:∈ : :mathml
|
207
|
+
:⊂ :
|
208
|
+
:tag : :mathml
|
209
|
+
:from : '\s'
|
210
|
+
:till : '.'
|
211
|
+
|
212
|
+
The following syntax
|
213
|
+
|
214
|
+
Let we have A ⊂ ∅. Then the following formula is OK:
|
215
|
+
∀ a ∈ ∅
|
216
|
+
which is evident, though.
|
217
|
+
|
218
|
+
will produce:
|
219
|
+
|
220
|
+
Let we have <mathml>A ⊂ ∅</mathml>. Then the following formula is OK:
|
221
|
+
<mathml>∀ a ∈ ∅</mathml>
|
222
|
+
which is evident, though.
|
223
|
+
|
224
|
+
#### :kiss
|
225
|
+
|
226
|
+
Almost the same as `:handshake` but operates on the preceeding/following pair of
|
227
|
+
text piece without spaces. E.g.
|
228
|
+
|
229
|
+
:kiss
|
230
|
+
:÷ : :mathml
|
231
|
+
|
232
|
+
The following syntax
|
233
|
+
|
234
|
+
The formula 12 ÷ 5 is simple.
|
235
|
+
|
236
|
+
will produce:
|
237
|
+
|
238
|
+
The formula <mathml>12 ÷ 5</mathml> is simple.
|
239
|
+
|
240
|
+
#### :custom
|
241
|
+
|
242
|
+
Custom is not yet fully powerful mechanism to make substitutions inplace
|
243
|
+
for generic words. Please use on your own risk.
|
244
|
+
|
245
|
+
### Extending
|
246
|
+
|
247
|
+
Extending _qipowl_ is as easy as writing a couple of strings in YAML format.
|
248
|
+
Let’s take a look at additional rules file for markdown support:
|
249
|
+
|
250
|
+
```yaml
|
251
|
+
:synsugar :
|
252
|
+
# Code blocks, 4+ spaces indent
|
253
|
+
'(?x-mi:(\R)((?:(?:\R)+(?:\s{4,}|\t).*)+\R)(?=\R))' : "\\1\nΛ auto\\2Λ\n"
|
254
|
+
# Pictures
|
255
|
+
'!\[(.*?)\]\((.*?)\)' : '⚓\2 \1⚓'
|
256
|
+
# Links
|
257
|
+
'\[(.*?)\]\((.*?)\)' : '⚓\2 \1⚓'
|
258
|
+
# Blockquotes
|
259
|
+
'^\s*>' : '〉'
|
260
|
+
'^\s*>\s*>' : '〉 〉'
|
261
|
+
'^\s*\*\s*\*' : '〉 •'
|
262
|
+
'^\s+\*' : '• •'
|
263
|
+
|
264
|
+
|
265
|
+
:inplace :
|
266
|
+
:'__' : :strong
|
267
|
+
:'**' : :strong
|
268
|
+
:'_' : :em
|
269
|
+
:'*' : :em
|
270
|
+
:'`' : :code
|
271
|
+
```
|
272
|
+
|
273
|
+
Bold, italic, code, images, links, blockquotes (including nesteds) are now
|
274
|
+
supported by _qipowl_. Let any one of you who is not delighted with,
|
275
|
+
be the first to throw a stone at me.
|
276
|
+
|
277
|
+
Need custom support for `github`-flavored markdown _strikethrough_? Oneliner
|
278
|
+
inside an `:inplace` section of custom rules came on scene:
|
279
|
+
|
280
|
+
```yaml
|
281
|
+
:'~~' :strike
|
282
|
+
```
|
283
|
+
|
284
|
+
#### Sophisticated extending
|
285
|
+
|
286
|
+
Whether one needs more sophisticated rules, she is to write her own
|
287
|
+
descendant of `Bowler` class, implementing DSL herself. E.g. `Html`
|
288
|
+
markup uses the following DSL for handling video links to YouTube:
|
289
|
+
|
290
|
+
```ruby
|
291
|
+
# Handler for Youtube video
|
292
|
+
# @param [Array] args the words, gained since last call to {#harvest}
|
293
|
+
# @return [Nil] nil
|
294
|
+
def ✇ *args
|
295
|
+
id, *rest = args.flatten
|
296
|
+
harvest nil, orphan(rest.join(SEPARATOR)) unless rest.vacant?
|
297
|
+
harvest __callee__, "<iframe width='560' height='315'
|
298
|
+
src='http://www.youtube.com/embed/#{id}'
|
299
|
+
frameborder='0' allowfullscreen></iframe>"
|
300
|
+
end
|
301
|
+
```
|
302
|
+
|
303
|
+
Here we harvest the previously gained words (`rest`) and transform copy-pasted
|
304
|
+
link to video into embedded frame with video content as by YouTube.
|
305
|
+
|
306
|
+
## Installation
|
307
|
+
|
308
|
+
Add this line to your application's Gemfile:
|
309
|
+
|
310
|
+
gem 'typogrowl'
|
311
|
+
|
312
|
+
And then execute:
|
313
|
+
|
314
|
+
$ bundle
|
315
|
+
|
316
|
+
Or install it yourself as:
|
317
|
+
|
318
|
+
$ gem install typogrowl
|
319
|
+
|
320
|
+
## Usage
|
321
|
+
|
322
|
+
```ruby
|
323
|
+
require 'typogrowl'
|
324
|
+
…
|
325
|
+
tg = Qipowl::Html.new
|
326
|
+
puts tg.parse_and_roll(text)
|
327
|
+
```
|
328
|
+
|
329
|
+
or even simplier
|
330
|
+
|
331
|
+
```ruby
|
332
|
+
require 'typogrowl'
|
333
|
+
…
|
334
|
+
tg = Qipowl.tg_md__html # typogrowl markup _and_ markdown
|
335
|
+
|
336
|
+
puts tg.parse_and_roll(text)
|
337
|
+
```
|
338
|
+
|
339
|
+
## Contributing
|
340
|
+
|
341
|
+
1. Fork it
|
342
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
343
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
344
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
345
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'bundler/setup'
|
2
|
+
|
3
|
+
require 'rspec/core/rake_task'
|
4
|
+
|
5
|
+
desc 'Tests'
|
6
|
+
RSpec::Core::RakeTask.new(:spec) do |spec|
|
7
|
+
spec.rspec_opts = '-Ispec'
|
8
|
+
# spec.rcov = true
|
9
|
+
end
|
10
|
+
|
11
|
+
require 'cucumber/rake/task'
|
12
|
+
desc 'Cucumber'
|
13
|
+
Cucumber::Rake::Task.new(:features)
|
14
|
+
|
15
|
+
task :default => [:features, :spec]
|
16
|
+
|
17
|
+
require 'yard'
|
18
|
+
desc 'YARD'
|
19
|
+
YARD::Rake::YardocTask.new(:yard) do |t|
|
20
|
+
t.files = ['**/*.rb', 'features/**/*.feature', 'features/**/*.rb']
|
21
|
+
end
|
data/bin/bowler
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
lib = File.expand_path(File.dirname(__FILE__) + '/../lib')
|
4
|
+
$LOAD_PATH.unshift(lib) if File.directory?(lib) && !$LOAD_PATH.include?(lib)
|
5
|
+
|
6
|
+
require 'optparse'
|
7
|
+
require_relative '../lib/qipowl'
|
8
|
+
|
9
|
+
options = {}
|
10
|
+
OptionParser.new do |opts|
|
11
|
+
opts.banner = "Usage: #{$0} FILE|STRING"
|
12
|
+
|
13
|
+
# Bowl result?
|
14
|
+
opts.on("-a", "--action ACTION", [:bowl, :ruby, :cmd, :yaml, :html],
|
15
|
+
"Action to apply on input (bowl, ruby, cmd, yaml, html); default: html") do |action|
|
16
|
+
options[:action] = action || :bowl
|
17
|
+
end
|
18
|
+
|
19
|
+
# No argument, shows at tail. This will print an options summary.
|
20
|
+
opts.on_tail("-h", "--help", "Show this message") do
|
21
|
+
puts opts
|
22
|
+
exit
|
23
|
+
end
|
24
|
+
end.parse!
|
25
|
+
|
26
|
+
raise "Run `#{$0} --help` for execution examples. Exiting…" if ARGV.size.zero?
|
27
|
+
|
28
|
+
file_or_string = ARGV.first
|
29
|
+
file_or_string = File.read(file_or_string) if File.exist?(file_or_string)
|
30
|
+
|
31
|
+
case options[:action]
|
32
|
+
when :bowl
|
33
|
+
puts file_or_string.bowl
|
34
|
+
when :ruby
|
35
|
+
puts Qipowl::Mapping.new(nil, file_or_string).to_ruby
|
36
|
+
when :html
|
37
|
+
puts Qipowl::Html.parse file_or_string
|
38
|
+
when :cmd
|
39
|
+
puts Qipowl::Cmd.execute file_or_string
|
40
|
+
when :yaml
|
41
|
+
puts Qipowl::Yaml.parse file_or_string
|
42
|
+
else
|
43
|
+
puts Qipowl::Html.parse file_or_string
|
44
|
+
end
|
@@ -0,0 +1,128 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
# bowler’s entity values: - type, - synonyms, - parent
|
4
|
+
# possible types: - block, - alone, - grip, - magnet, - regular, - custom
|
5
|
+
|
6
|
+
# html specifics: - tag, - class
|
7
|
+
|
8
|
+
:includes :
|
9
|
+
- 'html_supplemental'
|
10
|
+
- 'markdown2html'
|
11
|
+
|
12
|
+
:entities :
|
13
|
+
:block :
|
14
|
+
:✍ :
|
15
|
+
:synonyms :
|
16
|
+
- :'---'
|
17
|
+
:Λ :
|
18
|
+
:tag : :pre
|
19
|
+
:class : :code
|
20
|
+
:alone :
|
21
|
+
:⏎ : :br
|
22
|
+
:—— : :hr
|
23
|
+
:magnet :
|
24
|
+
:☎ :
|
25
|
+
:tag : :span
|
26
|
+
:class : :phone
|
27
|
+
:✉ :
|
28
|
+
:tag : :span
|
29
|
+
:class : :email
|
30
|
+
:synonyms :
|
31
|
+
- :mail
|
32
|
+
:✎ : :lj
|
33
|
+
:☇ : :a
|
34
|
+
:grip :
|
35
|
+
:≡ : :strong
|
36
|
+
:≈ : :em
|
37
|
+
:↑ : :sup
|
38
|
+
:↓ : :small
|
39
|
+
:λ : :code
|
40
|
+
:⚓ : :a
|
41
|
+
:† : :abbr
|
42
|
+
:✁ : :del
|
43
|
+
:✿_span_nobr : :nobr
|
44
|
+
:regular :
|
45
|
+
:• :
|
46
|
+
:tag : :li
|
47
|
+
:parent :
|
48
|
+
:tag : :ul
|
49
|
+
:class : :fancy
|
50
|
+
:◦ :
|
51
|
+
:tag : :li
|
52
|
+
:parent : :ol
|
53
|
+
:class : :active
|
54
|
+
:▶ :
|
55
|
+
:tag : :dt
|
56
|
+
:parent : :dl
|
57
|
+
:▷ :
|
58
|
+
:tag : :dt
|
59
|
+
:parent :
|
60
|
+
:tag : :dl
|
61
|
+
:class : :dl_horizontal
|
62
|
+
:℁ : :address
|
63
|
+
:〉 :
|
64
|
+
:tag : :p
|
65
|
+
:parent : :blockquote
|
66
|
+
:class : :blockquote
|
67
|
+
:§1 : :h1
|
68
|
+
:§2 : :h2
|
69
|
+
:§3 : :h3
|
70
|
+
:§4 : :h4
|
71
|
+
:§5 : :h5
|
72
|
+
:§6 : :h6
|
73
|
+
:¶ :
|
74
|
+
:tag : :p
|
75
|
+
:class : :lead
|
76
|
+
:☆ :
|
77
|
+
:tag : :p
|
78
|
+
:class : :text_muted
|
79
|
+
:★ : :em
|
80
|
+
:☛ :
|
81
|
+
:tag : :p
|
82
|
+
:class : :text_success
|
83
|
+
:☞ :
|
84
|
+
:tag : :p
|
85
|
+
:class : :text_info
|
86
|
+
:☣ :
|
87
|
+
:tag : :p
|
88
|
+
:class : :text_warning
|
89
|
+
:☢ :
|
90
|
+
:tag : :p
|
91
|
+
:class : :text_danger
|
92
|
+
:✇ : :video
|
93
|
+
:⚘ : :figure
|
94
|
+
:✿_p_address :
|
95
|
+
:tag : :p
|
96
|
+
:class : :address
|
97
|
+
:✿_p_epigraph :
|
98
|
+
:tag : :p
|
99
|
+
:class : :epigraph
|
100
|
+
:✿_p_afterepigraph :
|
101
|
+
:tag : :p
|
102
|
+
:class : :afterepigraph
|
103
|
+
:✿_p_auto :
|
104
|
+
:tag : :p
|
105
|
+
:class : :dropcap
|
106
|
+
|
107
|
+
:custom :
|
108
|
+
'^\s*‒\p{Blank}+(.+),\s*(\S+)' : ' ⏎ ↓ ⚓\2 \1⚓'
|
109
|
+
'(\S+)¹(\S+?)(?=\s|\)|\.\s|\.\Z|\,\s|;\s|␍|\Z)' : '⚓\2 \1⚓'
|
110
|
+
'(\S+)†(.+?)†' : '†\1 \2†'
|
111
|
+
# http://youtu.be/SAJ_TzLqy1U?t=6s
|
112
|
+
'http://youtu\.be/([A-Za-z0-9_]+)(?:\?t=(\d+)s)?' : '✇ \1'
|
113
|
+
# http://www.youtube.com/watch?v=SAJ_TzLqy1U
|
114
|
+
'http://www\.youtube\.com/(?:watch\?v=|v/)([A-Za-z0-9_]+)' : '✇ \1'
|
115
|
+
# Standalone images and quotes
|
116
|
+
'^(https?://\S+)(\s*.*)$' : '⚘ \1 \2'
|
117
|
+
|
118
|
+
:enclosures :
|
119
|
+
:• :
|
120
|
+
:tag : :ul
|
121
|
+
:class : :fancy
|
122
|
+
:◦ : :ol
|
123
|
+
:▶ : :dl
|
124
|
+
:▷ :
|
125
|
+
:tag : :dl
|
126
|
+
:class : :dl_horizontal
|
127
|
+
:〉 : :blockquote
|
128
|
+
|
@@ -0,0 +1,23 @@
|
|
1
|
+
:custom :
|
2
|
+
'(?x-mi:(\R)((?:(?:\R)+(?:\s{4,}|\t).*)+\R)(?=\R))' : "\\1\nΛ auto\\2Λ\n"
|
3
|
+
'^!\[(.*?)\]\((.*?)\)$' : '⚘ \2 \1'
|
4
|
+
'!\[(.*?)\]\((.*?)\)' : '⚓\2 \1⚓'
|
5
|
+
'\[(.*?)\]\((.*?)\)' : '⚓\2 \1⚓'
|
6
|
+
'^\s*>' : '〉'
|
7
|
+
'^\s*>\s*>' : ' 〉'
|
8
|
+
'^\s+\*' : ' •'
|
9
|
+
' {2,}(?=$)' : " ⏎"
|
10
|
+
|
11
|
+
|
12
|
+
:entities :
|
13
|
+
:grip :
|
14
|
+
:'**' :
|
15
|
+
:tag : :strong
|
16
|
+
:marker : :≡
|
17
|
+
:synonyms :
|
18
|
+
- :'__'
|
19
|
+
:'*' :
|
20
|
+
:tag : :em
|
21
|
+
:marker : :≈
|
22
|
+
:'`' : :code
|
23
|
+
:'~~' : :del
|
data/extras/demo/main.rb
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'cgi'
|
4
|
+
require 'json'
|
5
|
+
require 'sinatra'
|
6
|
+
|
7
|
+
require_relative '../qipowl'
|
8
|
+
|
9
|
+
use Rack::Session::Pool, :expire_after => 2592000
|
10
|
+
|
11
|
+
before do
|
12
|
+
session[:typo] ||= Qipowl.tg_md__html
|
13
|
+
end
|
14
|
+
|
15
|
+
get '/html/mapping' do
|
16
|
+
content_type :json
|
17
|
+
session[:typo].mapping.hash.to_json
|
18
|
+
end
|
19
|
+
|
20
|
+
delete '/html/mapping/:key' do |key|
|
21
|
+
content_type :json
|
22
|
+
session[:typo].mapping.remove_spice(key.to_sym).to_json
|
23
|
+
end
|
24
|
+
|
25
|
+
put '/html/mapping/:section/:key/:value/?:enclosure?' do |section, key, value, enclosure|
|
26
|
+
content_type :json
|
27
|
+
session[:typo].mapping.add_spice(section.to_sym, key.to_sym, value.to_sym, enclosure ? enclosure.to_sym : nil).to_json
|
28
|
+
end
|
29
|
+
|
30
|
+
get '/html/parse' do
|
31
|
+
str = CGI::parse(request.query_string)['text'].first
|
32
|
+
content_type :html
|
33
|
+
session[:typo].parse_and_roll str
|
34
|
+
end
|