written 0.2.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
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
-