redcloth-rails 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +11 -0
- data/CHANGELOG.textile +7 -0
- data/app/assets/javascripts/textile-editor.js.coffee +52 -58
- data/lib/redcloth-rails/version.rb +1 -1
- metadata +6 -4
data/.gitignore
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
# See http://help.github.com/ignore-files/ for more about ignoring files.
|
2
|
+
#
|
3
|
+
# If you find yourself ignoring temporary files generated by your text editor
|
4
|
+
# or operating system, you probably want to add a global ignore instead:
|
5
|
+
# git config --global core.excludesfile ~/.gitignore_global
|
6
|
+
|
7
|
+
# Ignore bundler config
|
8
|
+
/.bundle
|
9
|
+
|
10
|
+
# Ignore all gem builds
|
11
|
+
*.gem
|
data/CHANGELOG.textile
ADDED
@@ -22,7 +22,7 @@
|
|
22
22
|
# - doesn't need to be in the body onload tag
|
23
23
|
# - can supply your own, custom IDs for the editor to be drawn around
|
24
24
|
#
|
25
|
-
#
|
25
|
+
# TODO:
|
26
26
|
# - a clean way of providing image and link inserts
|
27
27
|
# - get the selection to properly show in IE
|
28
28
|
#
|
@@ -43,7 +43,6 @@ class TextileEditorButton
|
|
43
43
|
@sve = sve # sve = simple vs. extended. add an 's' to make it show up in the simple toolbar
|
44
44
|
@open = open # set to -1 if tag does not need to be closed
|
45
45
|
@standard = true # this is a standard button
|
46
|
-
# this.framework = 'prototype'; // the JS framework used
|
47
46
|
|
48
47
|
window.TextileEditorButton = TextileEditorButton
|
49
48
|
|
@@ -52,7 +51,7 @@ class TextileEditorButtonSeparator
|
|
52
51
|
|
53
52
|
constructor: (sve) ->
|
54
53
|
@separator = true
|
55
|
-
@sve
|
54
|
+
@sve = sve
|
56
55
|
|
57
56
|
window.TextileEditorButtonSeparator = TextileEditorButtonSeparator
|
58
57
|
|
@@ -68,20 +67,19 @@ class TextileEditor
|
|
68
67
|
TextileEditor.buttons || new Array()
|
69
68
|
|
70
69
|
constructor: (canvas, view) ->
|
71
|
-
|
72
|
-
toolbar
|
73
|
-
toolbar.id = "textile-toolbar-" + canvas
|
70
|
+
toolbar = document.createElement("div")
|
71
|
+
toolbar.id = "textile-toolbar-" + canvas
|
74
72
|
toolbar.className = "textile-toolbar"
|
73
|
+
|
75
74
|
@canvas = document.getElementById(canvas)
|
76
|
-
@canvas.parentNode.insertBefore
|
75
|
+
@canvas.parentNode.insertBefore(toolbar, @canvas)
|
77
76
|
@openTags = new Array()
|
78
77
|
|
79
78
|
# Create the local Button array by assigning theButtons array to edButtons
|
80
|
-
edButtons
|
81
|
-
edButtons = TextileEditor.getButtons()
|
79
|
+
edButtons = TextileEditor.getButtons()
|
82
80
|
standardButtons = new Array()
|
83
|
-
i = 0
|
84
81
|
|
82
|
+
i = 0
|
85
83
|
while i < edButtons.length
|
86
84
|
thisButton = @prepareButton(edButtons[i])
|
87
85
|
if view is "s"
|
@@ -95,72 +93,73 @@ class TextileEditor
|
|
95
93
|
toolbar.appendChild thisButton
|
96
94
|
standardButtons.push thisButton
|
97
95
|
i++
|
98
|
-
|
96
|
+
|
99
97
|
te = this
|
100
98
|
buttons = toolbar.getElementsByTagName("button")
|
101
|
-
i = 0
|
102
99
|
|
100
|
+
i = 0
|
103
101
|
while i < buttons.length
|
104
|
-
|
105
|
-
#$A(toolbar.getElementsByTagName('button')).each(function(button) {
|
106
102
|
unless buttons[i].onclick
|
107
103
|
buttons[i].onclick = ->
|
108
104
|
te.insertTag this
|
109
|
-
false
|
110
|
-
|
111
|
-
buttons[i].tagStart
|
112
|
-
buttons[i].tagEnd
|
113
|
-
buttons[i].open
|
105
|
+
return false
|
106
|
+
|
107
|
+
buttons[i].tagStart = buttons[i].getAttribute("tagStart")
|
108
|
+
buttons[i].tagEnd = buttons[i].getAttribute("tagEnd")
|
109
|
+
buttons[i].open = buttons[i].getAttribute("open")
|
114
110
|
buttons[i].textile_editor = te
|
115
|
-
buttons[i].canvas
|
111
|
+
buttons[i].canvas = te.canvas
|
116
112
|
i++
|
117
113
|
|
118
114
|
# draw individual buttons (edShowButton)
|
119
115
|
prepareButton: (button) ->
|
120
116
|
if button.separator
|
121
|
-
theButton
|
117
|
+
theButton = document.createElement("span")
|
122
118
|
theButton.className = "ed_sep"
|
123
119
|
return theButton
|
120
|
+
|
124
121
|
if button.standard
|
125
|
-
theButton
|
122
|
+
theButton = document.createElement("button")
|
126
123
|
theButton.id = button.id
|
127
|
-
theButton.setAttribute
|
128
|
-
theButton.setAttribute
|
129
|
-
theButton.setAttribute
|
130
|
-
theButton.setAttribute
|
131
|
-
|
124
|
+
theButton.setAttribute("class", "standard")
|
125
|
+
theButton.setAttribute("tagStart", button.tagStart)
|
126
|
+
theButton.setAttribute("tagEnd", button.tagEnd)
|
127
|
+
theButton.setAttribute("open", button.open)
|
128
|
+
|
129
|
+
img = document.createElement("img")
|
132
130
|
img.src = button.display
|
133
|
-
theButton.appendChild
|
131
|
+
theButton.appendChild(img)
|
134
132
|
else
|
135
133
|
return button
|
136
|
-
|
134
|
+
|
137
135
|
theButton.accessKey = button.access
|
138
|
-
theButton.title
|
139
|
-
theButton
|
136
|
+
theButton.title = button.title
|
137
|
+
return theButton
|
140
138
|
|
141
139
|
# if clicked, no selected text, tag not open highlight button
|
142
140
|
# (edAddTag)
|
143
141
|
addTag: (button) ->
|
144
142
|
unless button.tagEnd is ""
|
145
143
|
@openTags[@openTags.length] = button
|
146
|
-
|
147
|
-
#var el = document.getElementById(button.id);
|
148
|
-
#el.className = 'selected';
|
149
144
|
button.className = "selected"
|
150
145
|
|
146
|
+
return button
|
147
|
+
|
151
148
|
# if clicked, no selected text, tag open lowlight button
|
152
149
|
# (edRemoveTag)
|
153
150
|
removeTag: (button) ->
|
154
151
|
i = 0
|
155
152
|
while i < @openTags.length
|
156
153
|
if @openTags[i] is button
|
157
|
-
@openTags.splice
|
154
|
+
@openTags.splice(button, 1)
|
158
155
|
|
159
156
|
#var el = document.getElementById(button.id);
|
160
157
|
#el.className = 'unselected';
|
161
158
|
button.className = "unselected"
|
162
159
|
i++
|
163
160
|
|
161
|
+
return undefined
|
162
|
+
|
164
163
|
# see if there are open tags. for the remove tag bit...
|
165
164
|
# (edCheckOpenTags)
|
166
165
|
checkOpenTags: (button) ->
|
@@ -169,16 +168,12 @@ class TextileEditor
|
|
169
168
|
while i < @openTags.length
|
170
169
|
tag++ if @openTags[i] is button
|
171
170
|
i++
|
172
|
-
|
173
|
-
|
174
|
-
else
|
175
|
-
false # tag not found
|
171
|
+
|
172
|
+
return (tag > 0) # tag found / not found
|
176
173
|
|
177
174
|
# insert the tag. this is the bulk of the code.
|
178
175
|
# (edInsertTag)
|
179
176
|
insertTag: (button, tagStart, tagEnd) ->
|
180
|
-
|
181
|
-
#console.log(button);
|
182
177
|
myField = button.canvas
|
183
178
|
myField.focus()
|
184
179
|
if tagStart
|
@@ -204,8 +199,7 @@ class TextileEditor
|
|
204
199
|
newlineReplaceRegexClean = /\r\n\s\n/g
|
205
200
|
newlineReplaceRegexDirty = "\\r\\n\\s\\n"
|
206
201
|
newlineReplaceClean = "\r\n\n"
|
207
|
-
else if myField.selectionStart or myField.selectionStart
|
208
|
-
|
202
|
+
else if myField.selectionStart or myField.selectionStart == 0 or myField.selectionStart == '0' # MOZ/FF/NS/S support
|
209
203
|
# figure out cursor and selection positions
|
210
204
|
startPos = myField.selectionStart
|
211
205
|
endPos = myField.selectionEnd
|
@@ -299,19 +293,20 @@ class TextileEditor
|
|
299
293
|
|
300
294
|
# now lets look and see if the user is trying to muck with a block or block modifier
|
301
295
|
else if button.tagStart.match(/^(h1|h2|h3|h4|h5|h6|bq|p|\>|\<\>|\<|\=|\(|\))/g)
|
302
|
-
insertTag
|
303
|
-
insertModifier
|
304
|
-
tagPartBlock
|
305
|
-
tagPartModifier
|
296
|
+
insertTag = ""
|
297
|
+
insertModifier = ""
|
298
|
+
tagPartBlock = ""
|
299
|
+
tagPartModifier = ""
|
306
300
|
tagPartModifierOrig = "" # ugly hack but it's late
|
307
|
-
drawSwitch
|
308
|
-
captureIndentStart
|
309
|
-
captureListStart
|
310
|
-
periodAddition
|
301
|
+
drawSwitch = ""
|
302
|
+
captureIndentStart = false
|
303
|
+
captureListStart = false
|
304
|
+
periodAddition = "\\. "
|
311
305
|
periodAdditionClean = ". "
|
312
|
-
listItemsAddition
|
313
|
-
re_list_items
|
314
|
-
re_block_modifier
|
306
|
+
listItemsAddition = 0
|
307
|
+
re_list_items = new RegExp("(\\*+|\\#+)", "g") # need this regex later on when checking indentation of lists
|
308
|
+
re_block_modifier = new RegExp("^(h1|h2|h3|h4|h5|h6|bq|p| [\\*]{1,} | [\\#]{1,} |)(\\>|\\<\\>|\\<|\\=|[\\(]{1,}|[\\)]{1,6}|)", "g")
|
309
|
+
|
315
310
|
if tagPartMatches = re_block_modifier.exec(selectedText)
|
316
311
|
tagPartBlock = tagPartMatches[1]
|
317
312
|
tagPartModifier = tagPartMatches[2]
|
@@ -503,19 +498,18 @@ class TextileEditor
|
|
503
498
|
|
504
499
|
# set the appropriate DOM value with the final text
|
505
500
|
if FF is true
|
506
|
-
myField.value
|
501
|
+
myField.value = finalText
|
507
502
|
myField.scrollTop = scrollTop
|
508
503
|
else
|
509
504
|
sel.text = finalText
|
510
505
|
|
511
|
-
# build up the selection capture, doesn't work in IE
|
512
506
|
if textSelected
|
507
|
+
# build up the selection capture, doesn't work in IE
|
513
508
|
myField.selectionStart = startPos + newlineStartPos
|
514
509
|
myField.selectionEnd = endPos + posDiffPos - posDiffNeg - newlineEndPos
|
515
510
|
|
516
|
-
#alert('s: ' + myField.selectionStart + ' e: ' + myField.selectionEnd + ' sp: ' + startPos + ' ep: ' + endPos + ' pdp: ' + posDiffPos + ' pdn: ' + posDiffNeg)
|
517
511
|
else
|
518
512
|
myField.selectionStart = cursorPos
|
519
|
-
myField.selectionEnd
|
513
|
+
myField.selectionEnd = cursorPos
|
520
514
|
|
521
515
|
window.TextileEditor = TextileEditor
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: redcloth-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 25
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 1
|
9
|
-
-
|
10
|
-
version: 0.1.
|
9
|
+
- 1
|
10
|
+
version: 0.1.1
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- emjot
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2013-03-
|
18
|
+
date: 2013-03-08 00:00:00 +01:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -60,6 +60,8 @@ extensions: []
|
|
60
60
|
extra_rdoc_files: []
|
61
61
|
|
62
62
|
files:
|
63
|
+
- .gitignore
|
64
|
+
- CHANGELOG.textile
|
63
65
|
- Gemfile
|
64
66
|
- LICENSE
|
65
67
|
- README.textile
|