simple_form_markdown_editor 0.0.1
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 +2 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +126 -0
- data/README.md +111 -0
- data/Rakefile +1 -0
- data/app/controllers/simple_form_markdown_editor/previews_controller.rb +21 -0
- data/config/routes.rb +7 -0
- data/lib/assets/javascripts/simple_form_markdown_editor/simple_form_markdown_editor_buttons.js.coffee +135 -0
- data/lib/assets/javascripts/simple_form_markdown_editor/simple_form_markdown_editor_help.js.coffee +100 -0
- data/lib/assets/javascripts/simple_form_markdown_editor/simple_form_markdown_editor_tabs.js.coffee +84 -0
- data/lib/assets/javascripts/simple_form_markdown_editor.js +3 -0
- data/lib/assets/stylesheets/simple_form_markdown_editor/simple_form_markdown_editor.css.scss +275 -0
- data/lib/assets/stylesheets/simple_form_markdown_editor.css +3 -0
- data/lib/config/locales/simple_form_markdown_editor.en.yml +96 -0
- data/lib/simple_form_markdown_editor/configuration.rb +26 -0
- data/lib/simple_form_markdown_editor/engine.rb +4 -0
- data/lib/simple_form_markdown_editor/renderer.rb +50 -0
- data/lib/simple_form_markdown_editor/simple_form_markdown_editor.rb +183 -0
- data/lib/simple_form_markdown_editor/version.rb +3 -0
- data/lib/simple_form_markdown_editor.rb +21 -0
- data/simple_form_markdown_editor.gemspec +30 -0
- data/test/dummy/.gitignore +13 -0
- data/test/dummy/Gemfile +25 -0
- data/test/dummy/Gemfile.lock +195 -0
- data/test/dummy/README.rdoc +28 -0
- data/test/dummy/Rakefile +6 -0
- data/test/dummy/app/assets/images/.keep +0 -0
- data/test/dummy/app/assets/javascripts/application.js +4 -0
- data/test/dummy/app/assets/javascripts/editor_tests.coffee +3 -0
- data/test/dummy/app/assets/stylesheets/application.css +5 -0
- data/test/dummy/app/assets/stylesheets/editor_tests.scss +32 -0
- data/test/dummy/app/controllers/application_controller.rb +5 -0
- data/test/dummy/app/controllers/concerns/.keep +0 -0
- data/test/dummy/app/controllers/editor_tests_controller.rb +5 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/helpers/editor_tests_helper.rb +2 -0
- data/test/dummy/app/mailers/.keep +0 -0
- data/test/dummy/app/models/.keep +0 -0
- data/test/dummy/app/models/concerns/.keep +0 -0
- data/test/dummy/app/models/editor_test.rb +4 -0
- data/test/dummy/app/views/editor_tests/new.html.slim +2 -0
- data/test/dummy/app/views/layouts/application.html.erb +14 -0
- data/test/dummy/bin/bundle +3 -0
- data/test/dummy/bin/rails +8 -0
- data/test/dummy/bin/rake +8 -0
- data/test/dummy/bin/setup +29 -0
- data/test/dummy/bin/spring +15 -0
- data/test/dummy/config/application.rb +31 -0
- data/test/dummy/config/boot.rb +3 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +38 -0
- data/test/dummy/config/environments/production.rb +76 -0
- data/test/dummy/config/environments/test.rb +42 -0
- data/test/dummy/config/initializers/assets.rb +11 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
- data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/test/dummy/config/initializers/inflections.rb +16 -0
- data/test/dummy/config/initializers/mime_types.rb +4 -0
- data/test/dummy/config/initializers/session_store.rb +3 -0
- data/test/dummy/config/initializers/simple_form_markdown_editor.rb +5 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +9 -0
- data/test/dummy/config/locales/en.yml +23 -0
- data/test/dummy/config/routes.rb +5 -0
- data/test/dummy/config/secrets.yml +22 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/db/seeds.rb +7 -0
- data/test/dummy/lib/assets/.keep +0 -0
- data/test/dummy/lib/tasks/.keep +0 -0
- data/test/dummy/log/.keep +0 -0
- data/test/dummy/public/404.html +67 -0
- data/test/dummy/public/422.html +67 -0
- data/test/dummy/public/500.html +66 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/public/robots.txt +5 -0
- data/test/dummy/test/controllers/.keep +0 -0
- data/test/dummy/test/controllers/editor_tests_controller_test.rb +7 -0
- data/test/dummy/test/fixtures/.keep +0 -0
- data/test/dummy/test/fixtures/editor_tests.yml +7 -0
- data/test/dummy/test/helpers/.keep +0 -0
- data/test/dummy/test/integration/.keep +0 -0
- data/test/dummy/test/mailers/.keep +0 -0
- data/test/dummy/test/models/.keep +0 -0
- data/test/dummy/test/models/editor_test_test.rb +7 -0
- data/test/dummy/test/test_helper.rb +7 -0
- data/test/dummy/vendor/assets/javascripts/.keep +0 -0
- data/test/dummy/vendor/assets/stylesheets/.keep +0 -0
- metadata +297 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: c5c6a73ac5c7888296fde17f9ae33f400503c003
|
4
|
+
data.tar.gz: 9e5e6861ebc55abb6f60d3d4557fe8b5b4259b63
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: c0cba84a45c4023bc1e08287e1edabe4da75fd5c000d7c8793c0a89d7455ae9f2377bd9a51c844558f4bf877fbb6067e4838790424a99ef5c28884996a831c27
|
7
|
+
data.tar.gz: b237ae007a6f238bd28453532a2cf2544629fab7472e718b26e895248a1f440ccf0a808249d305f9dc712bb981f8e823b8f8105b0bc10948a69134bcb1d11796
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,126 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
simple_form_markdown_editor (0.0.1)
|
5
|
+
autoprefixer-rails
|
6
|
+
rails (>= 4.2)
|
7
|
+
redcarpet
|
8
|
+
responders (~> 2.0)
|
9
|
+
simple_form (>= 3.0.2)
|
10
|
+
|
11
|
+
GEM
|
12
|
+
remote: https://rubygems.org/
|
13
|
+
specs:
|
14
|
+
actionmailer (4.2.0)
|
15
|
+
actionpack (= 4.2.0)
|
16
|
+
actionview (= 4.2.0)
|
17
|
+
activejob (= 4.2.0)
|
18
|
+
mail (~> 2.5, >= 2.5.4)
|
19
|
+
rails-dom-testing (~> 1.0, >= 1.0.5)
|
20
|
+
actionpack (4.2.0)
|
21
|
+
actionview (= 4.2.0)
|
22
|
+
activesupport (= 4.2.0)
|
23
|
+
rack (~> 1.6.0)
|
24
|
+
rack-test (~> 0.6.2)
|
25
|
+
rails-dom-testing (~> 1.0, >= 1.0.5)
|
26
|
+
rails-html-sanitizer (~> 1.0, >= 1.0.1)
|
27
|
+
actionview (4.2.0)
|
28
|
+
activesupport (= 4.2.0)
|
29
|
+
builder (~> 3.1)
|
30
|
+
erubis (~> 2.7.0)
|
31
|
+
rails-dom-testing (~> 1.0, >= 1.0.5)
|
32
|
+
rails-html-sanitizer (~> 1.0, >= 1.0.1)
|
33
|
+
activejob (4.2.0)
|
34
|
+
activesupport (= 4.2.0)
|
35
|
+
globalid (>= 0.3.0)
|
36
|
+
activemodel (4.2.0)
|
37
|
+
activesupport (= 4.2.0)
|
38
|
+
builder (~> 3.1)
|
39
|
+
activerecord (4.2.0)
|
40
|
+
activemodel (= 4.2.0)
|
41
|
+
activesupport (= 4.2.0)
|
42
|
+
arel (~> 6.0)
|
43
|
+
activesupport (4.2.0)
|
44
|
+
i18n (~> 0.7)
|
45
|
+
json (~> 1.7, >= 1.7.7)
|
46
|
+
minitest (~> 5.1)
|
47
|
+
thread_safe (~> 0.3, >= 0.3.4)
|
48
|
+
tzinfo (~> 1.1)
|
49
|
+
arel (6.0.0)
|
50
|
+
autoprefixer-rails (5.1.7.1)
|
51
|
+
execjs
|
52
|
+
json
|
53
|
+
builder (3.2.2)
|
54
|
+
erubis (2.7.0)
|
55
|
+
execjs (2.4.0)
|
56
|
+
globalid (0.3.3)
|
57
|
+
activesupport (>= 4.1.0)
|
58
|
+
hike (1.2.3)
|
59
|
+
i18n (0.7.0)
|
60
|
+
json (1.8.2)
|
61
|
+
loofah (2.0.1)
|
62
|
+
nokogiri (>= 1.5.9)
|
63
|
+
mail (2.6.3)
|
64
|
+
mime-types (>= 1.16, < 3)
|
65
|
+
mime-types (2.4.3)
|
66
|
+
mini_portile (0.6.2)
|
67
|
+
minitest (5.5.1)
|
68
|
+
multi_json (1.11.0)
|
69
|
+
nokogiri (1.6.6.2)
|
70
|
+
mini_portile (~> 0.6.0)
|
71
|
+
rack (1.6.0)
|
72
|
+
rack-test (0.6.3)
|
73
|
+
rack (>= 1.0)
|
74
|
+
rails (4.2.0)
|
75
|
+
actionmailer (= 4.2.0)
|
76
|
+
actionpack (= 4.2.0)
|
77
|
+
actionview (= 4.2.0)
|
78
|
+
activejob (= 4.2.0)
|
79
|
+
activemodel (= 4.2.0)
|
80
|
+
activerecord (= 4.2.0)
|
81
|
+
activesupport (= 4.2.0)
|
82
|
+
bundler (>= 1.3.0, < 2.0)
|
83
|
+
railties (= 4.2.0)
|
84
|
+
sprockets-rails
|
85
|
+
rails-deprecated_sanitizer (1.0.3)
|
86
|
+
activesupport (>= 4.2.0.alpha)
|
87
|
+
rails-dom-testing (1.0.6)
|
88
|
+
activesupport (>= 4.2.0.beta, < 5.0)
|
89
|
+
nokogiri (~> 1.6.0)
|
90
|
+
rails-deprecated_sanitizer (>= 1.0.1)
|
91
|
+
rails-html-sanitizer (1.0.2)
|
92
|
+
loofah (~> 2.0)
|
93
|
+
railties (4.2.0)
|
94
|
+
actionpack (= 4.2.0)
|
95
|
+
activesupport (= 4.2.0)
|
96
|
+
rake (>= 0.8.7)
|
97
|
+
thor (>= 0.18.1, < 2.0)
|
98
|
+
rake (10.4.2)
|
99
|
+
redcarpet (3.2.2)
|
100
|
+
responders (2.1.0)
|
101
|
+
railties (>= 4.2.0, < 5)
|
102
|
+
simple_form (3.1.0)
|
103
|
+
actionpack (~> 4.0)
|
104
|
+
activemodel (~> 4.0)
|
105
|
+
sprockets (2.12.3)
|
106
|
+
hike (~> 1.2)
|
107
|
+
multi_json (~> 1.0)
|
108
|
+
rack (~> 1.0)
|
109
|
+
tilt (~> 1.1, != 1.3.0)
|
110
|
+
sprockets-rails (2.2.4)
|
111
|
+
actionpack (>= 3.0)
|
112
|
+
activesupport (>= 3.0)
|
113
|
+
sprockets (>= 2.8, < 4.0)
|
114
|
+
thor (0.19.1)
|
115
|
+
thread_safe (0.3.5)
|
116
|
+
tilt (1.4.1)
|
117
|
+
tzinfo (1.2.2)
|
118
|
+
thread_safe (~> 0.1)
|
119
|
+
|
120
|
+
PLATFORMS
|
121
|
+
ruby
|
122
|
+
|
123
|
+
DEPENDENCIES
|
124
|
+
bundler (~> 1.6)
|
125
|
+
rake
|
126
|
+
simple_form_markdown_editor!
|
data/README.md
ADDED
@@ -0,0 +1,111 @@
|
|
1
|
+
# SimpleForm Markdown Editor
|
2
|
+
|
3
|
+
A simple [Markdown](http://daringfireball.net/projects/markdown/) editor inspired by [gollum_editor](https://github.com/samknight/gollum_editor), the editor used for Github's wiki pages.
|
4
|
+
|
5
|
+
[Markdown](http://daringfireball.net/projects/markdown/) rendering is handled by [Redcarpet](https://github.com/vmg/redcarpet).
|
6
|
+
|
7
|
+
## Installation
|
8
|
+
|
9
|
+
Add this line to your application's Gemfile:
|
10
|
+
|
11
|
+
gem 'simple_form_markdown_editor'
|
12
|
+
|
13
|
+
And then execute:
|
14
|
+
|
15
|
+
$ bundle
|
16
|
+
|
17
|
+
Or install it yourself as:
|
18
|
+
|
19
|
+
$ gem install simple_form_markdown_editor
|
20
|
+
|
21
|
+
## Usage
|
22
|
+
|
23
|
+
Require the javascripts in `application.js`:
|
24
|
+
|
25
|
+
//= require simple_form_markdown_editor
|
26
|
+
|
27
|
+
And require the stylesheets in `application.css`:
|
28
|
+
|
29
|
+
*= require simple_form_markdown_editor
|
30
|
+
|
31
|
+
Finally mount the engine in your routes:
|
32
|
+
|
33
|
+
mount SimpleFormMarkdownEditor::Engine => "/"
|
34
|
+
|
35
|
+
Use in forms:
|
36
|
+
|
37
|
+
= form.input :markdown, as: :markdown_editor
|
38
|
+
|
39
|
+
## Configuration
|
40
|
+
|
41
|
+
Configuration is possible app-wide (using an initializer) and per input.
|
42
|
+
|
43
|
+
Refer to [redcarpet](https://github.com/vmg/redcarpet) for a list of available [extensions](https://github.com/vmg/redcarpet#and-its-like-really-simple-to-use) and [render](https://github.com/vmg/redcarpet#darling-i-packed-you-a-couple-renderers-for-lunch) options.
|
44
|
+
|
45
|
+
### Global
|
46
|
+
|
47
|
+
```ruby
|
48
|
+
# config/initializers/simple_form_markdown_editor.rb
|
49
|
+
|
50
|
+
SimpleFormMarkdownEditor::MarkdownEditor.configure do |c|
|
51
|
+
c.buttons = [ %w(h1 h2 h3), %w(strong em), %w(a img) ]
|
52
|
+
c.help = { enabled: true, visible: false }
|
53
|
+
c.extensions = {
|
54
|
+
footnotes: true,
|
55
|
+
smartypants: true,
|
56
|
+
lax_spacing: true,
|
57
|
+
escape_html: false
|
58
|
+
}
|
59
|
+
c.render_options = {
|
60
|
+
:no_images,
|
61
|
+
:no_links
|
62
|
+
}
|
63
|
+
end
|
64
|
+
```
|
65
|
+
|
66
|
+
### Input
|
67
|
+
|
68
|
+
```ruby
|
69
|
+
= f.input :markdown, as: :markdown_editor, help: { enabled: true, visible: false }, buttons: [ %w(h1 h2), %w(a img) ]
|
70
|
+
```
|
71
|
+
|
72
|
+
## Internationalization
|
73
|
+
|
74
|
+
All strings (buttons, help etc.) are defined in a `I18n` `YAML` file along with buttons and tabs. This can easily be overridden and extended to other languages:
|
75
|
+
|
76
|
+
```YAML
|
77
|
+
# simple_form_markdown_editor.en.yml
|
78
|
+
|
79
|
+
en:
|
80
|
+
simple_form_markdown_editor:
|
81
|
+
tabs:
|
82
|
+
edit: Write
|
83
|
+
preview: Sneak peek
|
84
|
+
buttons:
|
85
|
+
h1: Header 1
|
86
|
+
h2: Header 2
|
87
|
+
h3: Header 3
|
88
|
+
a: Link
|
89
|
+
img: Image
|
90
|
+
help:
|
91
|
+
block_elements:
|
92
|
+
title: Blocks
|
93
|
+
elements:
|
94
|
+
headers:
|
95
|
+
title: # Headers
|
96
|
+
text: A very good explanation
|
97
|
+
```
|
98
|
+
|
99
|
+
|
100
|
+
## Testing
|
101
|
+
|
102
|
+
The gem includes a rails app for easy testing, simply `cd test/dummy`, `bundle install` and `bundle exec bin/rails s`, then direct your browser to `127.0.0.1:3000` to see the editor in action.
|
103
|
+
|
104
|
+
## Todo
|
105
|
+
|
106
|
+
* How to make it possible to plug in other render engines?
|
107
|
+
* How to implement "custom Markdown" (basic gsub)?
|
108
|
+
* Highlighting trailing spaces (for linebreaks)?
|
109
|
+
* Implement keyboard shortcuts
|
110
|
+
* Implement Ctrl+z
|
111
|
+
* Implement install task (create YML and config)?
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'responders'
|
2
|
+
|
3
|
+
module SimpleFormMarkdownEditor
|
4
|
+
class PreviewsController < ActionController::Base
|
5
|
+
|
6
|
+
respond_to :html
|
7
|
+
|
8
|
+
def preview
|
9
|
+
respond_to do |format|
|
10
|
+
format.html { render text: SimpleFormMarkdownEditor::Renderer.call(preview_params) }
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
private # =============================================================
|
15
|
+
|
16
|
+
def preview_params
|
17
|
+
params.require(:text)
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
data/config/routes.rb
ADDED
@@ -0,0 +1,135 @@
|
|
1
|
+
# https://github.com/jquery-boilerplate/jquery-boilerplate/
|
2
|
+
do ($ = jQuery, window, document) ->
|
3
|
+
|
4
|
+
pluginName = 'simple_form_markdown_editor_buttons'
|
5
|
+
defaults =
|
6
|
+
debug: false
|
7
|
+
definitions:
|
8
|
+
'strong': '**%{str}**'
|
9
|
+
'em': '*%{str}*'
|
10
|
+
'code': '`%{str}`'
|
11
|
+
'hr': '%{str}***'
|
12
|
+
'ul': '* %{str}'
|
13
|
+
'ol': '1. %{str}'
|
14
|
+
'blockquote': '> %{str}'
|
15
|
+
'h1': '# %{str}'
|
16
|
+
'h2': '## %{str}'
|
17
|
+
'h3': '### %{str}'
|
18
|
+
'h4': '#### %{str}'
|
19
|
+
'h5': '##### %{str}'
|
20
|
+
'h6': '###### %{str}'
|
21
|
+
'a': '[%{str}](|)'
|
22
|
+
'img': ''
|
23
|
+
|
24
|
+
# ---------------------------------------------------------------------
|
25
|
+
|
26
|
+
class Plugin
|
27
|
+
constructor: (@element, options) ->
|
28
|
+
@settings = $.extend {}, defaults, options
|
29
|
+
|
30
|
+
@$element = $(@element)
|
31
|
+
|
32
|
+
@_defaults = defaults
|
33
|
+
@_name = pluginName
|
34
|
+
|
35
|
+
@init()
|
36
|
+
|
37
|
+
init: ->
|
38
|
+
console.log 'init' if @settings.debug
|
39
|
+
|
40
|
+
@get_help_button().addClass('active') if @help_is_visible()
|
41
|
+
|
42
|
+
@get_help_button().on 'click', (e) =>
|
43
|
+
$(e.currentTarget).toggleClass('active')
|
44
|
+
@toggle_help_visibility()
|
45
|
+
|
46
|
+
@get_command_buttons().on 'click', (e) =>
|
47
|
+
$btn = $(e.currentTarget)
|
48
|
+
cmd = $btn.attr('value')
|
49
|
+
@execute_command(cmd)
|
50
|
+
|
51
|
+
# ---------------------------------------------------------------------
|
52
|
+
|
53
|
+
get_textarea: -> @get_editor_div().children('textarea')
|
54
|
+
get_editor_div: -> @$element.children('div.editor')
|
55
|
+
get_header_div: -> @$element.children('div.header:first')
|
56
|
+
get_help_div: -> @$element.children('div.help')
|
57
|
+
get_button_groups_ul: -> @get_header_div().find('ul.button_groups')
|
58
|
+
get_button_group_lis: -> @get_button_groups_ul().children('li.button_group')
|
59
|
+
get_buttons_uls: -> @get_button_group_lis().children('ul.buttons')
|
60
|
+
get_button_lis: -> @get_buttons_uls().children('li.button')
|
61
|
+
get_buttons: -> @get_button_lis().children('button')
|
62
|
+
get_command_buttons: -> @get_buttons().not(@get_help_button())
|
63
|
+
get_help_button: -> @get_buttons().filter('.help')
|
64
|
+
|
65
|
+
help_is_visible: -> @get_help_div().attr('data-visible') == 'true'
|
66
|
+
|
67
|
+
execute_command: (cmd) ->
|
68
|
+
$textarea = @get_textarea()
|
69
|
+
selection = @get_selection($textarea)
|
70
|
+
definition = @settings.definitions[cmd]
|
71
|
+
replacement = definition.replace('%{str}', selection.text)
|
72
|
+
caret_pos = replacement.indexOf('|')
|
73
|
+
start = selection.start
|
74
|
+
end = selection.start + replacement.length
|
75
|
+
if caret_pos > -1
|
76
|
+
replacement = replacement.replace(/\|/g, '')
|
77
|
+
start = selection.start + caret_pos
|
78
|
+
end = selection.start + caret_pos
|
79
|
+
@replace_selection($textarea, replacement)
|
80
|
+
@set_selection($textarea, start, end)
|
81
|
+
|
82
|
+
get_selection: ($e) ->
|
83
|
+
{
|
84
|
+
start: $e[0].selectionStart
|
85
|
+
end: $e[0].selectionEnd
|
86
|
+
length: $e[0].selectionEnd - $e[0].selectionStart
|
87
|
+
text: $e.val().substring($e[0].selectionStart, $e[0].selectionEnd)
|
88
|
+
}
|
89
|
+
|
90
|
+
set_selection: ($e, start, end) ->
|
91
|
+
$e.focus()
|
92
|
+
$e[0].selectionStart = start
|
93
|
+
$e[0].selectionEnd = end
|
94
|
+
|
95
|
+
replace_selection: ($e, string) ->
|
96
|
+
start = $e[0].selectionStart
|
97
|
+
end = $e[0].selectionEnd
|
98
|
+
val = $e.val()
|
99
|
+
$e.val(val.substring(0, start) + string + val.substring(end, val.length))
|
100
|
+
|
101
|
+
toggle_help_visibility: ->
|
102
|
+
@get_help_div().attr('data-visible', String(!@help_is_visible()))
|
103
|
+
|
104
|
+
# ---------------------------------------------------------------------
|
105
|
+
|
106
|
+
# A really lightweight plugin wrapper around the constructor,
|
107
|
+
# preventing against multiple instantiations and allowing any
|
108
|
+
# public function (ie. a function whose name doesn't start
|
109
|
+
# with an underscore) to be called via the jQuery plugin,
|
110
|
+
# e.g. $(element).defaultPluginName('functionName', arg1, arg2)
|
111
|
+
|
112
|
+
$.fn[pluginName] = (options) ->
|
113
|
+
args = arguments
|
114
|
+
if options is `undefined` or typeof options is "object"
|
115
|
+
@each ->
|
116
|
+
$.data this, "plugin_" + pluginName, new Plugin(this, options) unless $.data(this, "plugin_" + pluginName)
|
117
|
+
|
118
|
+
else if typeof options is "string" and options[0] isnt "_" and options isnt "init"
|
119
|
+
returns = undefined
|
120
|
+
@each ->
|
121
|
+
instance = $.data(this, "plugin_" + pluginName)
|
122
|
+
returns = instance[options].apply(instance, Array::slice.call(args, 1)) if instance instanceof Plugin and typeof instance[options] is "function"
|
123
|
+
$.data this, "plugin_" + pluginName, null if options is "destroy"
|
124
|
+
|
125
|
+
(if returns isnt `undefined` then returns else this)
|
126
|
+
|
127
|
+
# =====================================================================
|
128
|
+
|
129
|
+
$ ->
|
130
|
+
|
131
|
+
$('div.simple_form_markdown_editor').simple_form_markdown_editor_buttons()
|
132
|
+
|
133
|
+
# make sure the plugin is correctly rebound to new elements
|
134
|
+
$('body').on 'dom_update', (e) ->
|
135
|
+
$('div.simple_form_markdown_editor').simple_form_markdown_editor_buttons()
|
data/lib/assets/javascripts/simple_form_markdown_editor/simple_form_markdown_editor_help.js.coffee
ADDED
@@ -0,0 +1,100 @@
|
|
1
|
+
# https://github.com/jquery-boilerplate/jquery-boilerplate/
|
2
|
+
do ($ = jQuery, window, document) ->
|
3
|
+
|
4
|
+
pluginName = 'simple_form_markdown_editor_help'
|
5
|
+
defaults =
|
6
|
+
debug: false
|
7
|
+
|
8
|
+
# ---------------------------------------------------------------------
|
9
|
+
|
10
|
+
class Plugin
|
11
|
+
constructor: (@element, options) ->
|
12
|
+
@settings = $.extend {}, defaults, options
|
13
|
+
|
14
|
+
@$element = $(@element)
|
15
|
+
|
16
|
+
@_defaults = defaults
|
17
|
+
@_name = pluginName
|
18
|
+
|
19
|
+
@init()
|
20
|
+
|
21
|
+
init: ->
|
22
|
+
console.log 'init' if @settings.debug
|
23
|
+
|
24
|
+
@set_section_li @get_section_lis().first()
|
25
|
+
|
26
|
+
@get_section_lis().on 'click', (e) =>
|
27
|
+
$li = $(e.currentTarget)
|
28
|
+
@set_section_li($li)
|
29
|
+
|
30
|
+
@get_sub_section_lis().on 'click', (e) =>
|
31
|
+
$li = $(e.currentTarget)
|
32
|
+
@set_sub_section_li($li)
|
33
|
+
|
34
|
+
# ---------------------------------------------------------------------
|
35
|
+
|
36
|
+
get_help_div: -> @$element.find('div.help')
|
37
|
+
|
38
|
+
get_sections_ul: -> @get_help_div().find('ul.sections')
|
39
|
+
get_section_lis: -> @get_sections_ul().children('li')
|
40
|
+
get_sub_section_ul: (section) -> @get_sub_sections_uls().filter(".#{section}")
|
41
|
+
get_sub_sections_uls: -> @get_help_div().find('ul.sub_sections')
|
42
|
+
get_sub_section_lis: -> @get_sub_sections_uls().children('li.sub_section')
|
43
|
+
|
44
|
+
get_help_text_divs: -> @get_help_div().find('div.help_text')
|
45
|
+
|
46
|
+
set_section_li: ($li) ->
|
47
|
+
$li.siblings('li').removeClass('active')
|
48
|
+
$li.addClass('active')
|
49
|
+
section = $li.data('toggle')
|
50
|
+
$sub_section_ul = @get_sub_section_ul(section)
|
51
|
+
@set_sub_section_ul($sub_section_ul)
|
52
|
+
|
53
|
+
set_sub_section_ul: ($ul) ->
|
54
|
+
$ul.siblings('ul').removeClass('active')
|
55
|
+
$ul.addClass('active')
|
56
|
+
$li = $ul.children('li:first')
|
57
|
+
@set_sub_section_li($li)
|
58
|
+
|
59
|
+
set_sub_section_li: ($li) ->
|
60
|
+
$li.siblings('li').removeClass('active')
|
61
|
+
$li.addClass('active')
|
62
|
+
$help_text_div = @get_help_text_divs().filter(".#{$li.data('toggle')}")
|
63
|
+
@set_help_text_div($help_text_div)
|
64
|
+
|
65
|
+
set_help_text_div: ($div) ->
|
66
|
+
$div.siblings('div').removeClass('active')
|
67
|
+
$div.addClass('active')
|
68
|
+
|
69
|
+
# ---------------------------------------------------------------------
|
70
|
+
|
71
|
+
# A really lightweight plugin wrapper around the constructor,
|
72
|
+
# preventing against multiple instantiations and allowing any
|
73
|
+
# public function (ie. a function whose name doesn't start
|
74
|
+
# with an underscore) to be called via the jQuery plugin,
|
75
|
+
# e.g. $(element).defaultPluginName('functionName', arg1, arg2)
|
76
|
+
|
77
|
+
$.fn[pluginName] = (options) ->
|
78
|
+
args = arguments
|
79
|
+
if options is `undefined` or typeof options is "object"
|
80
|
+
@each ->
|
81
|
+
$.data this, "plugin_" + pluginName, new Plugin(this, options) unless $.data(this, "plugin_" + pluginName)
|
82
|
+
|
83
|
+
else if typeof options is "string" and options[0] isnt "_" and options isnt "init"
|
84
|
+
returns = undefined
|
85
|
+
@each ->
|
86
|
+
instance = $.data(this, "plugin_" + pluginName)
|
87
|
+
returns = instance[options].apply(instance, Array::slice.call(args, 1)) if instance instanceof Plugin and typeof instance[options] is "function"
|
88
|
+
$.data this, "plugin_" + pluginName, null if options is "destroy"
|
89
|
+
|
90
|
+
(if returns isnt `undefined` then returns else this)
|
91
|
+
|
92
|
+
# =====================================================================
|
93
|
+
|
94
|
+
$ ->
|
95
|
+
|
96
|
+
$('div.simple_form_markdown_editor').simple_form_markdown_editor_help()
|
97
|
+
|
98
|
+
# make sure the plugin is correctly rebound to new elements
|
99
|
+
$('body').on 'dom_update', (e) ->
|
100
|
+
$('div.simple_form_markdown_editor').simple_form_markdown_editor_help()
|
data/lib/assets/javascripts/simple_form_markdown_editor/simple_form_markdown_editor_tabs.js.coffee
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
# https://github.com/jquery-boilerplate/jquery-boilerplate/
|
2
|
+
do ($ = jQuery, window, document) ->
|
3
|
+
|
4
|
+
pluginName = 'simple_form_markdown_editor_tabs'
|
5
|
+
defaults =
|
6
|
+
debug: false
|
7
|
+
|
8
|
+
# ---------------------------------------------------------------------
|
9
|
+
|
10
|
+
class Plugin
|
11
|
+
constructor: (@element, options) ->
|
12
|
+
@settings = $.extend {}, defaults, options
|
13
|
+
|
14
|
+
@$element = $(@element)
|
15
|
+
|
16
|
+
@_defaults = defaults
|
17
|
+
@_name = pluginName
|
18
|
+
|
19
|
+
@init()
|
20
|
+
|
21
|
+
init: ->
|
22
|
+
console.log 'init' if @settings.debug
|
23
|
+
|
24
|
+
@get_edit_tab().addClass('active')
|
25
|
+
|
26
|
+
@get_tab_lis().on 'click', (e) =>
|
27
|
+
@get_tab_lis().removeClass('active')
|
28
|
+
$(e.currentTarget).addClass('active')
|
29
|
+
@$element.attr('data-show', $(e.currentTarget).data('command'))
|
30
|
+
|
31
|
+
@get_preview_tab().on 'click', (e) =>
|
32
|
+
$.ajax(
|
33
|
+
context: @element
|
34
|
+
type: 'POST'
|
35
|
+
url: @$element.attr('data-preview-url')
|
36
|
+
data: text: @get_textarea().val()
|
37
|
+
success: (html) =>
|
38
|
+
@get_preview_div().html(html) or "<p>#{@get_nothing_to_preview_text()}</p>"
|
39
|
+
)
|
40
|
+
|
41
|
+
# ---------------------------------------------------------------------
|
42
|
+
|
43
|
+
get_textarea: -> @get_editor_div().find('textarea')
|
44
|
+
get_preview_div: -> @$element.find('div.preview')
|
45
|
+
get_editor_div: -> @$element.find('div.editor')
|
46
|
+
get_header: -> @$element.find('div.header:first')
|
47
|
+
get_tabs_ul: -> @get_header().find('ul.tabs')
|
48
|
+
get_tab_lis: -> @get_tabs_ul().children('li')
|
49
|
+
get_preview_tab: -> @get_tab_lis().filter('.preview')
|
50
|
+
get_edit_tab: -> @get_tab_lis().filter('.edit')
|
51
|
+
get_nothing_to_preview_text: -> @get_preview_div().data('nothing-to-preview-text') or "Nothing to preview."
|
52
|
+
|
53
|
+
# ---------------------------------------------------------------------
|
54
|
+
|
55
|
+
# A really lightweight plugin wrapper around the constructor,
|
56
|
+
# preventing against multiple instantiations and allowing any
|
57
|
+
# public function (ie. a function whose name doesn't start
|
58
|
+
# with an underscore) to be called via the jQuery plugin,
|
59
|
+
# e.g. $(element).defaultPluginName('functionName', arg1, arg2)
|
60
|
+
|
61
|
+
$.fn[pluginName] = (options) ->
|
62
|
+
args = arguments
|
63
|
+
if options is `undefined` or typeof options is "object"
|
64
|
+
@each ->
|
65
|
+
$.data this, "plugin_" + pluginName, new Plugin(this, options) unless $.data(this, "plugin_" + pluginName)
|
66
|
+
|
67
|
+
else if typeof options is "string" and options[0] isnt "_" and options isnt "init"
|
68
|
+
returns = undefined
|
69
|
+
@each ->
|
70
|
+
instance = $.data(this, "plugin_" + pluginName)
|
71
|
+
returns = instance[options].apply(instance, Array::slice.call(args, 1)) if instance instanceof Plugin and typeof instance[options] is "function"
|
72
|
+
$.data this, "plugin_" + pluginName, null if options is "destroy"
|
73
|
+
|
74
|
+
(if returns isnt `undefined` then returns else this)
|
75
|
+
|
76
|
+
# =====================================================================
|
77
|
+
|
78
|
+
$ ->
|
79
|
+
|
80
|
+
$('div.simple_form_markdown_editor').simple_form_markdown_editor_tabs()
|
81
|
+
|
82
|
+
# make sure the plugin is correctly rebound to new elements
|
83
|
+
$('body').on 'dom_update', (e) ->
|
84
|
+
$('div.simple_form_markdown_editor').simple_form_markdown_editor_tabs()
|