written 0.0.5 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/LICENSE +8 -0
- data/README.md +63 -0
- data/Rakefile +17 -27
- data/lib/written.rb +0 -8
- data/lib/written/app/assets/images/written/placeholder.png +0 -0
- data/lib/written/app/assets/javascripts/written.coffee +2 -0
- data/lib/written/app/assets/javascripts/written/core/content.coffee +53 -35
- data/lib/written/app/assets/javascripts/written/core/cursor.coffee +33 -12
- data/lib/written/app/assets/javascripts/written/core/document.coffee +16 -11
- data/lib/written/app/assets/javascripts/written/core/extensions/string.coffee +9 -0
- data/lib/written/app/assets/javascripts/written/core/extensions/text.coffee +2 -0
- data/lib/written/app/assets/javascripts/written/core/history.coffee +2 -0
- data/lib/written/app/assets/javascripts/written/core/observer.coffee +6 -2
- data/lib/written/app/assets/javascripts/written/core/stringify.coffee +15 -0
- data/lib/written/app/assets/javascripts/written/parsers/block.coffee +69 -0
- data/lib/written/app/assets/javascripts/written/parsers/block/code.coffee +79 -15
- data/lib/written/app/assets/javascripts/written/parsers/block/heading.coffee +60 -5
- data/lib/written/app/assets/javascripts/written/parsers/block/image.coffee +103 -9
- data/lib/written/app/assets/javascripts/written/parsers/block/olist.coffee +94 -12
- data/lib/written/app/assets/javascripts/written/parsers/block/paragraph.coffee +63 -5
- data/lib/written/app/assets/javascripts/written/parsers/block/quote.coffee +92 -0
- data/lib/written/app/assets/javascripts/written/parsers/block/ulist.coffee +93 -12
- data/lib/written/app/assets/javascripts/written/parsers/inline.coffee +81 -0
- data/lib/written/app/assets/javascripts/written/parsers/inline/code.coffee +57 -0
- data/lib/written/app/assets/javascripts/written/parsers/inline/italic.coffee +40 -7
- data/lib/written/app/assets/javascripts/written/parsers/inline/link.coffee +43 -13
- data/lib/written/app/assets/javascripts/written/parsers/inline/list.coffee +27 -0
- data/lib/written/app/assets/javascripts/written/parsers/inline/strong.coffee +41 -7
- data/lib/written/app/assets/javascripts/written/parsers/parsers.coffee +21 -107
- data/lib/written/app/assets/javascripts/written/polyfills/CustomElements/CustomElements.js +32 -0
- data/lib/written/app/assets/javascripts/written/polyfills/CustomElements/base.js +40 -0
- data/lib/written/app/assets/javascripts/written/polyfills/CustomElements/boot.js +124 -0
- data/lib/written/app/assets/javascripts/written/polyfills/CustomElements/observe.js +318 -0
- data/lib/written/app/assets/javascripts/written/polyfills/CustomElements/register.js +369 -0
- data/lib/written/app/assets/javascripts/written/polyfills/CustomElements/traverse.js +86 -0
- data/lib/written/app/assets/javascripts/written/polyfills/CustomElements/upgrade.js +130 -0
- data/lib/written/app/assets/javascripts/written/polyfills/MutationObserver/MutationObserver.js +575 -0
- data/lib/written/app/assets/javascripts/written/polyfills/WeakMap/WeakMap.js +49 -0
- data/lib/written/app/assets/javascripts/written/polyfills/base.coffee +10 -0
- data/lib/written/app/assets/javascripts/written/polyfills/dom.js +104 -0
- data/lib/written/app/assets/javascripts/written/uploaders/aws.coffee +125 -0
- data/lib/written/app/assets/stylesheets/written.scss +80 -11
- data/lib/written/version.rb +1 -1
- data/test/server/app/assets/javascripts/application.coffee +20 -2
- data/test/server/app/assets/stylesheets/application.scss +2 -2
- data/test/server/app/assets/stylesheets/prism.css +0 -1
- data/test/server/app/views/posts/show.html.erb +10 -3
- metadata +26 -20
- data/lib/written/app/assets/javascripts/written/core/ext.coffee +0 -109
- data/lib/written/app/assets/javascripts/written/core/extensions.coffee +0 -2
- data/lib/written/document.rb +0 -42
- data/lib/written/node.rb +0 -21
- data/lib/written/nodes/code.rb +0 -65
- data/lib/written/nodes/heading.rb +0 -15
- data/lib/written/nodes/image.rb +0 -14
- data/lib/written/nodes/ordered_list.rb +0 -18
- data/lib/written/nodes/unordered_list.rb +0 -19
- data/lib/written/parsers.rb +0 -11
- data/lib/written/parsers/base.rb +0 -26
- data/lib/written/parsers/code.rb +0 -60
- data/lib/written/parsers/heading.rb +0 -19
- data/lib/written/parsers/image.rb +0 -19
- data/lib/written/parsers/link.rb +0 -12
- data/lib/written/parsers/list.rb +0 -33
- data/lib/written/parsers/word.rb +0 -16
@@ -1,12 +1,14 @@
|
|
1
1
|
<h1>Editor tests</h1>
|
2
|
-
<div id='Editor' contenteditable=true># Hello World
|
2
|
+
<div id='Editor' contenteditable=true># Hello *World*!
|
3
3
|
1. this is a list
|
4
|
+
2. this is another list
|
5
|
+
3. this is another list
|
4
6
|
- this is **a** list
|
5
7
|
3. this is [a](http://google.com) *list*. It's special, isn't **it**?
|
6
8
|
test *boo* and them *some* or **some!!** a
|
7
9
|
|
8
10
|
|
9
|
-
![an](image)
|
11
|
+
![an *image* is worth a **thousand** words](image)
|
10
12
|
|
11
13
|
~~~javascript
|
12
14
|
var test = "hello"
|
@@ -14,4 +16,9 @@ var test = "hello"
|
|
14
16
|
~~~ruby
|
15
17
|
var test = "hello"
|
16
18
|
~~~
|
17
|
-
Hello
|
19
|
+
Hello
|
20
|
+
|
21
|
+
> a quote
|
22
|
+
> on multiline
|
23
|
+
|
24
|
+
The End</div>
|
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.1.1
|
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-
|
11
|
+
date: 2016-05-09 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
|
@@ -19,42 +19,48 @@ files:
|
|
19
19
|
- ".gitignore"
|
20
20
|
- Gemfile
|
21
21
|
- Gemfile.lock
|
22
|
+
- LICENSE
|
23
|
+
- README.md
|
22
24
|
- Rakefile
|
23
25
|
- lib/written.rb
|
26
|
+
- lib/written/app/assets/images/written/placeholder.png
|
24
27
|
- lib/written/app/assets/javascripts/written.coffee
|
25
28
|
- lib/written/app/assets/javascripts/written/core/content.coffee
|
26
29
|
- lib/written/app/assets/javascripts/written/core/cursor.coffee
|
27
30
|
- lib/written/app/assets/javascripts/written/core/document.coffee
|
28
|
-
- lib/written/app/assets/javascripts/written/core/
|
29
|
-
- lib/written/app/assets/javascripts/written/core/extensions.coffee
|
31
|
+
- lib/written/app/assets/javascripts/written/core/extensions/string.coffee
|
32
|
+
- lib/written/app/assets/javascripts/written/core/extensions/text.coffee
|
30
33
|
- lib/written/app/assets/javascripts/written/core/history.coffee
|
31
34
|
- lib/written/app/assets/javascripts/written/core/observer.coffee
|
35
|
+
- lib/written/app/assets/javascripts/written/core/stringify.coffee
|
36
|
+
- lib/written/app/assets/javascripts/written/parsers/block.coffee
|
32
37
|
- lib/written/app/assets/javascripts/written/parsers/block/code.coffee
|
33
38
|
- lib/written/app/assets/javascripts/written/parsers/block/heading.coffee
|
34
39
|
- lib/written/app/assets/javascripts/written/parsers/block/image.coffee
|
35
40
|
- lib/written/app/assets/javascripts/written/parsers/block/olist.coffee
|
36
41
|
- lib/written/app/assets/javascripts/written/parsers/block/paragraph.coffee
|
42
|
+
- lib/written/app/assets/javascripts/written/parsers/block/quote.coffee
|
37
43
|
- lib/written/app/assets/javascripts/written/parsers/block/ulist.coffee
|
44
|
+
- lib/written/app/assets/javascripts/written/parsers/inline.coffee
|
45
|
+
- lib/written/app/assets/javascripts/written/parsers/inline/code.coffee
|
38
46
|
- lib/written/app/assets/javascripts/written/parsers/inline/italic.coffee
|
39
47
|
- lib/written/app/assets/javascripts/written/parsers/inline/link.coffee
|
48
|
+
- lib/written/app/assets/javascripts/written/parsers/inline/list.coffee
|
40
49
|
- lib/written/app/assets/javascripts/written/parsers/inline/strong.coffee
|
41
50
|
- lib/written/app/assets/javascripts/written/parsers/parsers.coffee
|
51
|
+
- lib/written/app/assets/javascripts/written/polyfills/CustomElements/CustomElements.js
|
52
|
+
- lib/written/app/assets/javascripts/written/polyfills/CustomElements/base.js
|
53
|
+
- lib/written/app/assets/javascripts/written/polyfills/CustomElements/boot.js
|
54
|
+
- lib/written/app/assets/javascripts/written/polyfills/CustomElements/observe.js
|
55
|
+
- lib/written/app/assets/javascripts/written/polyfills/CustomElements/register.js
|
56
|
+
- lib/written/app/assets/javascripts/written/polyfills/CustomElements/traverse.js
|
57
|
+
- lib/written/app/assets/javascripts/written/polyfills/CustomElements/upgrade.js
|
58
|
+
- lib/written/app/assets/javascripts/written/polyfills/MutationObserver/MutationObserver.js
|
59
|
+
- lib/written/app/assets/javascripts/written/polyfills/WeakMap/WeakMap.js
|
60
|
+
- lib/written/app/assets/javascripts/written/polyfills/base.coffee
|
61
|
+
- lib/written/app/assets/javascripts/written/polyfills/dom.js
|
62
|
+
- lib/written/app/assets/javascripts/written/uploaders/aws.coffee
|
42
63
|
- lib/written/app/assets/stylesheets/written.scss
|
43
|
-
- lib/written/document.rb
|
44
|
-
- lib/written/node.rb
|
45
|
-
- lib/written/nodes/code.rb
|
46
|
-
- lib/written/nodes/heading.rb
|
47
|
-
- lib/written/nodes/image.rb
|
48
|
-
- lib/written/nodes/ordered_list.rb
|
49
|
-
- lib/written/nodes/unordered_list.rb
|
50
|
-
- lib/written/parsers.rb
|
51
|
-
- lib/written/parsers/base.rb
|
52
|
-
- lib/written/parsers/code.rb
|
53
|
-
- lib/written/parsers/heading.rb
|
54
|
-
- lib/written/parsers/image.rb
|
55
|
-
- lib/written/parsers/link.rb
|
56
|
-
- lib/written/parsers/list.rb
|
57
|
-
- lib/written/parsers/word.rb
|
58
64
|
- lib/written/railtie.rb
|
59
65
|
- lib/written/version.rb
|
60
66
|
- test/javascript/assertions/assert.coffee
|
@@ -97,7 +103,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
97
103
|
version: '0'
|
98
104
|
requirements: []
|
99
105
|
rubyforge_project:
|
100
|
-
rubygems_version: 2.
|
106
|
+
rubygems_version: 2.5.1
|
101
107
|
signing_key:
|
102
108
|
specification_version: 4
|
103
109
|
summary: HTML and Ruby Markdown Editor
|
@@ -1,109 +0,0 @@
|
|
1
|
-
String::toHTML = ->
|
2
|
-
el = document.createElement('div')
|
3
|
-
el.innerHTML = this
|
4
|
-
if el.children.length > 1
|
5
|
-
el.children
|
6
|
-
else
|
7
|
-
el.children[0]
|
8
|
-
|
9
|
-
Text::toString = ->
|
10
|
-
@textContent
|
11
|
-
|
12
|
-
HTMLOListElement::toString = HTMLUListElement::toString = ->
|
13
|
-
texts = Array.prototype.slice.call(@children).map (li) ->
|
14
|
-
li.textContent
|
15
|
-
texts.join("\n")
|
16
|
-
|
17
|
-
HTMLDivElement::toString = ->
|
18
|
-
if @classList.contains('image')
|
19
|
-
@lastChild.textContent
|
20
|
-
else
|
21
|
-
@textContent
|
22
|
-
|
23
|
-
HTMLPreElement::toString = ->
|
24
|
-
if @textContent[@textContent.length - 1] == '\n'
|
25
|
-
@textContent.substr(0, @textContent.length - 1)
|
26
|
-
else
|
27
|
-
@textContent
|
28
|
-
|
29
|
-
HTMLElement::toString = ->
|
30
|
-
if @nodeName == 'FIGURE'
|
31
|
-
(@querySelector('figcaption') || this).textContent
|
32
|
-
else
|
33
|
-
@textContent
|
34
|
-
|
35
|
-
HTMLHeadingElement::toString = HTMLParagraphElement::toString = ->
|
36
|
-
@textContent
|
37
|
-
|
38
|
-
HTMLElement::offset = (node, walker) ->
|
39
|
-
offset = 0
|
40
|
-
|
41
|
-
while walker.nextNode()
|
42
|
-
if walker.currentNode != node
|
43
|
-
offset += walker.currentNode.length
|
44
|
-
else
|
45
|
-
break
|
46
|
-
|
47
|
-
offset
|
48
|
-
|
49
|
-
HTMLOListElement::offset = HTMLUListElement::offset = (node, walker) ->
|
50
|
-
offset = 0
|
51
|
-
li = this.firstElementChild
|
52
|
-
|
53
|
-
while walker.nextNode()
|
54
|
-
if !li.contains(walker.currentNode)
|
55
|
-
newList = walker.currentNode
|
56
|
-
while newList? && !(newList instanceof HTMLLIElement)
|
57
|
-
newList = newList.parentElement
|
58
|
-
li = newList
|
59
|
-
offset++
|
60
|
-
|
61
|
-
if walker.currentNode != node
|
62
|
-
offset += walker.currentNode.length
|
63
|
-
else
|
64
|
-
break
|
65
|
-
|
66
|
-
offset
|
67
|
-
|
68
|
-
HTMLElement::getRange = (offset, walker) ->
|
69
|
-
range = document.createRange()
|
70
|
-
|
71
|
-
if !@firstChild?
|
72
|
-
range.setStart(this, 0)
|
73
|
-
else
|
74
|
-
while walker.nextNode()
|
75
|
-
if walker.currentNode.length < offset
|
76
|
-
offset -= walker.currentNode.length
|
77
|
-
continue
|
78
|
-
|
79
|
-
range.setStart(walker.currentNode, offset)
|
80
|
-
break
|
81
|
-
|
82
|
-
range.collapse(true)
|
83
|
-
range
|
84
|
-
|
85
|
-
|
86
|
-
HTMLOListElement::getRange = HTMLUListElement::getRange = (offset, walker) ->
|
87
|
-
range = document.createRange()
|
88
|
-
if !@firstChild?
|
89
|
-
range.setStart(this, 0)
|
90
|
-
return
|
91
|
-
|
92
|
-
li = this.firstElementChild
|
93
|
-
|
94
|
-
while walker.nextNode()
|
95
|
-
if !li.contains(walker.currentNode)
|
96
|
-
newList = walker.currentNode
|
97
|
-
while newList? && !(newList instanceof HTMLLIElement)
|
98
|
-
newList = newList.parentElement
|
99
|
-
li = newList
|
100
|
-
offset--
|
101
|
-
|
102
|
-
if walker.currentNode.length < offset
|
103
|
-
offset -= walker.currentNode.length
|
104
|
-
continue
|
105
|
-
range.setStart(walker.currentNode, offset)
|
106
|
-
break
|
107
|
-
|
108
|
-
range.collapse(true)
|
109
|
-
range
|
data/lib/written/document.rb
DELETED
@@ -1,42 +0,0 @@
|
|
1
|
-
require 'written/parsers'
|
2
|
-
require 'written/node'
|
3
|
-
|
4
|
-
module Written
|
5
|
-
class Document
|
6
|
-
|
7
|
-
attr_reader :nodes
|
8
|
-
|
9
|
-
def initialize(content)
|
10
|
-
@nodes = content.lines.map do |text|
|
11
|
-
Node.new(text.chomp)
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
def parsers
|
16
|
-
[
|
17
|
-
Written::Parsers::Code,
|
18
|
-
Written::Parsers::Heading,
|
19
|
-
Written::Parsers::Image,
|
20
|
-
Written::Parsers::List,
|
21
|
-
Written::Parsers::Word,
|
22
|
-
Written::Parsers::Link
|
23
|
-
]
|
24
|
-
end
|
25
|
-
|
26
|
-
def parse!
|
27
|
-
parsers.each do |parser|
|
28
|
-
parser.parse!(self)
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
def to_html
|
33
|
-
@nodes.map do |node|
|
34
|
-
if node.instance_of?(Written::Node)
|
35
|
-
"<p>#{node.to_s}</p>"
|
36
|
-
else
|
37
|
-
node.to_s
|
38
|
-
end
|
39
|
-
end.join
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
data/lib/written/node.rb
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
module Written
|
2
|
-
module Nodes
|
3
|
-
autoload :Image, 'written/nodes/image'
|
4
|
-
autoload :UnorderedList, 'written/nodes/unordered_list'
|
5
|
-
autoload :OrderedList, 'written/nodes/ordered_list'
|
6
|
-
autoload :Code, 'written/nodes/code'
|
7
|
-
autoload :Heading, 'written/nodes/heading'
|
8
|
-
end
|
9
|
-
|
10
|
-
class Node
|
11
|
-
attr_accessor :content
|
12
|
-
|
13
|
-
def initialize(content)
|
14
|
-
@content = content || String.new
|
15
|
-
end
|
16
|
-
|
17
|
-
def to_s
|
18
|
-
@content
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
data/lib/written/nodes/code.rb
DELETED
@@ -1,65 +0,0 @@
|
|
1
|
-
require 'cgi'
|
2
|
-
|
3
|
-
module Written
|
4
|
-
module Nodes
|
5
|
-
class Code < Node
|
6
|
-
|
7
|
-
attr_reader :offset
|
8
|
-
|
9
|
-
attr_accessor :title, :block
|
10
|
-
|
11
|
-
def initialize(data)
|
12
|
-
|
13
|
-
@offset = data.offset(0)[0]
|
14
|
-
@language = (data[3] || "").strip
|
15
|
-
@block = nil
|
16
|
-
@title = nil
|
17
|
-
|
18
|
-
@content = data[4]
|
19
|
-
|
20
|
-
end
|
21
|
-
|
22
|
-
def block?
|
23
|
-
@block == true
|
24
|
-
end
|
25
|
-
|
26
|
-
def content=(new_content)
|
27
|
-
if new_content.is_a?(Array)
|
28
|
-
@content = CGI::escapeHTML(new_content.join("\n"))
|
29
|
-
else
|
30
|
-
@content = new_content
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
def code_element
|
35
|
-
str = "<code"
|
36
|
-
|
37
|
-
unless @language.nil?
|
38
|
-
str << " class='language-#{@language}'>"
|
39
|
-
end
|
40
|
-
|
41
|
-
str << @content
|
42
|
-
str << "</code>"
|
43
|
-
str
|
44
|
-
end
|
45
|
-
|
46
|
-
def to_s
|
47
|
-
|
48
|
-
str = String.new
|
49
|
-
|
50
|
-
unless @title.nil?
|
51
|
-
str << "<header>#{@title}</header>"
|
52
|
-
end
|
53
|
-
|
54
|
-
str << code_element
|
55
|
-
|
56
|
-
if block?
|
57
|
-
return "<pre>#{str}</pre>"
|
58
|
-
else
|
59
|
-
return str
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
data/lib/written/nodes/image.rb
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
module Written
|
2
|
-
module Nodes
|
3
|
-
class OrderedList < Node
|
4
|
-
|
5
|
-
def initialize(text)
|
6
|
-
@content = "<li>#{text}</li>"
|
7
|
-
end
|
8
|
-
|
9
|
-
def append(text)
|
10
|
-
@content << "<li>#{text}</li>"
|
11
|
-
end
|
12
|
-
|
13
|
-
def to_s
|
14
|
-
"<ol>#{@content}</ol>"
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
@@ -1,19 +0,0 @@
|
|
1
|
-
module Written
|
2
|
-
module Nodes
|
3
|
-
class UnorderedList < Node
|
4
|
-
|
5
|
-
def initialize(text)
|
6
|
-
@content = "<li>#{text}</li>"
|
7
|
-
end
|
8
|
-
|
9
|
-
def append(text)
|
10
|
-
@content << "<li>#{text}</li>"
|
11
|
-
end
|
12
|
-
|
13
|
-
def to_s
|
14
|
-
"<ul>#{@content}</ul>"
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
data/lib/written/parsers.rb
DELETED
@@ -1,11 +0,0 @@
|
|
1
|
-
module Written
|
2
|
-
module Parsers
|
3
|
-
autoload :Base, 'written/parsers/base'
|
4
|
-
autoload :Word, 'written/parsers/word'
|
5
|
-
autoload :List, 'written/parsers/list'
|
6
|
-
autoload :Image, 'written/parsers/image'
|
7
|
-
autoload :Code, 'written/parsers/code'
|
8
|
-
autoload :Heading, 'written/parsers/heading'
|
9
|
-
autoload :Link, 'written/parsers/link'
|
10
|
-
end
|
11
|
-
end
|