written 0.2.0 → 0.4.0

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.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/.babelrc +3 -0
  3. data/.gitignore +2 -0
  4. data/.ruby-version +1 -0
  5. data/README.md +18 -8
  6. data/Rakefile +1 -0
  7. data/compile-coffee.js +14 -0
  8. data/lib/written/app/assets/javascripts/written/attachments/image.coffee +4 -4
  9. data/lib/written/app/assets/javascripts/written/core/content.coffee +18 -29
  10. data/lib/written/app/assets/javascripts/written/core/cursor.coffee +8 -7
  11. data/lib/written/app/assets/javascripts/written/core/document.coffee +9 -8
  12. data/lib/written/app/assets/javascripts/written/core/{extensions/string.coffee → html.coffee} +3 -2
  13. data/lib/written/app/assets/javascripts/written/core/parsers.coffee +179 -0
  14. data/lib/written/app/assets/javascripts/written/parsers/block/code.coffee +11 -28
  15. data/lib/written/app/assets/javascripts/written/parsers/block/heading.coffee +37 -39
  16. data/lib/written/app/assets/javascripts/written/parsers/block/image.coffee +15 -39
  17. data/lib/written/app/assets/javascripts/written/parsers/block/olist.coffee +23 -20
  18. data/lib/written/app/assets/javascripts/written/parsers/block/paragraph.coffee +14 -34
  19. data/lib/written/app/assets/javascripts/written/parsers/block/quote.coffee +19 -38
  20. data/lib/written/app/assets/javascripts/written/parsers/block/ulist.coffee +20 -18
  21. data/lib/written/app/assets/javascripts/written/parsers/inline/bold.coffee +23 -0
  22. data/lib/written/app/assets/javascripts/written/parsers/inline/code.coffee +8 -27
  23. data/lib/written/app/assets/javascripts/written/parsers/inline/italic.coffee +8 -28
  24. data/lib/written/app/assets/javascripts/written/parsers/inline/link.coffee +8 -27
  25. data/lib/written/app/assets/stylesheets/written.scss +4 -0
  26. data/lib/written/version.rb +1 -1
  27. data/package.json +25 -0
  28. data/test/javascript/parsers/block/code.js +58 -0
  29. data/test/javascript/parsers/block/header.js +40 -0
  30. data/test/javascript/parsers/block/image.js +39 -0
  31. data/test/javascript/parsers/block/olist.js +41 -0
  32. data/test/javascript/parsers/block/paragraph.js +42 -0
  33. data/test/javascript/parsers/block/quote.js +41 -0
  34. data/test/javascript/parsers/block/ulist.js +40 -0
  35. data/test/javascript/parsers/inline/code.js +41 -0
  36. data/test/javascript/parsers/inline/italic.js +42 -0
  37. data/test/javascript/parsers/inline/link.js +42 -0
  38. data/test/javascript/parsers/inline/strong.js +41 -0
  39. data/test/server/app/assets/javascripts/application.coffee +8 -9
  40. data/test/server/app/assets/javascripts/secret.coffee +6 -0
  41. data/test/server/app/views/posts/show.html.erb +4 -4
  42. metadata +21 -12
  43. data/lib/written/app/assets/javascripts/written/parsers/inline/strong.coffee +0 -43
  44. data/lib/written/app/assets/javascripts/written/parsers/parsers.coffee +0 -95
  45. data/test/javascript/assertions/assert.coffee +0 -3
  46. data/test/javascript/polyfills.coffee +0 -2
  47. data/test/javascript/polyfills/HTMLULListElement.coffee +0 -0
  48. data/test/javascript/polyfills/Text.coffee +0 -0
  49. data/test/javascript/runner.coffee +0 -46
  50. data/test/javascript/tests/initialization.coffee +0 -16
  51. 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 *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
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 _image_ is worth a *thousand* words](image)
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.2.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-20 00:00:00.000000000 Z
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
- - test/javascript/assertions/assert.coffee
52
- - test/javascript/polyfills.coffee
53
- - test/javascript/polyfills/HTMLULListElement.coffee
54
- - test/javascript/polyfills/Text.coffee
55
- - test/javascript/runner.coffee
56
- - test/javascript/tests/initialization.coffee
57
- - test/javascript/tests/parsing.coffee
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
-
@@ -1,3 +0,0 @@
1
- Test.assertions.register 'assert', (result, message = "No message given") ->
2
- if result != true
3
- throw new AssertionException(message)
@@ -1,2 +0,0 @@
1
- #= require_self
2
- #= require_tree ./polyfills
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
@@ -1,9 +0,0 @@
1
- subject = new Test.Subject('parsing')
2
-
3
- subject.test 'parsing', (test) ->
4
- el = document.querySelector('#Editor')
5
- new Blank(el)
6
- el.innerHTML = '# Hello World!'
7
- console.log(el.innerHTML)
8
-
9
-