character 0.1.0 → 1.0.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 (173) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +4 -1
  3. data/.rspec +1 -0
  4. data/README.md +185 -14
  5. data/Rakefile +8 -1
  6. data/app/assets/images/character/logo.jpg +0 -0
  7. data/app/assets/javascripts/character.coffee +134 -0
  8. data/app/assets/javascripts/character/dashboard/_visitors.coffee +27 -0
  9. data/app/assets/javascripts/character/dashboard/layout.coffee +156 -0
  10. data/app/assets/javascripts/character/dashboard/module.coffee +51 -0
  11. data/app/assets/javascripts/character/generic/details.coffee +233 -0
  12. data/app/assets/javascripts/character/generic/helpers/compact_object.coffee +7 -0
  13. data/app/assets/javascripts/character/generic/helpers/data_inputs.coffee +21 -0
  14. data/app/assets/javascripts/character/generic/helpers/date_select.coffee +45 -0
  15. data/app/assets/javascripts/character/generic/helpers/editor.coffee +11 -0
  16. data/app/assets/javascripts/character/generic/helpers/redactor.coffee +38 -0
  17. data/app/assets/javascripts/character/generic/helpers/reorder.coffee +36 -0
  18. data/app/assets/javascripts/character/generic/layout.coffee +40 -0
  19. data/app/assets/javascripts/character/generic/list.coffee +214 -0
  20. data/app/assets/javascripts/character/generic/model.coffee +135 -0
  21. data/app/assets/javascripts/character/generic/module.coffee +157 -0
  22. data/app/assets/javascripts/character/images/module.coffee +148 -0
  23. data/app/assets/javascripts/character/pages/module.coffee +43 -0
  24. data/app/assets/javascripts/character/posts/module.coffee +113 -0
  25. data/app/assets/javascripts/character/settings/_admins.coffee +61 -0
  26. data/app/assets/javascripts/character/settings/_authors.coffee +56 -0
  27. data/app/assets/javascripts/character/settings/_categories.coffee +61 -0
  28. data/app/assets/javascripts/character/settings/_layout.coffee +7 -0
  29. data/app/assets/javascripts/character/settings/_redirects.coffee +56 -0
  30. data/app/assets/javascripts/character/settings/_website.coffee +7 -0
  31. data/app/assets/javascripts/character/settings/details.coffee +16 -0
  32. data/app/assets/javascripts/character/settings/layout.coffee +46 -0
  33. data/app/assets/javascripts/character/settings/module.coffee +78 -0
  34. data/app/assets/stylesheets/character.scss +37 -0
  35. data/app/assets/stylesheets/character/_admins.scss +30 -0
  36. data/app/assets/stylesheets/character/_authors.scss +30 -0
  37. data/app/assets/stylesheets/character/_categories.scss +32 -0
  38. data/app/assets/stylesheets/character/_dashboard.scss +143 -0
  39. data/app/assets/stylesheets/character/_posts.scss +93 -0
  40. data/app/assets/stylesheets/character/_redirects.scss +35 -0
  41. data/app/assets/stylesheets/character/base.scss +967 -0
  42. data/app/assets/stylesheets/character/typography.scss +29 -0
  43. data/app/controllers/character/api_controller.rb +170 -0
  44. data/app/controllers/character/application_controller.rb +37 -0
  45. data/app/controllers/character/settings_controller.rb +72 -0
  46. data/app/controllers/concerns/character/auth_concern.rb +41 -0
  47. data/app/controllers/concerns/character/instance_concern.rb +31 -0
  48. data/app/controllers/concerns/character/json_object_concern.rb +32 -0
  49. data/app/controllers/concerns/character/model_class_concern.rb +28 -0
  50. data/app/controllers/concerns/character/params_concern.rb +33 -0
  51. data/app/controllers/concerns/character/templates_concern.rb +32 -0
  52. data/app/controllers/concerns/not_found.rb +18 -0
  53. data/app/controllers/concerns/website_settings.rb +18 -0
  54. data/app/controllers/pages_controller.rb +8 -0
  55. data/app/controllers/posts_controller.rb +43 -0
  56. data/app/helpers/character_helper.rb +8 -0
  57. data/app/helpers/page_helper.rb +67 -0
  58. data/app/inputs/foundation_string_input.rb +44 -0
  59. data/app/inputs/foundation_switch_input.rb +35 -0
  60. data/app/models/character/image.rb +12 -0
  61. data/app/models/character/page.rb +21 -0
  62. data/app/models/character/post.rb +32 -12
  63. data/app/models/character/post_author.rb +22 -0
  64. data/app/models/character/post_category.rb +21 -0
  65. data/app/models/character/redirect.rb +15 -0
  66. data/app/models/character/settings/variable.rb +23 -0
  67. data/app/models/character/sitemap/sitemap_generator_helper.rb +15 -0
  68. data/app/models/character/user.rb +29 -0
  69. data/app/models/concerns/created_ago.rb +12 -0
  70. data/app/models/concerns/hideable.rb +27 -0
  71. data/app/models/concerns/orderable.rb +8 -0
  72. data/app/models/concerns/report.rb +11 -0
  73. data/app/models/concerns/report_daily.rb +32 -0
  74. data/app/models/concerns/report_monthly.rb +18 -0
  75. data/app/models/concerns/report_weekly.rb +19 -0
  76. data/app/models/concerns/updated_ago.rb +12 -0
  77. data/app/models/reports/analytics_daily.rb +26 -0
  78. data/app/models/reports/analytics_monthly.rb +16 -0
  79. data/app/models/reports/analytics_weekly.rb +16 -0
  80. data/app/services/google_analytics.rb +43 -0
  81. data/app/uploaders/character/image_uploader.rb +22 -0
  82. data/app/uploaders/character/settings/file_uploader.rb +5 -0
  83. data/app/views/character/character.html.erb +67 -0
  84. data/app/views/character/generic/form.html.erb +8 -0
  85. data/app/views/character/pages/form.html.erb +28 -0
  86. data/app/views/character/posts/form.html.erb +38 -0
  87. data/app/views/character/settings/admins.html.erb +29 -0
  88. data/app/views/character/settings/post_authors.html.erb +28 -0
  89. data/app/views/character/settings/post_categories.html.erb +31 -0
  90. data/app/views/character/settings/redirects.html.erb +30 -0
  91. data/app/views/character/settings/settings_group.html.erb +67 -0
  92. data/app/views/errors/not_found.html.erb +157 -0
  93. data/app/views/pages/_default.html.erb +3 -0
  94. data/app/views/pages/_redactor.html.erb +3 -0
  95. data/app/views/pages/show.html.erb +5 -0
  96. data/app/views/posts/_post.html.erb +17 -0
  97. data/app/views/posts/author.html.erb +18 -0
  98. data/app/views/posts/category.html.erb +18 -0
  99. data/app/views/posts/index.html.erb +18 -0
  100. data/app/views/posts/rss.builder +19 -0
  101. data/app/views/posts/show.html.erb +14 -0
  102. data/app/views/shared/_google_analytics.html.erb +13 -0
  103. data/character.gemspec +48 -5
  104. data/doc/README_old.md +161 -0
  105. data/doc/generic_app.md +19 -0
  106. data/doc/img/demo-1.jpg +0 -0
  107. data/doc/img/demo-2.jpg +0 -0
  108. data/doc/img/demo-3.jpg +0 -0
  109. data/doc/img/demo-4.jpg +0 -0
  110. data/doc/img/demo-5.jpg +0 -0
  111. data/doc/instances.md +39 -0
  112. data/doc/settings.md +1 -0
  113. data/lib/character.rb +29 -1
  114. data/lib/character/engine.rb +33 -1
  115. data/lib/character/generators/bootstrap_generator.rb +51 -0
  116. data/lib/character/instance.rb +59 -0
  117. data/lib/character/routing.rb +42 -5
  118. data/lib/character/settings.rb +101 -0
  119. data/lib/character/templates/admin.coffee +15 -0
  120. data/lib/character/templates/admin.scss +3 -0
  121. data/lib/character/templates/application.html.erb +44 -0
  122. data/lib/character/templates/application.scss +12 -0
  123. data/lib/character/templates/assets.rb +1 -0
  124. data/lib/character/templates/initializer.rb +5 -0
  125. data/lib/character/templates/settings.scss +11 -0
  126. data/lib/character/templates/settings.yml +67 -0
  127. data/lib/character/templates/typography.scss +13 -0
  128. data/lib/character/version.rb +2 -2
  129. data/lib/mongoid/carrierwave_serialization_patch.rb +9 -0
  130. data/lib/tasks/analytics.rake +52 -0
  131. data/test/config/application.rb +65 -0
  132. data/test/config/mongoid.yml +12 -0
  133. data/test/config/secrets.yml +22 -0
  134. data/test/controllers/character/api_controller_test.rb +94 -0
  135. data/test/factories/product_factory.rb +5 -0
  136. data/test/lib/character/engine_test.rb +33 -0
  137. data/test/lib/character/routing_test.rb +31 -0
  138. data/test/test_helper.rb +48 -0
  139. data/vendor/assets/javascripts/backbone.js +944 -794
  140. data/vendor/assets/javascripts/jquery.fileupload.js +1426 -0
  141. data/vendor/assets/javascripts/jquery.form.js +1278 -0
  142. data/vendor/assets/javascripts/jquery.iframe-transport.js +214 -0
  143. data/vendor/assets/javascripts/raphael.js +8117 -0
  144. data/vendor/assets/javascripts/raphael.morris.js +1885 -0
  145. data/vendor/assets/javascripts/underscore.inflection.js +177 -0
  146. data/vendor/assets/javascripts/underscore.string.js +1 -1
  147. data/vendor/assets/stylesheets/csspinner.css +361 -0
  148. data/vendor/assets/stylesheets/normalize.css +423 -0
  149. metadata +499 -49
  150. data/app/controllers/character/posts_controller.rb +0 -27
  151. data/lib/generators/character/install_generator.rb +0 -42
  152. data/lib/generators/character/templates/README +0 -1
  153. data/lib/generators/character/templates/admin/character.rb +0 -3
  154. data/vendor/assets/fonts/general_foundicons.eot +0 -0
  155. data/vendor/assets/fonts/general_foundicons.svg +0 -15
  156. data/vendor/assets/fonts/general_foundicons.ttf +0 -0
  157. data/vendor/assets/fonts/general_foundicons.woff +0 -0
  158. data/vendor/assets/javascripts/character/index.js.coffee +0 -53
  159. data/vendor/assets/javascripts/character/models/post.js.coffee +0 -39
  160. data/vendor/assets/javascripts/character/views/app.js.coffee +0 -81
  161. data/vendor/assets/javascripts/character/views/editor.js.coffee +0 -231
  162. data/vendor/assets/javascripts/character/views/editor_settings.js.coffee +0 -44
  163. data/vendor/assets/javascripts/character/views/index.js.coffee +0 -116
  164. data/vendor/assets/javascripts/character/views/preview.js.coffee +0 -49
  165. data/vendor/assets/javascripts/jquery.smartresize.js +0 -30
  166. data/vendor/assets/javascripts/lodash.js +0 -4258
  167. data/vendor/assets/javascripts/showdown.js +0 -62
  168. data/vendor/assets/stylesheets/character/_base.css.scss +0 -84
  169. data/vendor/assets/stylesheets/character/_icons.css.scss.erb +0 -96
  170. data/vendor/assets/stylesheets/character/_view_editor.css.scss +0 -115
  171. data/vendor/assets/stylesheets/character/_view_index.css.scss +0 -73
  172. data/vendor/assets/stylesheets/character/_view_preview.css.scss +0 -49
  173. data/vendor/assets/stylesheets/character/index.css.scss +0 -32
@@ -1,27 +0,0 @@
1
- class Character::PostsController < ApplicationController
2
- before_filter :authenticate_admin_user!
3
-
4
- def index
5
- @posts = []
6
- @posts += Character::Post.drafts.to_a
7
- @posts += Character::Post.published.to_a
8
- render json: @posts
9
- end
10
-
11
- def create
12
- @post = Character::Post.create params[:post]
13
- render json: @post
14
- end
15
-
16
- def update
17
- @post = Character::Post.find(params[:id])
18
- @post.update_attributes params[:post]
19
- render json: @post
20
- end
21
-
22
- def destroy
23
- @post = Character::Post.find(params[:id])
24
- @post.destroy
25
- render json: 'ok'
26
- end
27
- end
@@ -1,42 +0,0 @@
1
- module Character
2
- module Generators
3
- class InstallGenerator < Rails::Generators::Base
4
- desc << "Description:\n Copies Chatacter source files to your application's app directory, adds routes and missing gems."
5
-
6
- source_root File.expand_path('../templates', __FILE__)
7
-
8
- def copy_files
9
- puts "Installing active admin page for Character:"
10
- copy_file "admin/character.rb", "app/admin/character.rb"
11
- end
12
-
13
- def add_assets
14
- missing_file_message = "It doesn't look like you've installed activeadmin: active_admin.css.scss is missing.\nPlease run: rails g active_admin:install - install it and try again."
15
-
16
- if File.exist?('app/assets/javascripts/active_admin.js')
17
- partial1 = "//= require character\n\n"
18
- partial2 = "$(function(){ if ($('.admin_character').length > 0) window.initialize_character('http://blog-url.com/'); });\n\n"
19
-
20
- insert_into_file "app/assets/javascripts/active_admin.js", partial1 + partial2, :after => "base\n"
21
- else
22
- puts missing_file_message
23
- end
24
-
25
- if File.exist?('app/assets/stylesheets/active_admin.css.scss')
26
- insert_into_file "app/assets/stylesheets/active_admin.css.scss",
27
- "@import 'character';\n", :after => "base\";\n"
28
- else
29
- puts missing_file_message
30
- end
31
- end
32
-
33
- def mount_engine
34
- route "mount_character()"
35
- end
36
-
37
- def show_congrats
38
- readme("README")
39
- end
40
- end
41
- end
42
- end
@@ -1 +0,0 @@
1
- Character
@@ -1,3 +0,0 @@
1
- ActiveAdmin.register_page "Character" do
2
- menu label: 'Blog'
3
- end
@@ -1,15 +0,0 @@
1
- <?xml version="1.0" standalone="no"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd" > <svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%">
2
- <defs >
3
- <font id="generalfoundicons" horiz-adv-x="955" ><font-face
4
- font-family="General Foundicons"
5
- units-per-em="1000"
6
- panose-1="0 0 0 0 0 0 0 0 0 0"
7
- ascent="1000"
8
- descent="0"
9
- alphabetic="0" />
10
- <missing-glyph horiz-adv-x="250" />
11
- <glyph unicode=" " glyph-name="space" horiz-adv-x="250" />
12
- <glyph unicode="~" glyph-name="asciitilde" horiz-adv-x="1000" />
13
- </font>
14
- </defs>
15
- </svg>
@@ -1,53 +0,0 @@
1
- #= require ../lodash
2
- #= require ../underscore.string
3
- #= require ../backbone
4
- #= require ../showdown
5
- #= require ../jquery.smartresize
6
-
7
- #= require_tree ./models
8
- #= require_tree ./views
9
- #= require_tree ./
10
-
11
-
12
- window.set_routes = ->
13
- Router = Backbone.Router.extend
14
- routes:
15
- 'new': 'newPost'
16
- 'edit/:id': 'editPost'
17
- 'preview/:id': 'showPostPreview'
18
- '': 'showIndex'
19
-
20
- router = new Router
21
-
22
- router.on 'route:newPost', ->
23
- window.app.show_editor()
24
-
25
- router.on 'route:editPost', (id) ->
26
- window.app.show_editor(id)
27
-
28
- router.on 'route:showPostPreview', (id) ->
29
- window.app.show_preview(id)
30
-
31
- router.on 'route:showIndex', (id) ->
32
- if window.app.preview_view
33
- window.app.close_preview()
34
- else
35
- window.app.show_index()
36
-
37
- window.router = router
38
-
39
- # Start Backbone history a necessary step for bookmarkable URL's
40
- Backbone.history.start()
41
-
42
-
43
- window.initialize_character = (blog_url = 'http://this-is-blog.com/', app_container = '#wrapper') ->
44
- window.posts = new Posts()
45
-
46
- window.posts.fetch success: ->
47
- window.app = new AppView(blog_url, app_container)
48
- window.app.show_index()
49
-
50
- window.set_routes()
51
-
52
-
53
-
@@ -1,39 +0,0 @@
1
- class Post extends Backbone.Model
2
- #id
3
- #title
4
- #category
5
- #featured_image
6
- #html
7
- #md
8
- #date
9
- #views
10
- #published
11
-
12
- idAttribute: '_id'
13
-
14
-
15
- date_formatted: ->
16
- date = @get('date')
17
- if date then date.replace(/-/g, '/') else "Date Not Set"
18
-
19
-
20
- featured_image: ->
21
- @get('featured_image_url')
22
-
23
-
24
- state: ->
25
- if @get('published')
26
- "Published"
27
- else "Draft"
28
-
29
-
30
- @slugify: (text) ->
31
- _.string.slugify(text)
32
-
33
-
34
- class Posts extends Backbone.Collection
35
- model: Post
36
- url: '/admin/character/posts'
37
-
38
- window.Posts = Posts
39
- window.Post = Post
@@ -1,81 +0,0 @@
1
- ############################
2
- ### CHARACTER :: AppView ###
3
- ############################
4
-
5
- class AppView extends Backbone.View
6
-
7
- initialize: (@blog_url, @el) ->
8
- @render()
9
- window.index_scroll_y = 0
10
- @blog_url ||= 'http://default-blog-url.com/'
11
-
12
-
13
- render: ->
14
- html = """<div id='main'></div>"""
15
- $(@el).append html
16
-
17
-
18
- find_post: (id) ->
19
- window.posts.get(id)
20
-
21
-
22
- clear_view: ->
23
- (@index_view.remove() ; delete @index_view) if @index_view
24
- (@preview_view.remove() ; delete @preview_view) if @preview_view
25
- (@editor_view.remove() ; delete @editor_view) if @editor_view
26
-
27
-
28
- show_index: ->
29
- @clear_view()
30
- @index_view = new IndexView()
31
-
32
-
33
- show_preview: (post_id) ->
34
- if @editor_view
35
- @clear_view()
36
- @show_index()
37
-
38
- @index_view.set_active(post_id)
39
-
40
- if not @preview_view
41
- @index_view.lock()
42
-
43
- # render preview
44
- @preview_view.remove() if @preview_view
45
-
46
- post = @find_post(post_id)
47
- @preview_view = new PostPreviewView model: post
48
-
49
- html = @preview_view.render().el
50
-
51
- $('#main').append(html)
52
-
53
- window.scroll(0, 0)
54
-
55
-
56
-
57
- close_preview: ->
58
- @index_view.unlock()
59
-
60
- # hide preview
61
- if @preview_view
62
- @preview_view.remove()
63
- delete @preview_view
64
-
65
- @index_view.unset_active()
66
- window.index_scroll_y = 0
67
-
68
-
69
-
70
- show_editor: (post_id) ->
71
- @clear_view()
72
-
73
- post = if post_id then @find_post(post_id) else null
74
-
75
- @editor_view = new EditorView model: post
76
-
77
-
78
- window.AppView = AppView
79
-
80
-
81
-
@@ -1,231 +0,0 @@
1
- ###############################
2
- ### CHARACTER :: EditorView ###
3
- ###############################
4
-
5
- # Code is partly taken from:
6
- # - http://www.showdown.im/showdown/example/showdown-gui.js
7
-
8
- class EditorView extends Backbone.View
9
- tagName: 'div'
10
- className: 'editor'
11
-
12
-
13
- initialize: ->
14
- html = @render().el
15
- $('#main').append(html)
16
-
17
- @settings = new EditorSettingsView model: @model
18
-
19
- @converter = new Showdown.converter()
20
- @last_text = null
21
- @title = document.getElementById('title')
22
- @update_permalink()
23
-
24
- @slug = document.getElementById('slug')
25
- @markdown = document.getElementById('markdown')
26
- @html = document.getElementById('html')
27
- @max_delay = 3000
28
-
29
- @resize_panels()
30
- @typing_events()
31
- @convert_text()
32
-
33
-
34
- update_or_create_post: (extra_attributes, callback) ->
35
- attributes =
36
- title: $(@title).val()
37
- md: $(@markdown).val()
38
- html: @html.innerHTML
39
- slug: @slug.innerHTML
40
- date: @settings.date()
41
-
42
- _.extend attributes, extra_attributes
43
-
44
- if @model
45
- @model.save(attributes, {success: callback})
46
- else
47
- window.posts.create(attributes, {wait: true, success: callback})
48
-
49
-
50
- #if @model.isNew()
51
- # @model.set
52
- # id: @model.cid
53
- # views: 0
54
- # @model.save()
55
- # window.posts.add(@model, {at: 0})
56
-
57
-
58
- save_draft: ->
59
- @update_or_create_post {published: false}, =>
60
- @back_to_index()
61
-
62
-
63
- publish: ->
64
- @update_or_create_post {published: true}, =>
65
- @back_to_index()
66
-
67
-
68
- back_to_index: ->
69
- path = if @model then "#/preview/#{@model.id}" else '#/'
70
- router.navigate(path, {trigger: true})
71
-
72
-
73
- events:
74
- 'click .save-draft': 'save_draft'
75
- 'click .publish': 'publish'
76
- 'click .cancel': 'back_to_index'
77
-
78
-
79
- update_word_counter: ->
80
- counter = 0
81
- md_text = $(@markdown).val()
82
- if md_text.length > 0
83
- counter = md_text.match(/[^\s]+/g).length
84
- $(document.getElementById('word_counter')).html "#{counter} words"
85
-
86
-
87
- update_permalink: ->
88
- blog_url = window.app.blog_url
89
- slug = Post.slugify($(@title).val())
90
- html = """<strong>Permalink:</strong> #{blog_url}<strong id='slug'>#{slug}</strong>"""
91
- $('#permalink').html html
92
-
93
-
94
- render: ->
95
- post = if @model then @model.toJSON() else {title: 'Post Title', md: 'Post Text'}
96
-
97
- html = """<header>
98
- <div class='title'>
99
- <input type='text' placeholder='Title' value='#{post.title}' id='title'/>
100
- </div>
101
- <div class='permalink' id='permalink'>
102
- </div>
103
- </header>
104
-
105
- <div class='chr-panel left index fixed'>
106
- <section class='container'>
107
- <header>
108
- <span class='title'>Markdown</span>
109
- <span class='buttons'>
110
- <a href='#' title='Markdown syntax' class='foundicon-help'></a>
111
- </span>
112
- </header>
113
- <div>
114
- <textarea id='markdown'>#{post.md}</textarea>
115
- </div>
116
- </section>
117
- </div>
118
-
119
- <div class='chr-panel right preview fixed'>
120
- <section class='container'>
121
- <header>
122
- <span class='title'>Preview</span>
123
- <span class='info' id='word_counter'>549 words</span>
124
- </header>
125
-
126
- <article>
127
- <section class='content' id='html'></section>
128
- </article>
129
- </section>
130
- </div>
131
-
132
- <footer>
133
- <button class='cancel'>Cancel</button>
134
- <button class='publish'>Publish</button>
135
- <button class='save-draft'>Save Draft</button>
136
- </footer>"""
137
- $(this.el).html html
138
- return this
139
-
140
-
141
- on_input: (callback) ->
142
- # In "delayed" mode, we do the conversion at pauses in input.
143
- # The pause is equal to the last runtime, so that slow
144
- # updates happen less frequently.
145
- #
146
- # Use a timer to schedule updates. Each keystroke
147
- # resets the timer.
148
-
149
- # if we already have convertText scheduled, cancel it
150
- if convert_text_timer
151
- window.clearTimeout(convert_text_timer)
152
- convert_text_timer = null
153
-
154
- time_until_convert_text = 0
155
-
156
- if time_until_convert_text > @max_delay
157
- time_until_convert_text = @max_delay
158
-
159
- # Schedule @convert_text().
160
- # Even if we're updating every keystroke, use a timer at 0.
161
- # This gives the browser time to handle other events.
162
- convert_text_timer = window.setTimeout(callback, time_until_convert_text)
163
-
164
-
165
- typing_events: ->
166
- # First, try registering for keyup events
167
- # (There's no harm in calling onInput() repeatedly)
168
- @markdown.onkeyup = => @on_input(@convert_text)
169
- @title.onkeyup = => @on_input(@update_permalink)
170
-
171
- # In case we can't capture paste events, poll for them
172
- polling_fallback = window.setInterval ( => @on_input() if not @markdown.value == @last_text ), 1000
173
-
174
- # Try registering for paste events
175
- @markdown.onpaste = =>
176
- # It worked! Cancel paste polling.
177
- if polling_fallback
178
- window.clearInterval(polling_fallback)
179
- polling_fallback = null
180
- @on_input()
181
-
182
- # Try registering for input events (the best solution)
183
- if @markdown.addEventListener
184
- # Let's assume input also fires on paste.
185
- # No need to cancel our keyup handlers;
186
- # they're basically free.
187
- @markdown.addEventListener('input', @markdown.onpaste, false)
188
-
189
- @markdown.focus()
190
-
191
-
192
- convert_text: =>
193
- text = @markdown.value
194
-
195
- return if text and text == @last_text
196
-
197
- @last_text = text
198
-
199
- # do the conversion
200
- @html.innerHTML = @converter.makeHtml(text)
201
- @update_word_counter()
202
-
203
-
204
- resize_panels: ->
205
- markdown = $(@markdown)
206
- html = $(@html).parent()
207
- window_height = $(window).height()
208
- footer_height = $('footer').outerHeight()
209
-
210
- markdown.css 'height', window_height - markdown.offset().top - footer_height
211
- html.css 'height', window_height - html.offset().top - footer_height
212
-
213
- $(window).smartresize =>
214
- @resize_panels()
215
-
216
-
217
- destroy = ->
218
- # clear smartresize event
219
- @markdown.onkeyup = null
220
- @title.onkeyup = null
221
-
222
-
223
- window.EditorView = EditorView
224
-
225
-
226
-
227
-
228
-
229
-
230
-
231
-