written 0.0.2
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 +7 -0
- data/.gitignore +3 -0
- data/Gemfile +15 -0
- data/Gemfile.lock +128 -0
- data/Rakefile +83 -0
- data/lib/written/app/assets/javascripts/vendors/prism.js +1411 -0
- data/lib/written/app/assets/javascripts/written/core/content.coffee +106 -0
- data/lib/written/app/assets/javascripts/written/core/cursor.coffee +59 -0
- data/lib/written/app/assets/javascripts/written/core/document.coffee +19 -0
- data/lib/written/app/assets/javascripts/written/core/ext.coffee +109 -0
- data/lib/written/app/assets/javascripts/written/core/extensions.coffee +2 -0
- data/lib/written/app/assets/javascripts/written/core/history.coffee +16 -0
- data/lib/written/app/assets/javascripts/written/core/observer.coffee +29 -0
- data/lib/written/app/assets/javascripts/written/extensions/clipboard.coffee +114 -0
- data/lib/written/app/assets/javascripts/written/extensions/image.coffee +91 -0
- data/lib/written/app/assets/javascripts/written/parsers/block/code.coffee +25 -0
- data/lib/written/app/assets/javascripts/written/parsers/block/heading.coffee +10 -0
- data/lib/written/app/assets/javascripts/written/parsers/block/image.coffee +18 -0
- data/lib/written/app/assets/javascripts/written/parsers/block/olist.coffee +18 -0
- data/lib/written/app/assets/javascripts/written/parsers/block/paragraph.coffee +10 -0
- data/lib/written/app/assets/javascripts/written/parsers/block/ulist.coffee +17 -0
- data/lib/written/app/assets/javascripts/written/parsers/inline/italic.coffee +13 -0
- data/lib/written/app/assets/javascripts/written/parsers/inline/link.coffee +16 -0
- data/lib/written/app/assets/javascripts/written/parsers/inline/strong.coffee +12 -0
- data/lib/written/app/assets/javascripts/written/parsers/parsers.coffee +98 -0
- data/lib/written/app/assets/javascripts/written.coffee +4 -0
- data/lib/written/app/assets/stylesheets/vendors/prism.css +138 -0
- data/lib/written/app/assets/stylesheets/written.scss +21 -0
- data/lib/written/document.rb +42 -0
- data/lib/written/node.rb +21 -0
- data/lib/written/nodes/code.rb +65 -0
- data/lib/written/nodes/heading.rb +15 -0
- data/lib/written/nodes/image.rb +14 -0
- data/lib/written/nodes/ordered_list.rb +18 -0
- data/lib/written/nodes/unordered_list.rb +19 -0
- data/lib/written/parsers/base.rb +26 -0
- data/lib/written/parsers/code.rb +60 -0
- data/lib/written/parsers/heading.rb +19 -0
- data/lib/written/parsers/image.rb +19 -0
- data/lib/written/parsers/link.rb +12 -0
- data/lib/written/parsers/list.rb +33 -0
- data/lib/written/parsers/word.rb +16 -0
- data/lib/written/parsers.rb +11 -0
- data/lib/written/railtie.rb +20 -0
- data/lib/written/version.rb +3 -0
- data/lib/written.rb +14 -0
- data/test/javascript/assertions/assert.coffee +3 -0
- data/test/javascript/polyfills/HTMLULListElement.coffee +0 -0
- data/test/javascript/polyfills/Text.coffee +0 -0
- data/test/javascript/polyfills.coffee +2 -0
- data/test/javascript/runner.coffee +46 -0
- data/test/javascript/tests/initialization.coffee +16 -0
- data/test/javascript/tests/parsing.coffee +9 -0
- data/test/ruby/blank_test.rb +83 -0
- data/test/server/app/assets/javascripts/application.coffee +3 -0
- data/test/server/app/assets/stylesheets/application.scss +10 -0
- data/test/server/app/controllers/application_controller.rb +2 -0
- data/test/server/app/controllers/posts_controller.rb +4 -0
- data/test/server/app/views/layouts/application.html.erb +14 -0
- data/test/server/app/views/posts/show.html.erb +14 -0
- data/test/server/application.rb +12 -0
- data/test/server/config.ru +5 -0
- data/test/server/log/test.log +570 -0
- data/written.gemspec +17 -0
- metadata +106 -0
@@ -0,0 +1,20 @@
|
|
1
|
+
module Written
|
2
|
+
class Railtie < ::Rails::Railtie
|
3
|
+
initializer 'written.assets' do |app|
|
4
|
+
app.config.assets.paths.unshift(*paths["app/assets"].existent_directories)
|
5
|
+
end
|
6
|
+
|
7
|
+
def paths
|
8
|
+
@paths ||= begin
|
9
|
+
paths = Rails::Paths::Root.new(root)
|
10
|
+
paths.add 'app/assets', glob: '*'
|
11
|
+
paths
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def root
|
16
|
+
File.dirname(__FILE__)
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
data/lib/written.rb
ADDED
File without changes
|
File without changes
|
@@ -0,0 +1,46 @@
|
|
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)
|
@@ -0,0 +1,16 @@
|
|
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
|
@@ -0,0 +1,83 @@
|
|
1
|
+
require 'blank'
|
2
|
+
|
3
|
+
require 'minitest/autorun'
|
4
|
+
|
5
|
+
class MarkdownTest < Minitest::Test
|
6
|
+
|
7
|
+
def test_paragraph
|
8
|
+
document = Blank.parse("Hello world!\nThis is nice.")
|
9
|
+
assert_equal '<p>Hello world!</p><p>This is nice.</p>', document.to_html
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_header
|
13
|
+
document = Blank.parse('# test')
|
14
|
+
assert_equal "<h1>test</h1>", document.to_html
|
15
|
+
|
16
|
+
document = Blank.parse('## test and *some*')
|
17
|
+
assert_equal "<h2>test and <em>some</em></h2>", document.to_html
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_italic
|
21
|
+
document = Blank.parse('*test*')
|
22
|
+
assert_equal "<p><em>test</em></p>", document.to_html
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_bold
|
26
|
+
document = Blank.parse('**test**')
|
27
|
+
assert_equal "<p><strong>test</strong></p>", document.to_html
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_bold_and_italic
|
31
|
+
document = Blank.parse('***bold and italic***')
|
32
|
+
assert_equal "<p><em><strong>bold and italic</strong></em></p>", document.to_html
|
33
|
+
|
34
|
+
document = Blank.parse('**bold** and *italic*')
|
35
|
+
assert_equal "<p><strong>bold</strong> and <em>italic</em></p>", document.to_html
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_code_inline
|
39
|
+
document = Blank.parse("This is a ~~~ruby inline code~~~ snippet")
|
40
|
+
assert_equal "<p>This is a <code class='language-ruby'>inline code</code> snippet</p>", document.to_html
|
41
|
+
|
42
|
+
document = Blank.parse("This is a ~~~ruby inline code~~~ snippet. Multiple ~~~ruby instance~~~ can coexist on the same line")
|
43
|
+
assert_equal "<p>This is a <code class='language-ruby'>inline code</code> snippet. Multiple <code class='language-ruby'>instance</code> can coexist on the same line</p>", document.to_html
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_code_blocks
|
47
|
+
document = Blank.parse("~~~ruby\n# A comment\nRails.application\n~~~")
|
48
|
+
assert_equal "<pre><header></header><code class='language-ruby'># A comment\nRails.application</code></pre>", document.to_html
|
49
|
+
|
50
|
+
document = Blank.parse("~~~ruby a title\n# A comment\nRails.application\n~~~")
|
51
|
+
assert_equal "<pre><header>a title</header><code class='language-ruby'># A comment\nRails.application</code></pre>", document.to_html
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_unordered_list
|
55
|
+
document = Blank.parse("- ruby\n- Go")
|
56
|
+
assert_equal '<ul><li>ruby</li><li>Go</li></ul>', document.to_html
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_ordered_list
|
60
|
+
document = Blank.parse("1. Ruby\n2. **Go**")
|
61
|
+
assert_equal '<ol><li>Ruby</li><li><strong>Go</strong></li></ol>', document.to_html
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_lists
|
65
|
+
document = Blank.parse("1. Ruby\n2. **Go**\n- Test\n- 123")
|
66
|
+
assert_equal '<ol><li>Ruby</li><li><strong>Go</strong></li></ol><ul><li>Test</li><li>123</li></ul>', document.to_html
|
67
|
+
end
|
68
|
+
|
69
|
+
def test_lists_with_links
|
70
|
+
document = Blank.parse("1. [Ruby](http://ruby.com)\n")
|
71
|
+
assert_equal "<ol><li><a href='http://ruby.com'>Ruby</a></li></ol>", document.to_html
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_image
|
75
|
+
document = Blank.parse('')
|
76
|
+
assert_equal "<figure><img src='http://bla.com' /><figcaption>An Image</figcaption></figure>", document.to_html
|
77
|
+
end
|
78
|
+
|
79
|
+
def test_link
|
80
|
+
document = Blank.parse('[A link](http://bla.com)')
|
81
|
+
assert_equal "<p><a href='http://bla.com'>A link</a></p>", document.to_html
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>Written Editor Test Application</title>
|
5
|
+
<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true %>
|
6
|
+
<%= csrf_meta_tags %>
|
7
|
+
</head>
|
8
|
+
|
9
|
+
<body>
|
10
|
+
<%= yield %>
|
11
|
+
<%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
|
12
|
+
</body>
|
13
|
+
</html>
|
14
|
+
|
@@ -0,0 +1,14 @@
|
|
1
|
+
<h1>Editor tests</h1>
|
2
|
+
<div id='Editor' contenteditable=true># Hello World!
|
3
|
+
1. this is a list
|
4
|
+
- this is **a** list
|
5
|
+
3. this is [a](http://google.com) *list*. It's special, isn't **it**?
|
6
|
+
test *boo* and them *some* or **some!!** a
|
7
|
+
|
8
|
+
|
9
|
+

|
10
|
+
|
11
|
+
~~~javascript
|
12
|
+
var test = "hello"
|
13
|
+
~~~
|
14
|
+
</div>
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module WrittenDevApplication
|
2
|
+
class Application < Rails::Application
|
3
|
+
config.eager_load = false
|
4
|
+
secrets.secret_key_base = "Something not so secret :)"
|
5
|
+
#config.logger = ActiveSupport::Logger.new('/dev/null')
|
6
|
+
config.assets.debug = true
|
7
|
+
|
8
|
+
if Rails.env.test?
|
9
|
+
paths['app/assets'] << '../browser'
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|