written 0.2.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.babelrc +3 -0
- data/.gitignore +2 -0
- data/.ruby-version +1 -0
- data/README.md +18 -8
- data/Rakefile +1 -0
- data/compile-coffee.js +14 -0
- data/lib/written/app/assets/javascripts/written/attachments/image.coffee +4 -4
- data/lib/written/app/assets/javascripts/written/core/content.coffee +18 -29
- data/lib/written/app/assets/javascripts/written/core/cursor.coffee +8 -7
- data/lib/written/app/assets/javascripts/written/core/document.coffee +9 -8
- data/lib/written/app/assets/javascripts/written/core/{extensions/string.coffee → html.coffee} +3 -2
- data/lib/written/app/assets/javascripts/written/core/parsers.coffee +179 -0
- data/lib/written/app/assets/javascripts/written/parsers/block/code.coffee +11 -28
- data/lib/written/app/assets/javascripts/written/parsers/block/heading.coffee +37 -39
- data/lib/written/app/assets/javascripts/written/parsers/block/image.coffee +15 -39
- data/lib/written/app/assets/javascripts/written/parsers/block/olist.coffee +23 -20
- data/lib/written/app/assets/javascripts/written/parsers/block/paragraph.coffee +14 -34
- data/lib/written/app/assets/javascripts/written/parsers/block/quote.coffee +19 -38
- data/lib/written/app/assets/javascripts/written/parsers/block/ulist.coffee +20 -18
- data/lib/written/app/assets/javascripts/written/parsers/inline/bold.coffee +23 -0
- data/lib/written/app/assets/javascripts/written/parsers/inline/code.coffee +8 -27
- data/lib/written/app/assets/javascripts/written/parsers/inline/italic.coffee +8 -28
- data/lib/written/app/assets/javascripts/written/parsers/inline/link.coffee +8 -27
- data/lib/written/app/assets/stylesheets/written.scss +4 -0
- data/lib/written/version.rb +1 -1
- data/package.json +25 -0
- data/test/javascript/parsers/block/code.js +58 -0
- data/test/javascript/parsers/block/header.js +40 -0
- data/test/javascript/parsers/block/image.js +39 -0
- data/test/javascript/parsers/block/olist.js +41 -0
- data/test/javascript/parsers/block/paragraph.js +42 -0
- data/test/javascript/parsers/block/quote.js +41 -0
- data/test/javascript/parsers/block/ulist.js +40 -0
- data/test/javascript/parsers/inline/code.js +41 -0
- data/test/javascript/parsers/inline/italic.js +42 -0
- data/test/javascript/parsers/inline/link.js +42 -0
- data/test/javascript/parsers/inline/strong.js +41 -0
- data/test/server/app/assets/javascripts/application.coffee +8 -9
- data/test/server/app/assets/javascripts/secret.coffee +6 -0
- data/test/server/app/views/posts/show.html.erb +4 -4
- metadata +21 -12
- data/lib/written/app/assets/javascripts/written/parsers/inline/strong.coffee +0 -43
- data/lib/written/app/assets/javascripts/written/parsers/parsers.coffee +0 -95
- data/test/javascript/assertions/assert.coffee +0 -3
- data/test/javascript/polyfills.coffee +0 -2
- data/test/javascript/polyfills/HTMLULListElement.coffee +0 -0
- data/test/javascript/polyfills/Text.coffee +0 -0
- data/test/javascript/runner.coffee +0 -46
- data/test/javascript/tests/initialization.coffee +0 -16
- data/test/javascript/tests/parsing.coffee +0 -9
@@ -0,0 +1,6 @@
|
|
1
|
+
window.AWS = {
|
2
|
+
bucket: 'http://pothibo.testing.s3.amazonaws.com',
|
3
|
+
accessKey: 'AKIAIW6GIE2SUPSM6XLQ',
|
4
|
+
policy: 'eyJleHBpcmF0aW9uIjoiMjAyMC0wMS0wMVQwMDowMDowMFoiLCJjb25kaXRpb25zIjpbeyJidWNrZXQiOiJwb3RoaWJvLnRlc3RpbmcifSxbInN0YXJ0cy13aXRoIiwiJGtleSIsIiJdLHsiYWNsIjoicHJpdmF0ZSJ9LFsic3RhcnRzLXdpdGgiLCIkQ29udGVudC1UeXBlIiwiIl0sWyJjb250ZW50LWxlbmd0aC1yYW5nZSIsMCw1MjQyODgwXV19',
|
5
|
+
signature: 'oxZtTxMsEZRER2nNcNqT1YPNaDo='
|
6
|
+
}
|
@@ -3,12 +3,12 @@
|
|
3
3
|
1. this is a list
|
4
4
|
2. this is another list
|
5
5
|
3. this is another list
|
6
|
-
- this is
|
7
|
-
3. this is [a](http://google.com)
|
8
|
-
test *boo* and them *some* or
|
6
|
+
- this is **a** list
|
7
|
+
3. this is [a](http://google.com) *list*. It's special, isn't **it**?
|
8
|
+
test *boo* and them *some* or **some!!** a
|
9
9
|
|
10
10
|
|
11
|
-
![an
|
11
|
+
![an *image* is worth a **thousand** words](image)
|
12
12
|
|
13
13
|
~~~javascript
|
14
14
|
var test = "hello"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: written
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Pier-Olivier Thibault
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-05-
|
11
|
+
date: 2016-05-30 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Written is a rich Markdown editor for the web.
|
14
14
|
email: pothibo@gmail.com
|
@@ -16,12 +16,15 @@ executables: []
|
|
16
16
|
extensions: []
|
17
17
|
extra_rdoc_files: []
|
18
18
|
files:
|
19
|
+
- ".babelrc"
|
19
20
|
- ".gitignore"
|
21
|
+
- ".ruby-version"
|
20
22
|
- Gemfile
|
21
23
|
- Gemfile.lock
|
22
24
|
- LICENSE
|
23
25
|
- README.md
|
24
26
|
- Rakefile
|
27
|
+
- compile-coffee.js
|
25
28
|
- lib/written.rb
|
26
29
|
- lib/written/app/assets/images/written/placeholder.png
|
27
30
|
- lib/written/app/assets/javascripts/written.coffee
|
@@ -30,9 +33,10 @@ files:
|
|
30
33
|
- lib/written/app/assets/javascripts/written/core/content.coffee
|
31
34
|
- lib/written/app/assets/javascripts/written/core/cursor.coffee
|
32
35
|
- lib/written/app/assets/javascripts/written/core/document.coffee
|
33
|
-
- lib/written/app/assets/javascripts/written/core/extensions/string.coffee
|
34
36
|
- lib/written/app/assets/javascripts/written/core/history.coffee
|
37
|
+
- lib/written/app/assets/javascripts/written/core/html.coffee
|
35
38
|
- lib/written/app/assets/javascripts/written/core/observer.coffee
|
39
|
+
- lib/written/app/assets/javascripts/written/core/parsers.coffee
|
36
40
|
- lib/written/app/assets/javascripts/written/parsers/block/code.coffee
|
37
41
|
- lib/written/app/assets/javascripts/written/parsers/block/heading.coffee
|
38
42
|
- lib/written/app/assets/javascripts/written/parsers/block/image.coffee
|
@@ -40,24 +44,29 @@ files:
|
|
40
44
|
- lib/written/app/assets/javascripts/written/parsers/block/paragraph.coffee
|
41
45
|
- lib/written/app/assets/javascripts/written/parsers/block/quote.coffee
|
42
46
|
- lib/written/app/assets/javascripts/written/parsers/block/ulist.coffee
|
47
|
+
- lib/written/app/assets/javascripts/written/parsers/inline/bold.coffee
|
43
48
|
- lib/written/app/assets/javascripts/written/parsers/inline/code.coffee
|
44
49
|
- lib/written/app/assets/javascripts/written/parsers/inline/italic.coffee
|
45
50
|
- lib/written/app/assets/javascripts/written/parsers/inline/link.coffee
|
46
|
-
- lib/written/app/assets/javascripts/written/parsers/inline/strong.coffee
|
47
|
-
- lib/written/app/assets/javascripts/written/parsers/parsers.coffee
|
48
51
|
- lib/written/app/assets/stylesheets/written.scss
|
49
52
|
- lib/written/railtie.rb
|
50
53
|
- lib/written/version.rb
|
51
|
-
-
|
52
|
-
- test/javascript/
|
53
|
-
- test/javascript/
|
54
|
-
- test/javascript/
|
55
|
-
- test/javascript/
|
56
|
-
- test/javascript/
|
57
|
-
- test/javascript/
|
54
|
+
- package.json
|
55
|
+
- test/javascript/parsers/block/code.js
|
56
|
+
- test/javascript/parsers/block/header.js
|
57
|
+
- test/javascript/parsers/block/image.js
|
58
|
+
- test/javascript/parsers/block/olist.js
|
59
|
+
- test/javascript/parsers/block/paragraph.js
|
60
|
+
- test/javascript/parsers/block/quote.js
|
61
|
+
- test/javascript/parsers/block/ulist.js
|
62
|
+
- test/javascript/parsers/inline/code.js
|
63
|
+
- test/javascript/parsers/inline/italic.js
|
64
|
+
- test/javascript/parsers/inline/link.js
|
65
|
+
- test/javascript/parsers/inline/strong.js
|
58
66
|
- test/ruby/blank_test.rb
|
59
67
|
- test/server/app/assets/javascripts/application.coffee
|
60
68
|
- test/server/app/assets/javascripts/prism.js
|
69
|
+
- test/server/app/assets/javascripts/secret.coffee
|
61
70
|
- test/server/app/assets/stylesheets/application.scss
|
62
71
|
- test/server/app/assets/stylesheets/prism.css
|
63
72
|
- test/server/app/controllers/application_controller.rb
|
@@ -1,43 +0,0 @@
|
|
1
|
-
class Strong
|
2
|
-
constructor: (match) ->
|
3
|
-
@match = match
|
4
|
-
|
5
|
-
index: =>
|
6
|
-
@match.index
|
7
|
-
|
8
|
-
length: =>
|
9
|
-
@match[0].length
|
10
|
-
|
11
|
-
markdown: =>
|
12
|
-
"<strong>#{@match[0]}</strong>".toHTML()
|
13
|
-
|
14
|
-
html: =>
|
15
|
-
"<strong>#{@match[3]}</strong>".toHTML()
|
16
|
-
|
17
|
-
Strong.rule = /((\*{1})([^\*]+)(\*{1}))/gi
|
18
|
-
|
19
|
-
Written.Parsers.register {
|
20
|
-
parser: Strong
|
21
|
-
node: 'strong'
|
22
|
-
type: 'inline'
|
23
|
-
getRange: (node, offset, walker) ->
|
24
|
-
range = document.createRange()
|
25
|
-
|
26
|
-
if !node.firstChild?
|
27
|
-
range.setStart(this, 0)
|
28
|
-
else
|
29
|
-
while walker.nextNode()
|
30
|
-
if walker.currentNode.length < offset
|
31
|
-
offset -= walker.currentNode.length
|
32
|
-
continue
|
33
|
-
|
34
|
-
range.setStart(walker.currentNode, offset)
|
35
|
-
break
|
36
|
-
|
37
|
-
range.collapse(true)
|
38
|
-
range
|
39
|
-
|
40
|
-
toString: (node) ->
|
41
|
-
node.textContent
|
42
|
-
|
43
|
-
}
|
@@ -1,95 +0,0 @@
|
|
1
|
-
@Written.Parsers = new class
|
2
|
-
constructor: ->
|
3
|
-
@blocks = []
|
4
|
-
@inlines = []
|
5
|
-
@nodes = {}
|
6
|
-
|
7
|
-
@blocks.parse = @parseBlocks.bind(this, @blocks)
|
8
|
-
@inlines.parse = @parseInlines.bind(this, @inlines)
|
9
|
-
|
10
|
-
register: (struct) ->
|
11
|
-
type = undefined
|
12
|
-
if struct.type == 'block'
|
13
|
-
type = @blocks
|
14
|
-
else if struct.type == 'inline'
|
15
|
-
type = @inlines
|
16
|
-
else
|
17
|
-
raise 'error: Written.Parsers can either be "block" or "inline"'
|
18
|
-
return
|
19
|
-
|
20
|
-
if struct.default
|
21
|
-
type.default = struct.parser
|
22
|
-
else
|
23
|
-
type.push struct.parser
|
24
|
-
|
25
|
-
@nodes[struct.node] = struct
|
26
|
-
|
27
|
-
parse: (parsers, text) ->
|
28
|
-
parsers.parse(text)
|
29
|
-
|
30
|
-
parseBlocks: (parsers, text) ->
|
31
|
-
parsers = [parsers.default].concat(parsers).reverse()
|
32
|
-
blocks = []
|
33
|
-
lines = text.split('\n').reverse()
|
34
|
-
while (line = lines.pop()) != undefined
|
35
|
-
str = line
|
36
|
-
block = blocks[blocks.length - 1]
|
37
|
-
|
38
|
-
if block? && block.multiline && block.accepts(line)
|
39
|
-
block.append(line)
|
40
|
-
continue
|
41
|
-
|
42
|
-
blocks.push(@find(parsers, str))
|
43
|
-
|
44
|
-
blocks
|
45
|
-
|
46
|
-
parseInlines: (parsers, text) ->
|
47
|
-
buffer = ''
|
48
|
-
content = []
|
49
|
-
matches = []
|
50
|
-
index = 0
|
51
|
-
|
52
|
-
for p in parsers
|
53
|
-
p.rule.lastIndex = 0
|
54
|
-
|
55
|
-
while match = p.rule.exec(text)
|
56
|
-
parser = new p(match)
|
57
|
-
matches[parser.index()] = parser
|
58
|
-
|
59
|
-
while text[index]?
|
60
|
-
if parser = matches[index]
|
61
|
-
content.push buffer.slice(0)
|
62
|
-
content.push parser
|
63
|
-
buffer = ''
|
64
|
-
index += parser.length()
|
65
|
-
else
|
66
|
-
buffer += text[index]
|
67
|
-
index += 1
|
68
|
-
|
69
|
-
if buffer.length > 0
|
70
|
-
content.push buffer
|
71
|
-
|
72
|
-
content
|
73
|
-
|
74
|
-
find: (parsers, str) ->
|
75
|
-
parser = undefined
|
76
|
-
for p in parsers
|
77
|
-
if match = p.rule.exec(str)
|
78
|
-
parser = new p(match)
|
79
|
-
break
|
80
|
-
|
81
|
-
return parser
|
82
|
-
|
83
|
-
get: (name) ->
|
84
|
-
@nodes[name]
|
85
|
-
|
86
|
-
getRange: (node, offset, walker) ->
|
87
|
-
@nodes[node.nodeName.toLowerCase()].getRange(node, offset, walker)
|
88
|
-
|
89
|
-
toString: (node) ->
|
90
|
-
struct = @nodes[node.nodeName.toLowerCase()]
|
91
|
-
if struct?
|
92
|
-
struct.toString(node)
|
93
|
-
else
|
94
|
-
node.textContent
|
95
|
-
|
File without changes
|
File without changes
|
@@ -1,46 +0,0 @@
|
|
1
|
-
system = require('system')
|
2
|
-
|
3
|
-
class Runner
|
4
|
-
tests: ->
|
5
|
-
@page.evaluate ->
|
6
|
-
Test.retrieveAll()
|
7
|
-
|
8
|
-
start: =>
|
9
|
-
success = 0
|
10
|
-
failure = 0
|
11
|
-
error = 0
|
12
|
-
console.log("\n# Running:\n")
|
13
|
-
for suite in @tests()
|
14
|
-
console.log "#{suite.name}:"
|
15
|
-
for test in suite.tests
|
16
|
-
info = @page.evaluate @invoke, suite.name, test
|
17
|
-
if info.result == 'success'
|
18
|
-
success += 1
|
19
|
-
console.log("✓ #{test}")
|
20
|
-
else
|
21
|
-
failure += 1
|
22
|
-
console.log("✖ #{test}")
|
23
|
-
console.log(" #{info.message}")
|
24
|
-
total = success + failure + error
|
25
|
-
console.log "\n#{total} runs, #{success} successful, #{failure} failure and #{error} errors"
|
26
|
-
|
27
|
-
invoke: (suite, test) ->
|
28
|
-
Test.invoke(suite, test)
|
29
|
-
|
30
|
-
returnValue = -1
|
31
|
-
try
|
32
|
-
runner = new Runner()
|
33
|
-
runner.page = require('webpage').create()
|
34
|
-
runner.page.content = '<body><div id="Editor"></div></body>'
|
35
|
-
runner.page.onConsoleMessage = (msg) ->
|
36
|
-
console.log(msg)
|
37
|
-
|
38
|
-
if runner.page.injectJs(system.args[1])
|
39
|
-
runner.start()
|
40
|
-
|
41
|
-
returnValue = 0
|
42
|
-
catch e
|
43
|
-
console.log e
|
44
|
-
console.log e.stack
|
45
|
-
finally
|
46
|
-
phantom.exit(returnValue)
|
@@ -1,16 +0,0 @@
|
|
1
|
-
subject = new Test.Subject('initialization')
|
2
|
-
|
3
|
-
subject.test "editor is bound to the element", (test) ->
|
4
|
-
el = document.querySelector('#Editor')
|
5
|
-
blank = new Blank(el)
|
6
|
-
test.assert blank.element() == el, "No element was set"
|
7
|
-
|
8
|
-
subject.test "editor should be loaded", (test) ->
|
9
|
-
el = document.querySelector('#Editor')
|
10
|
-
blank = new Blank(el)
|
11
|
-
test.assert blank.element().dataset.status == 'loaded', JSON.stringify(blank.element().dataset)
|
12
|
-
|
13
|
-
subject.test 'editor should load with default parser', (test) ->
|
14
|
-
el = document.querySelector('#Editor')
|
15
|
-
blank = new Blank(el)
|
16
|
-
test.assert blank.parsers.length == Blank.Parsers().sort().length
|