qipowl 0.9.3 → 0.9.7
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 +4 -4
- data/Gemfile +1 -0
- data/README.md +157 -76
- data/bin/bowler +4 -2
- data/config/bowlers/html.yaml +24 -9
- data/extras/drafts/parsing.md +53 -42
- data/features/bowler.feature +14 -0
- data/features/html.feature +76 -27
- data/features/step_definitions/bowler_steps.rb +20 -0
- data/lib/qipowl.rb +29 -19
- data/lib/qipowl/bowlers/html.rb +148 -96
- data/lib/qipowl/bowlers/i_sp_ru.rb +9 -9
- data/lib/qipowl/constants.rb +2 -1
- data/lib/qipowl/core/bowler.rb +31 -22
- data/lib/qipowl/core/mapper.rb +20 -22
- data/lib/qipowl/core/monkeypatches.rb +18 -25
- data/lib/qipowl/core/ruler.rb +48 -43
- data/lib/qipowl/version.rb +1 -1
- data/qipowl.gemspec +0 -2
- data/spec/html_additional_test.yaml +3 -0
- metadata +2 -35
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7f1c631668f2211baa4e0104c6d9c7d474679f8e
|
4
|
+
data.tar.gz: 4acc209241f865925f2ad27657943b910b611bb0
|
5
5
|
!binary "U0hBNTEy":
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 065e805c8794134debf98cb13f7362184902b05616eb2c6a17af4e7df2d77ec4fa153666a8191418fcf54e622549f819668d191a0be6489d2443f506224a317d
|
7
|
+
data.tar.gz: 9f821d61819a6c2b7d95004dc48d0a1240ec107be804f46a582aa0275ed386676bd0585ec34d249d8dad15e6b04482984470114f8a57204be4bbfb3ff8544e13
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -16,17 +16,158 @@ _qipowl_ (pronounced as **keep all**)
|
|
16
16
|
|
17
17
|
## Intro
|
18
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
19
|
The main idea of _qipowl_ is to yield the power of
|
24
20
|
[DSL in Ruby](http://jroller.com/rolsen/entry/building_a_dsl_in_ruby).
|
25
21
|
The whole input text is treated neither more nor less than `DSL`.
|
26
22
|
That gives the user an ability to make virtually every term in input text
|
27
23
|
the _operating entity_.
|
28
24
|
|
29
|
-
##
|
25
|
+
## Principles
|
26
|
+
|
27
|
+
**Qipowl** is a Ruby parsing library. The parsing is done via
|
28
|
+
DSL exactly as [Ouroboros](http://en.wikipedia.org/wiki/Ouroboros)
|
29
|
+
eats it’s own tail.
|
30
|
+
|
31
|
+
The whole input is treated as Ruby source code and executed respectively.
|
32
|
+
To prevent collisions of input with built-in ruby methods, the ASCII symbols
|
33
|
+
in the input are being translated into their
|
34
|
+
[fullwidth equivalents](http://en.wikipedia.org/wiki/Halfwidth_and_fullwidth_forms#Chart)
|
35
|
+
before execution (and back to ASCII after the parsing is done.)
|
36
|
+
|
37
|
+
Let’s say we have a string “Hello world” as input. It became ‘encoded’ into:
|
38
|
+
“Hello world”, executed as Ruby code (exactly as e. g. `puts rand`
|
39
|
+
would) and finally ‘decoded’ back to ASCII. Whether the parser knows anything
|
40
|
+
about ‘Hello’ or ‘world’ it would be executed. Say, we have
|
41
|
+
|
42
|
+
def world *args
|
43
|
+
"brave new #{__callee__}"
|
44
|
+
end
|
45
|
+
|
46
|
+
thus the output will be:
|
47
|
+
|
48
|
+
# ⇒ Hello brave new world
|
49
|
+
|
50
|
+
More about may be found at [project page](http://rocket-science.ru/qipowl/).
|
51
|
+
|
52
|
+
## Applications
|
53
|
+
|
54
|
+
**Qipowl** has a wide list of applications. The “markright”, descendant
|
55
|
+
of “markup” and “markdown” is presented [here](http://qipowl.herokuapp.com).
|
56
|
+
|
57
|
+
**Qipowl HTML** uses extended unicode symbols
|
58
|
+
to specify more clean and readable source files and (boom!) ruby DSL to
|
59
|
+
interpret them. E.g. the data definitions look like:
|
60
|
+
|
61
|
+
▶ Data term — definition goes here
|
62
|
+
|
63
|
+
Headings:
|
64
|
+
|
65
|
+
§1 This is a second-level heading
|
66
|
+
|
67
|
+
Bold and emphasis:
|
68
|
+
|
69
|
+
The following ≡text≡ goes strong and this one is ≈emphasized≈.
|
70
|
+
|
71
|
+
Comments are possible as well:
|
72
|
+
|
73
|
+
✍ FIXME!
|
74
|
+
Not to forget add this to parsing!
|
75
|
+
✍
|
76
|
+
|
77
|
+
etc.
|
78
|
+
|
79
|
+
## Why?
|
80
|
+
|
81
|
+
Just because it’s 2013 all around. Unicode came already and those fancy
|
82
|
+
symbols are easily mapped to the keyboard layouts. The brackets, used
|
83
|
+
in old good Markdown are ugly, look at how they might be introduced:
|
84
|
+
|
85
|
+
I like Markdown¹http://daringfireball.net/projects/markdown/syntax
|
86
|
+
|
87
|
+
Markdown lacks a lot of modern features (properties of text).
|
88
|
+
|
89
|
+
Markdown does not provide a blanket set of marks, fully covering
|
90
|
+
claims to markup language.
|
91
|
+
|
92
|
+
## Parsing
|
93
|
+
|
94
|
+
Parsing is the most sexy part of **Qipowl** bowels, since it’s done
|
95
|
+
almost without any external parsing; input files are the ruby scripts
|
96
|
+
themselves. WTF? Let me explain.
|
97
|
+
|
98
|
+
Let we have an input file of the following structure:
|
99
|
+
|
100
|
+
§1 Qipowl
|
101
|
+
|
102
|
+
✍ FIXME
|
103
|
+
include language reference here
|
104
|
+
✍
|
105
|
+
|
106
|
+
≡Qipowl≡ is the most exciting ruby DSL application example. As it
|
107
|
+
is stated in markdown reference:
|
108
|
+
|
109
|
+
〉 Readability, however, is emphasized above all else.
|
110
|
+
A Markdown-formatted document should be publishable as-is,
|
111
|
+
as plain text, without looking like it’s been marked up with
|
112
|
+
tags or formatting instructions.
|
113
|
+
— http://daringfireball.net/projects/markdown/syntax
|
114
|
+
|
115
|
+
Now we simply give the source to ruby interpreter, which knowns, that
|
116
|
+
`§1` is *in fact* ruby function, which transforms that to any other syntax
|
117
|
+
we want. To HTML, for instance.
|
118
|
+
|
119
|
+
## Parsing problems
|
120
|
+
|
121
|
+
Not all the constructions may be passed to ruby script as is. There are
|
122
|
+
four exceptions:
|
123
|
+
|
124
|
+
- **blockquotes**, which are in fact kinda documents inside documents, because
|
125
|
+
they might be nested and they may include any other markup;
|
126
|
+
- **images**, **videos**, etc. which may be typed as the hyperlink only;
|
127
|
+
- **anchors, abbrs etc.**, the elements which are not “symbol-text” formed.
|
128
|
+
They rather are looking like “text-symbol-text” and unfortunately should
|
129
|
+
be preparsed to supply correct ruby DSL;
|
130
|
+
- **lists and data definitions**, are to be surrounded with `<ul>`/`<dd>` tags;
|
131
|
+
- **tables**… Bah, I didn’t think most about tables yet. They are ugly.
|
132
|
+
|
133
|
+
### Links
|
134
|
+
|
135
|
+
Links might be:
|
136
|
+
- **anchors**
|
137
|
+
- Wiki says¹http://wikipedia.org
|
138
|
+
- Wiki clone¹/wiki
|
139
|
+
- — Wikipedia, http://wikipedia.org
|
140
|
+
the latter may be found in quotations only.
|
141
|
+
- **images**
|
142
|
+
- http://localhost/a.png
|
143
|
+
- Best views of Hornsjø¹http://localhost/a.png
|
144
|
+
- **videos**
|
145
|
+
- http://youtu.be/SAJ_TzLqy1U
|
146
|
+
- http://www.youtube.com/watch?v=SAJ_TzLqy1U
|
147
|
+
|
148
|
+
Abbrs are looking (and processing) mostly like links, but now we may
|
149
|
+
forget about them:
|
150
|
+
- **abbrs**
|
151
|
+
- Wiki†Best online knowledge base ever†
|
152
|
+
|
153
|
+
|
154
|
+
Links are being parsed in the following manner:
|
155
|
+
|
156
|
+
- find the link in the input, according to simple pattern `URI.regexp`
|
157
|
+
- determine whether it is an image, video or link to page by downloading
|
158
|
+
and analyzing the headers
|
159
|
+
- TODO copying the image to the host computer, providing the watermark
|
160
|
+
with copyright and any other significant information
|
161
|
+
- TODO instead of previous two actions we might simply analyze it by extension
|
162
|
+
e.g. if there is no internet connection available
|
163
|
+
- prepending the link with special character (understood by DSL)
|
164
|
+
|
165
|
+
After all is done, we yield smth like `⚐ http://localhost.a.png` in place of
|
166
|
+
`http://localhost.a.png` and `⚓ http://localhost/index.html` in place of
|
167
|
+
`http://localhost/index.html`
|
168
|
+
|
169
|
+
|
170
|
+
### Examples
|
30
171
|
|
31
172
|
This chapter should be the last one, but who wants to read technical details
|
32
173
|
without any clue of how they might be applied? So, here we go.
|
@@ -94,11 +235,9 @@ _qipowl_ understands six types of ‘operators’:
|
|
94
235
|
* flush
|
95
236
|
* block
|
96
237
|
* magnet
|
97
|
-
*
|
98
|
-
*
|
99
|
-
*
|
100
|
-
* kiss
|
101
|
-
* custom
|
238
|
+
* grip
|
239
|
+
* regular
|
240
|
+
* self
|
102
241
|
|
103
242
|
#### :flush
|
104
243
|
|
@@ -155,14 +294,14 @@ for the markup:
|
|
155
294
|
|
156
295
|
☎ +1(987)5554321
|
157
296
|
|
158
|
-
#### :
|
297
|
+
#### :grip
|
159
298
|
|
160
299
|
Acts mostly like `:block` but inside one text block (text blocks are
|
161
300
|
likely paragraphs, delimited with double carriage returns.) Requires
|
162
301
|
closing element. Inplace operators are of highest priority and may
|
163
302
|
overlap.
|
164
303
|
|
165
|
-
:
|
304
|
+
:grip
|
166
305
|
:≡ : :strong
|
167
306
|
|
168
307
|
will convert
|
@@ -173,12 +312,12 @@ into
|
|
173
312
|
|
174
313
|
That is <strong>bold</strong> text.
|
175
314
|
|
176
|
-
#### :
|
315
|
+
#### :regular
|
177
316
|
|
178
317
|
Those are not require closings, since they are operated on the _rest_ of
|
179
318
|
the text. Support nesting by prepending tags with _non-breakable space_:
|
180
319
|
|
181
|
-
:
|
320
|
+
:regular
|
182
321
|
:• : li
|
183
322
|
|
184
323
|
The following syntax
|
@@ -195,53 +334,6 @@ will produce:
|
|
195
334
|
<li>Nested li 2</li></ul>
|
196
335
|
<li>Line item 2</li></ul>
|
197
336
|
|
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
337
|
### Extending
|
246
338
|
|
247
339
|
Extending _qipowl_ is as easy as writing a couple of strings in YAML format.
|
@@ -307,7 +399,7 @@ link to video into embedded frame with video content as by YouTube.
|
|
307
399
|
|
308
400
|
Add this line to your application's Gemfile:
|
309
401
|
|
310
|
-
gem '
|
402
|
+
gem 'qipowl'
|
311
403
|
|
312
404
|
And then execute:
|
313
405
|
|
@@ -315,25 +407,14 @@ And then execute:
|
|
315
407
|
|
316
408
|
Or install it yourself as:
|
317
409
|
|
318
|
-
$ gem install
|
410
|
+
$ gem install qipowl
|
319
411
|
|
320
412
|
## Usage
|
321
413
|
|
322
414
|
```ruby
|
323
|
-
require '
|
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'
|
415
|
+
require 'qipowl'
|
333
416
|
…
|
334
|
-
|
335
|
-
|
336
|
-
puts tg.parse_and_roll(text)
|
417
|
+
result = Qipowl.parse text # qipowl markup _and_ markdown
|
337
418
|
```
|
338
419
|
|
339
420
|
## Contributing
|
data/bin/bowler
CHANGED
@@ -11,7 +11,7 @@ OptionParser.new do |opts|
|
|
11
11
|
opts.banner = "Usage: #{$0} FILE|STRING"
|
12
12
|
|
13
13
|
# Bowl result?
|
14
|
-
opts.on("-a", "--action ACTION", [:bowl, :ruby, :cmd, :yaml, :html],
|
14
|
+
opts.on("-a", "--action ACTION", [:bowl, :unbowl, :ruby, :cmd, :yaml, :html],
|
15
15
|
"Action to apply on input (bowl, html); default: html") do |action|
|
16
16
|
options[:action] = action || :bowl
|
17
17
|
end
|
@@ -31,6 +31,8 @@ file_or_string = File.read(file_or_string) if File.exist?(file_or_string)
|
|
31
31
|
case options[:action]
|
32
32
|
when :bowl
|
33
33
|
puts file_or_string.bowl
|
34
|
+
when :unbowl
|
35
|
+
puts file_or_string.unbowl
|
34
36
|
else
|
35
37
|
puts Qipowl::Html.parse file_or_string
|
36
|
-
end
|
38
|
+
end
|
data/config/bowlers/html.yaml
CHANGED
@@ -11,7 +11,16 @@
|
|
11
11
|
|
12
12
|
:entities :
|
13
13
|
:self :
|
14
|
-
:qipowl :
|
14
|
+
:qipowl :
|
15
|
+
:tag : :strong
|
16
|
+
:format : "<a href='http://\\1.github.com'>\\1</a>"
|
17
|
+
:tag :
|
18
|
+
:format : :tagger_format
|
19
|
+
:tag2 :
|
20
|
+
:tag : :b
|
21
|
+
:format : :tagger_format
|
22
|
+
:synonyms :
|
23
|
+
- :tag3
|
15
24
|
:block :
|
16
25
|
:✍ :
|
17
26
|
:synonyms :
|
@@ -29,8 +38,6 @@
|
|
29
38
|
:✉ :
|
30
39
|
:tag : :span
|
31
40
|
:class : :email
|
32
|
-
:synonyms :
|
33
|
-
- :mail
|
34
41
|
:✎ : :lj
|
35
42
|
:☇ : :a
|
36
43
|
:grip :
|
@@ -38,11 +45,17 @@
|
|
38
45
|
:≈ : :em
|
39
46
|
:↑ : :sup
|
40
47
|
:↓ : :small
|
41
|
-
:λ :
|
48
|
+
:λ :
|
49
|
+
:tag : :code
|
50
|
+
:synonyms :
|
51
|
+
- :✿_span_fixedfont
|
42
52
|
:⚓ : :a
|
43
53
|
:† : :abbr
|
44
54
|
:✁ : :del
|
45
55
|
:✿_span_nobr : :nobr
|
56
|
+
:✓ :
|
57
|
+
:tag : :span
|
58
|
+
:class : :notypo
|
46
59
|
:regular :
|
47
60
|
:• :
|
48
61
|
:tag : :li
|
@@ -60,7 +73,7 @@
|
|
60
73
|
:tag : :dt
|
61
74
|
:parent :
|
62
75
|
:tag : :dl
|
63
|
-
:class : :
|
76
|
+
:class : :'dl-horizontal'
|
64
77
|
:℁ : :address
|
65
78
|
:〉 :
|
66
79
|
:tag : :p
|
@@ -84,6 +97,8 @@
|
|
84
97
|
:☛ :
|
85
98
|
:tag : :p
|
86
99
|
:class : :'text-success'
|
100
|
+
:synonyms :
|
101
|
+
- :✿_div_center
|
87
102
|
:☞ :
|
88
103
|
:tag : :p
|
89
104
|
:class : :'text-info'
|
@@ -92,7 +107,7 @@
|
|
92
107
|
:class : :'text-warning'
|
93
108
|
:☢ :
|
94
109
|
:tag : :p
|
95
|
-
:class : :
|
110
|
+
:class : :'text-danger'
|
96
111
|
:✇ : :video
|
97
112
|
:⚘ : :figure
|
98
113
|
:✿_p_address :
|
@@ -117,8 +132,8 @@
|
|
117
132
|
# http://www.youtube.com/watch?v=SAJ_TzLqy1U
|
118
133
|
'http://www\.youtube\.com/(?:watch\?v=|v/)([A-Za-z0-9_]+)' : '✇ \1'
|
119
134
|
# Standalone images and quotes
|
120
|
-
'^(https?://\S+)(\s
|
121
|
-
|
135
|
+
'^(https?://\S+)(\s*.*?)$' : '⚘ \1 \2'
|
136
|
+
|
122
137
|
:enclosures :
|
123
138
|
:• :
|
124
139
|
:tag : :ul
|
@@ -127,6 +142,6 @@
|
|
127
142
|
:▶ : :dl
|
128
143
|
:▷ :
|
129
144
|
:tag : :dl
|
130
|
-
:class : :
|
145
|
+
:class : :'dl-horizontal'
|
131
146
|
:〉 : :blockquote
|
132
147
|
|
data/extras/drafts/parsing.md
CHANGED
@@ -1,9 +1,38 @@
|
|
1
1
|
Principles
|
2
2
|
==========
|
3
3
|
|
4
|
-
**
|
5
|
-
[
|
6
|
-
|
4
|
+
**Qipowl** is a Ruby parsing library. The parsing is done via
|
5
|
+
DSL exactly as [Ouroboros](http://en.wikipedia.org/wiki/Ouroboros)
|
6
|
+
eats it’s own tail.
|
7
|
+
|
8
|
+
The whole input is treated as Ruby source code and executed respectively.
|
9
|
+
To prevent collisions of input with built-in ruby methods, the ASCII symbols
|
10
|
+
in the input are being translated into their
|
11
|
+
[fullwidth equivalents](http://en.wikipedia.org/wiki/Halfwidth_and_fullwidth_forms#Chart)
|
12
|
+
before execution (and back to ASCII after the parsing is done.)
|
13
|
+
|
14
|
+
Let’s say we have a string “Hello world” as input. It became ‘encoded’ into:
|
15
|
+
“Hello world”, executed as Ruby code (exactly as e. g. `puts rand`
|
16
|
+
would) and finally ‘decoded’ back to ASCII. Whether the parser knows anything
|
17
|
+
about ‘Hello’ or ‘world’ it would be executed. Say, we have
|
18
|
+
|
19
|
+
def world *args
|
20
|
+
"brave new #{__callee__}"
|
21
|
+
end
|
22
|
+
|
23
|
+
thus the output will be:
|
24
|
+
|
25
|
+
# ⇒ Hello brave new world
|
26
|
+
|
27
|
+
More about may be found at [project page](http://rocket-science.ru/qipowl/).
|
28
|
+
|
29
|
+
Applications
|
30
|
+
============
|
31
|
+
|
32
|
+
**Qipowl** has a wide list of applications. The “markright”, descendant
|
33
|
+
of “markup” and “markdown” is presented [here](http://qipowl.herokuapp.com).
|
34
|
+
|
35
|
+
**Qipowl HTML** uses extended unicode symbols
|
7
36
|
to specify more clean and readable source files and (boom!) ruby DSL to
|
8
37
|
interpret them. E.g. the data definitions look like:
|
9
38
|
|
@@ -11,7 +40,7 @@ interpret them. E.g. the data definitions look like:
|
|
11
40
|
|
12
41
|
Headings:
|
13
42
|
|
14
|
-
|
43
|
+
§1 This is a second-level heading
|
15
44
|
|
16
45
|
Bold and emphasis:
|
17
46
|
|
@@ -19,13 +48,12 @@ Bold and emphasis:
|
|
19
48
|
|
20
49
|
Comments are possible as well:
|
21
50
|
|
22
|
-
|
51
|
+
✍ FIXME!
|
52
|
+
Not to forget add this to parsing!
|
53
|
+
✍
|
23
54
|
|
24
55
|
etc.
|
25
56
|
|
26
|
-
The other goal is to generate more typographically correct output, with
|
27
|
-
proper quotation marks (“” instead of "" etc.)
|
28
|
-
|
29
57
|
Why?
|
30
58
|
====
|
31
59
|
|
@@ -35,37 +63,37 @@ in old good Markdown are ugly, look at how they might be introduced:
|
|
35
63
|
|
36
64
|
I like Markdown¹http://daringfireball.net/projects/markdown/syntax
|
37
65
|
|
38
|
-
Markdown lacks a lot of modern features (properties of text
|
39
|
-
- tags
|
40
|
-
- ???
|
66
|
+
Markdown lacks a lot of modern features (properties of text).
|
41
67
|
|
42
68
|
Markdown does not provide a blanket set of marks, fully covering
|
43
69
|
claims to markup language.
|
44
70
|
|
45
|
-
|
46
71
|
Parsing
|
47
72
|
=======
|
48
73
|
|
49
|
-
Parsing is the most sexy part of **
|
50
|
-
almost without any external parsing;
|
74
|
+
Parsing is the most sexy part of **Qipowl** bowels, since it’s done
|
75
|
+
almost without any external parsing; input files are the ruby scripts
|
51
76
|
themselves. WTF? Let me explain.
|
52
77
|
|
53
|
-
Let we have
|
78
|
+
Let we have an input file of the following structure:
|
54
79
|
|
55
|
-
§
|
80
|
+
§1 Qipowl
|
56
81
|
|
57
|
-
|
58
|
-
|
82
|
+
✍ FIXME
|
83
|
+
include language reference here
|
84
|
+
✍
|
85
|
+
|
86
|
+
≡Qipowl≡ is the most exciting ruby DSL application example. As it
|
59
87
|
is stated in markdown reference:
|
60
88
|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
89
|
+
〉 Readability, however, is emphasized above all else.
|
90
|
+
A Markdown-formatted document should be publishable as-is,
|
91
|
+
as plain text, without looking like it’s been marked up with
|
92
|
+
tags or formatting instructions.
|
93
|
+
— http://daringfireball.net/projects/markdown/syntax
|
66
94
|
|
67
95
|
Now we simply give the source to ruby interpreter, which knowns, that
|
68
|
-
|
96
|
+
`§1` is *in fact* ruby function, which transforms that to any other syntax
|
69
97
|
we want. To HTML, for instance.
|
70
98
|
|
71
99
|
## Parsing problems
|
@@ -81,7 +109,6 @@ They rather are looking like “text-symbol-text” and unfortunately should
|
|
81
109
|
be preparsed to supply correct ruby DSL;
|
82
110
|
- **lists and data definitions**, are to be surrounded with `<ul>`/`<dd>` tags;
|
83
111
|
- **tables**… Bah, I didn’t think most about tables yet. They are ugly.
|
84
|
-
|
85
112
|
|
86
113
|
### Links
|
87
114
|
|
@@ -106,8 +133,7 @@ forget about them:
|
|
106
133
|
|
107
134
|
Links are being parsed in the following manner:
|
108
135
|
|
109
|
-
- find the link in the input, according to simple pattern
|
110
|
-
`(?:^|\P{L})(?<proto>[hftps/:]*)(?<path>\S+?)(?:\s|$)`
|
136
|
+
- find the link in the input, according to simple pattern `URI.regexp`
|
111
137
|
- determine whether it is an image, video or link to page by downloading
|
112
138
|
and analyzing the headers
|
113
139
|
- TODO copying the image to the host computer, providing the watermark
|
@@ -120,18 +146,3 @@ After all is done, we yield smth like `⚐ http://localhost.a.png` in place of
|
|
120
146
|
`http://localhost.a.png` and `⚓ http://localhost/index.html` in place of
|
121
147
|
`http://localhost/index.html`
|
122
148
|
|
123
|
-
We will store all the links in some array and substitute them in input
|
124
|
-
with array index as shown below:
|
125
|
-
|
126
|
-
Wiki¹⚓0 says, that Saint-Petersburg is the most beatuful city in the world:
|
127
|
-
SPb in the night¹⚐1
|
128
|
-
|
129
|
-
### Links and abbrs: final normalization
|
130
|
-
|
131
|
-
Now there are no nasty “http://” links without prepending DSL. Nice.
|
132
|
-
Let’s go further: we don’t like links and abbrs in format
|
133
|
-
|
134
|
-
- `title¹href`
|
135
|
-
- and `term†explanation`
|
136
|
-
|
137
|
-
|