blogelator 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (162) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +20 -0
  3. data/README.md +86 -0
  4. data/Rakefile +29 -0
  5. data/app/assets/images/blogelator/blogelator-logo.svg +15 -0
  6. data/app/assets/javascripts/blogelator/admin.js +19 -0
  7. data/app/assets/javascripts/blogelator/application.js +2 -0
  8. data/app/assets/javascripts/blogelator/components/markdown_editor_component.js +187 -0
  9. data/app/assets/javascripts/blogelator/components/save_button_component.js +76 -0
  10. data/app/assets/javascripts/blogelator/config/marked.js +10 -0
  11. data/app/assets/javascripts/blogelator/config/router.js +9 -0
  12. data/app/assets/javascripts/blogelator/config/routes.js +13 -0
  13. data/app/assets/javascripts/blogelator/config/serializer.js +10 -0
  14. data/app/assets/javascripts/blogelator/config/store.js +10 -0
  15. data/app/assets/javascripts/blogelator/controllers/application_controller.js +11 -0
  16. data/app/assets/javascripts/blogelator/controllers/posts/posts_edit_controller.js +97 -0
  17. data/app/assets/javascripts/blogelator/controllers/posts/posts_index_controller.js +9 -0
  18. data/app/assets/javascripts/blogelator/controllers/posts/posts_new_controller.js +6 -0
  19. data/app/assets/javascripts/blogelator/controllers/posts/posts_show_controller.js +37 -0
  20. data/app/assets/javascripts/blogelator/models/post.js +34 -0
  21. data/app/assets/javascripts/blogelator/routes/index_route.js +10 -0
  22. data/app/assets/javascripts/blogelator/routes/posts_edit_route.js +36 -0
  23. data/app/assets/javascripts/blogelator/routes/posts_index_route.js +20 -0
  24. data/app/assets/javascripts/blogelator/routes/posts_new_route.js +53 -0
  25. data/app/assets/javascripts/blogelator/routes/posts_route.js +10 -0
  26. data/app/assets/javascripts/blogelator/routes/posts_show_route.js +14 -0
  27. data/app/assets/javascripts/blogelator/templates/application.handlebars +23 -0
  28. data/app/assets/javascripts/blogelator/templates/components/markdown-editor.handlebars +8 -0
  29. data/app/assets/javascripts/blogelator/templates/components/save-button.handlebars +8 -0
  30. data/app/assets/javascripts/blogelator/templates/posts/_footer.handlebars +0 -0
  31. data/app/assets/javascripts/blogelator/templates/posts/_form.handlebars +6 -0
  32. data/app/assets/javascripts/blogelator/templates/posts/_form_action_bar.handlebars +22 -0
  33. data/app/assets/javascripts/blogelator/templates/posts/_show_action_bar.handlebars +20 -0
  34. data/app/assets/javascripts/blogelator/templates/posts/edit.handlebars +1 -0
  35. data/app/assets/javascripts/blogelator/templates/posts/index.handlebars +30 -0
  36. data/app/assets/javascripts/blogelator/templates/posts/new.handlebars +1 -0
  37. data/app/assets/javascripts/blogelator/templates/posts/show.handlebars +22 -0
  38. data/app/assets/stylesheets/blogelator/admin/all.scss +7 -0
  39. data/app/assets/stylesheets/blogelator/admin/components/markdown_editor.scss +142 -0
  40. data/app/assets/stylesheets/blogelator/admin/components/save_button.scss +121 -0
  41. data/app/assets/stylesheets/blogelator/admin/layout.scss +94 -0
  42. data/app/assets/stylesheets/blogelator/admin/posts/_form.scss +12 -0
  43. data/app/assets/stylesheets/blogelator/admin/posts/_form_action_bar.scss +84 -0
  44. data/app/assets/stylesheets/blogelator/admin/posts/_posts_list.scss +43 -0
  45. data/app/assets/stylesheets/blogelator/admin/posts/edit.scss +7 -0
  46. data/app/assets/stylesheets/blogelator/admin/posts/index.scss +14 -0
  47. data/app/assets/stylesheets/blogelator/admin/posts/new.scss +16 -0
  48. data/app/assets/stylesheets/blogelator/admin/posts/show.scss +17 -0
  49. data/app/assets/stylesheets/blogelator/application/all.scss +19 -0
  50. data/app/assets/stylesheets/blogelator/application/layout.scss +49 -0
  51. data/app/assets/stylesheets/blogelator/application/posts/index.scss +50 -0
  52. data/app/assets/stylesheets/blogelator/application/posts/show.scss +64 -0
  53. data/app/assets/stylesheets/blogelator/mixins/blogelator_button.scss +57 -0
  54. data/app/assets/stylesheets/blogelator/mixins/blogelator_logo.scss +12 -0
  55. data/app/assets/stylesheets/blogelator/shared/post.scss +161 -0
  56. data/app/assets/stylesheets/blogelator/shared/typography/code_highlighting.scss +111 -0
  57. data/app/assets/stylesheets/blogelator/shared/typography/forms.scss +94 -0
  58. data/app/assets/stylesheets/blogelator/shared/typography/headings.scss +22 -0
  59. data/app/assets/stylesheets/blogelator/shared/typography/lists.scss +25 -0
  60. data/app/controllers/blogelator/admin/application_controller.rb +15 -0
  61. data/app/controllers/blogelator/admin/images_controller.rb +40 -0
  62. data/app/controllers/blogelator/admin/posts_controller.rb +67 -0
  63. data/app/controllers/blogelator/application_controller.rb +5 -0
  64. data/app/controllers/blogelator/posts_controller.rb +37 -0
  65. data/app/controllers/concerns/blogelator/admin/auth.rb +23 -0
  66. data/app/helpers/blogelator/admin/posts_helper.rb +7 -0
  67. data/app/helpers/blogelator/posts_helper.rb +28 -0
  68. data/app/models/blogelator/ability.rb +11 -0
  69. data/app/models/blogelator/html_renderer.rb +10 -0
  70. data/app/models/blogelator/post.rb +63 -0
  71. data/app/models/blogelator/tag.rb +5 -0
  72. data/app/serializers/blogelator/post_serializer.rb +6 -0
  73. data/app/views/blogelator/admin/posts/index.html.erb +0 -0
  74. data/app/views/blogelator/posts/_post.html.erb +14 -0
  75. data/app/views/blogelator/posts/index.html.erb +39 -0
  76. data/app/views/blogelator/posts/show.html.erb +27 -0
  77. data/app/views/layouts/blogelator/_footer.html.erb +3 -0
  78. data/app/views/layouts/blogelator/_head.html.erb +7 -0
  79. data/app/views/layouts/blogelator/_header.html.erb +7 -0
  80. data/app/views/layouts/blogelator/admin.html.erb +14 -0
  81. data/app/views/layouts/blogelator/application.html.erb +14 -0
  82. data/config/jshint.json +43 -0
  83. data/config/routes.rb +15 -0
  84. data/db/migrate/20140221192000_create_blogelator_posts.rb +12 -0
  85. data/db/migrate/20140221204230_add_slug_and_change_user_to_author.rb +6 -0
  86. data/db/migrate/20140221212026_create_blogelator_tags.rb +10 -0
  87. data/db/migrate/20140224024607_change_posts_properties_to_have_defaults.rb +14 -0
  88. data/db/migrate/20140224175024_add_slugs_to_existing_posts.rb +16 -0
  89. data/db/migrate/20140224192058_add_published_at_to_posts.rb +13 -0
  90. data/db/migrate/20140303015004_add_summary_to_posts.rb +9 -0
  91. data/lib/assets/stylesheets/blogelator/_variables_sample.scss +38 -0
  92. data/lib/blogelator.rb +27 -0
  93. data/lib/blogelator/engine.rb +35 -0
  94. data/lib/blogelator/version.rb +3 -0
  95. data/lib/generators/blogelator/install_generator.rb +94 -0
  96. data/spec/dummy/README.rdoc +28 -0
  97. data/spec/dummy/Rakefile +6 -0
  98. data/spec/dummy/app/assets/javascripts/application.js +1 -0
  99. data/spec/dummy/app/assets/javascripts/features/user_visits_admin_page_spec.js +12 -0
  100. data/spec/dummy/app/assets/javascripts/features/user_visits_post_page_spec.js +12 -0
  101. data/spec/dummy/app/assets/javascripts/fixtures/post.js +17 -0
  102. data/spec/dummy/app/assets/javascripts/test_helper.js +12 -0
  103. data/spec/dummy/app/assets/stylesheets/application.css +12 -0
  104. data/spec/dummy/app/assets/stylesheets/blogelator/_variables.scss +38 -0
  105. data/spec/dummy/app/assets/stylesheets/blogelator/admin.css.scss +4 -0
  106. data/spec/dummy/app/assets/stylesheets/blogelator/application.css.scss +4 -0
  107. data/spec/dummy/app/assets/stylesheets/test_helper.css +21 -0
  108. data/spec/dummy/app/controllers/application_controller.rb +9 -0
  109. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  110. data/spec/dummy/app/models/blogelator/ability.rb +9 -0
  111. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  112. data/spec/dummy/app/views/q_unit/rails/test/index.html.erb +17 -0
  113. data/spec/dummy/app/views/qunit/rails/test/index.html.erb +17 -0
  114. data/spec/dummy/bin/bundle +3 -0
  115. data/spec/dummy/bin/rails +4 -0
  116. data/spec/dummy/bin/rake +4 -0
  117. data/spec/dummy/config.ru +4 -0
  118. data/spec/dummy/config/application.rb +24 -0
  119. data/spec/dummy/config/boot.rb +5 -0
  120. data/spec/dummy/config/database.yml +25 -0
  121. data/spec/dummy/config/environment.rb +5 -0
  122. data/spec/dummy/config/environments/development.rb +32 -0
  123. data/spec/dummy/config/environments/production.rb +80 -0
  124. data/spec/dummy/config/environments/test.rb +36 -0
  125. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  126. data/spec/dummy/config/initializers/blogelator.rb +6 -0
  127. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  128. data/spec/dummy/config/initializers/inflections.rb +16 -0
  129. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  130. data/spec/dummy/config/initializers/secret_token.rb +12 -0
  131. data/spec/dummy/config/initializers/session_store.rb +3 -0
  132. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  133. data/spec/dummy/config/locales/en.yml +23 -0
  134. data/spec/dummy/config/routes.rb +3 -0
  135. data/spec/dummy/db/development.sqlite3 +0 -0
  136. data/spec/dummy/db/migrate/20140221215439_create_blogelator_posts.blogelator.rb +13 -0
  137. data/spec/dummy/db/migrate/20140221215440_add_slug_and_change_user_to_author.blogelator.rb +7 -0
  138. data/spec/dummy/db/migrate/20140224024931_create_blogelator_tags.blogelator.rb +11 -0
  139. data/spec/dummy/db/migrate/20140224025218_change_posts_properties_to_have_defaults.blogelator.rb +15 -0
  140. data/spec/dummy/db/migrate/20140224205646_add_slugs_to_existing_posts.blogelator.rb +17 -0
  141. data/spec/dummy/db/migrate/20140224205647_add_published_at_to_posts.blogelator.rb +14 -0
  142. data/spec/dummy/db/migrate/20140303015133_add_summary_to_posts.blogelator.rb +6 -0
  143. data/spec/dummy/db/production.sqlite3 +0 -0
  144. data/spec/dummy/db/schema.rb +37 -0
  145. data/spec/dummy/db/test.sqlite3 +0 -0
  146. data/spec/dummy/log/development.log +50393 -0
  147. data/spec/dummy/log/production.log +76 -0
  148. data/spec/dummy/log/test.log +11750 -0
  149. data/spec/dummy/public/404.html +58 -0
  150. data/spec/dummy/public/422.html +58 -0
  151. data/spec/dummy/public/500.html +57 -0
  152. data/spec/dummy/public/favicon.ico +0 -0
  153. data/spec/dummy/public/index.html.erb +14 -0
  154. data/spec/dummy/tmp/ember-rails/ember-data.js +11132 -0
  155. data/spec/dummy/tmp/ember-rails/ember.js +42882 -0
  156. data/spec/factories/post.rb +11 -0
  157. data/spec/features/user_visits_blog_post_spec.rb +44 -0
  158. data/spec/features/user_visits_blog_spec.rb +85 -0
  159. data/spec/models/blogelator/post_spec.rb +95 -0
  160. data/spec/qunit_runner.js +148 -0
  161. data/spec/spec_helper.rb +34 -0
  162. metadata +764 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 3aca22880d37994713e14ed58dbe9ac7ccc161d9
4
+ data.tar.gz: e5795b7752f41b454305ddd0c7d9357a2285e712
5
+ SHA512:
6
+ metadata.gz: 3314882f2e1291bac85daaddaf8543479d637d583d69af9b1747485abe84a9e7d2b1b737d5f93bea36b49dd880557922d58e889e5c31514456d6e3f14dcbbbb5
7
+ data.tar.gz: d0aecbf71408401db3051ae02aadc678842ef5020fb62aebc173542068c1ce339a4703382e2163b879caca04429778055732e486f42fe242ae57c76d1d1a6132
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2014 Codelation
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,86 @@
1
+ # Blogelator
2
+
3
+ [![Build Status](https://travis-ci.org/codelation/blogelator.png?branch=master)](https://travis-ci.org/codelation/blogelator)
4
+ [![Code Climate](https://codeclimate.com/github/codelation/blogelator.png)](https://codeclimate.com/github/codelation/blogelator)
5
+
6
+ Blogelator is a mountable `Rails::Engine` for adding a blog to your Rails app.
7
+
8
+ ## Features
9
+
10
+ - Awesome writing experience for developers with GitHub Flavored Markdown.
11
+ - [Ember.js](http://emberjs.com) backend with live GFM -> HTML preview.
12
+ - Follows [Spree](https://github.com/spree/spree)'s conventions for extending and overriding defaults
13
+
14
+ ## Installation
15
+
16
+ Add this line to your application's Gemfile:
17
+
18
+ ```ruby
19
+ gem "blogelator"
20
+ ```
21
+
22
+ Install the Blogelator gem with Bundler:
23
+
24
+ ```bash
25
+ $ bundle install
26
+ ```
27
+
28
+ Use the install generator to set up Blogelator:
29
+
30
+ ```bash
31
+ $ rails g blogelator:install
32
+ ```
33
+
34
+ ## Configuration
35
+
36
+ The install generator will create `config/initializers/blogelator.rb`:
37
+
38
+ ```ruby
39
+ Blogelator.posts_per_page = 5
40
+ Blogelator.site_name = "My Awesome Blog"
41
+ Blogelator.user_class = "User"
42
+ Blogelator.s3_access_key_id = ENV["BLOGELATOR_S3_KEY"]
43
+ Blogelator.s3_secret_access_key = ENV["BLOGELATOR_S3_SECRET"]
44
+ Blogelator.s3_bucket = ENV["BLOGELATOR_S3_BUCKET"]
45
+ ```
46
+
47
+ ### Authentication
48
+
49
+ Blogelator does not include authentication because there's a good chance
50
+ you've already added authentication to your Rails app.
51
+
52
+ TODO: Add info about requirements/configuration.
53
+
54
+ ### Authorization
55
+
56
+ Blogelator uses [CanCan](https://github.com/ryanb/cancan) for authorization.
57
+ By default, any logged in user can create, update, and delete any blog post.
58
+
59
+ TODO: Add example for limiting access to admin users.
60
+
61
+ ### Styles
62
+
63
+ The install generator will create three SCSS files in `app/assets/stylesheets/blogelator/`:
64
+
65
+ - **_variables.scss** - Easiest way to change fonts and/or colors
66
+ - **admin.css.scss** - Loads the default styles for the backend
67
+ - **application.css.scss** - Loads the default styles for the frontend
68
+
69
+ ### Views
70
+
71
+ View customization can be done by using [Deface](https://github.com/spree/deface)
72
+ or by replacing view templates. If you have experience with customizing
73
+ [Spree](https://github.com/spree/spree), you'll be right at home. Blogelator
74
+ aims to follow Spree's conventions, so you can simply follow their documentation:
75
+
76
+ > <http://guides.spreecommerce.com/developer/view.html#using-deface>
77
+
78
+ TODO: Add example for using Deface to add author's name to post
79
+
80
+ ## Contributing
81
+
82
+ 1. Fork it
83
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
84
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
85
+ 4. Push to the branch (`git push origin my-new-feature`)
86
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,29 @@
1
+ begin
2
+ require "bundler/setup"
3
+ rescue LoadError
4
+ puts "You must `gem install bundler` and `bundle install` to run rake tasks"
5
+ end
6
+
7
+ require "rdoc/task"
8
+
9
+ RDoc::Task.new(:rdoc) do |rdoc|
10
+ rdoc.rdoc_dir = "rdoc"
11
+ rdoc.title = "Blogelator"
12
+ rdoc.options << "--line-numbers"
13
+ rdoc.rdoc_files.include("README.rdoc")
14
+ rdoc.rdoc_files.include("lib/**/*.rb")
15
+ end
16
+
17
+ APP_RAKEFILE = File.expand_path("../spec/dummy/Rakefile", __FILE__)
18
+ load "rails/tasks/engine.rake"
19
+
20
+ Bundler::GemHelper.install_tasks
21
+ Dir[File.join(File.dirname(__FILE__), "tasks/**/*.rake")].each {|f| load f }
22
+
23
+ require "rspec/core"
24
+ require "rspec/core/rake_task"
25
+
26
+ desc "Run all specs in spec directory (excluding plugin specs)"
27
+ RSpec::Core::RakeTask.new(:spec => "app:db:test:prepare")
28
+
29
+ task :default => :spec
@@ -0,0 +1,15 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+ <svg width="1387px" height="416px" viewBox="0 0 1387 416" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns">
3
+ <title>Blogelator</title>
4
+ <description>Created with Sketch (http://www.bohemiancoding.com/sketch)</description>
5
+ <defs></defs>
6
+ <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage">
7
+ <g id="Blogelator" sketch:type="MSArtboardGroup" transform="translate(-43.000000, -44.000000)">
8
+ <g id="Large-copy-+-Large-copy" sketch:type="MSLayerGroup" transform="translate(42.000000, 44.000000)">
9
+ <path d="M275.462907,309 L0,155 L275.462907,1 L369,53.2927479 L187.074186,155 L369,256.707252 L275.462907,309 Z" id="Large-copy" fill="#CECECE" sketch:type="MSShapeGroup" transform="translate(185.000000, 154.500000) rotate(-180.000000) translate(-185.000000, -154.500000) "></path>
10
+ <path d="M275.462907,412 L0,258 L275.462907,104 L369,156.292748 L187.074186,258 L369,359.707252 L275.462907,412 Z" id="Large-copy" fill="#EAEAEA" sketch:type="MSShapeGroup" transform="translate(185.000000, 258.000000) rotate(-180.000000) translate(-185.000000, -258.000000) "></path>
11
+ </g>
12
+ <path d="M501,182.353656 L501,82.7771318 L537.373091,82.7771318 C543.827158,82.7771318 549.151682,83.5147283 553.346825,84.9899434 C557.541969,86.4651586 560.861153,88.493549 563.304478,91.0751755 C565.747803,93.6568019 567.453495,96.6302379 568.421605,99.9955724 C569.389715,103.360907 569.873762,106.88754 569.873762,110.575578 C569.873762,116.107635 568.744318,120.671513 566.485395,124.26735 C564.226471,127.863187 561.299135,130.698324 557.703298,132.772845 C554.107462,134.847366 550.027631,136.299509 545.463684,137.129318 C540.899737,137.959126 536.312809,138.374024 531.702762,138.374024 L510.404449,138.374024 L510.404449,182.353656 L501,182.353656 Z M531.979363,130.352582 C536.405008,130.352582 540.36959,130.075983 543.873226,129.522778 C547.376862,128.969572 550.350298,127.932327 552.793623,126.411011 C555.236948,124.889696 557.127039,122.815206 558.463952,120.187479 C559.800866,117.559752 560.469313,114.125318 560.469313,109.884074 C560.469313,103.61441 558.417873,98.8661326 554.314931,95.6390995 C550.211988,92.4120664 543.688869,90.798574 534.745378,90.798574 L510.404449,90.798574 L510.404449,130.352582 L531.979363,130.352582 Z M613.16189,184.289866 C608.551843,184.197665 604.241513,183.367869 600.230772,181.800453 C596.220031,180.233037 592.716448,177.881948 589.719917,174.747116 C586.723386,171.612284 584.349247,167.693802 582.597429,162.991554 C580.845611,158.289306 579.969716,152.803432 579.969716,146.533767 C579.969716,141.278313 580.661212,136.368687 582.044227,131.80474 C583.427241,127.240793 585.501731,123.253162 588.267759,119.841727 C591.033788,116.430292 594.491271,113.733455 598.640314,111.751134 C602.789356,109.768814 607.629834,108.777669 613.16189,108.777669 C618.786148,108.777669 623.672725,109.768814 627.821767,111.751134 C631.97081,113.733455 635.428294,116.407242 638.194322,119.772576 C640.96035,123.137911 643.011791,127.125542 644.348704,131.735589 C645.685618,136.345637 646.354065,141.278313 646.354065,146.533767 C646.354065,152.250226 645.570369,157.413402 644.002953,162.023449 C642.435537,166.633496 640.199697,170.598077 637.295367,173.917311 C634.391037,177.236546 630.887454,179.795083 626.784512,181.593002 C622.68157,183.39092 618.140741,184.289866 613.16189,184.289866 Z M637.502818,146.533767 C637.502818,142.292524 637.041821,138.327943 636.119811,134.639905 C635.197802,130.951867 633.768708,127.747932 631.832489,125.028004 C629.896269,122.308076 627.40688,120.164436 624.364249,118.59702 C621.321618,117.029604 617.587536,116.245908 613.16189,116.245908 C608.828446,116.245908 605.117413,117.098754 602.028682,118.804471 C598.93995,120.510189 596.427512,122.769078 594.491292,125.581207 C592.555072,128.393336 591.125979,131.620321 590.203969,135.262258 C589.28196,138.904195 588.820962,142.661328 588.820962,146.533767 C588.820962,150.959413 589.35111,155.039243 590.411421,158.773382 C591.471731,162.50752 593.016074,165.711455 595.044495,168.385282 C597.072916,171.05911 599.608404,173.1336 602.651035,174.608815 C605.693666,176.08403 609.19725,176.821627 613.16189,176.821627 C617.495335,176.821627 621.206367,175.968781 624.295099,174.263063 C627.383831,172.557346 629.896269,170.275407 631.832489,167.417177 C633.768708,164.558948 635.197802,161.331963 636.119811,157.736126 C637.041821,154.140289 637.502818,150.406207 637.502818,146.533767 Z M722.142864,171.289598 L740.951763,110.713879 L749.388107,110.713879 L726.153585,182.353656 L717.302338,182.353656 L701.674356,122.192839 L701.397755,122.192839 L685.493171,182.353656 L675.535519,182.353656 L653.684004,110.713879 L661.982047,110.713879 L680.514345,171.842801 L697.110432,110.713879 L706.376581,110.713879 L722.142864,171.289598 Z M766.537397,148.469978 C766.537397,152.342417 767.044495,156.00735 768.058705,159.464885 C769.072916,162.922421 770.571159,165.918907 772.553479,168.454433 C774.535799,170.989959 777.048238,173.018349 780.090869,174.539665 C783.1335,176.06098 786.637083,176.821627 790.601724,176.821627 C796.04158,176.821627 800.697658,175.392533 804.570098,172.534304 C808.442537,169.676075 811.024125,165.619294 812.314938,160.36384 L821.581087,160.36384 C820.566877,163.775275 819.229983,166.93311 817.570366,169.83744 C815.910749,172.74177 813.836259,175.277258 811.346833,177.44398 C808.857408,179.610702 805.907022,181.293344 802.495587,182.491957 C799.084152,183.690569 795.11957,184.289866 790.601724,184.289866 C784.885265,184.289866 779.952589,183.321771 775.803546,181.385551 C771.654504,179.449331 768.24312,176.798593 765.569292,173.433259 C762.895465,170.067924 760.913174,166.103343 759.622361,161.539396 C758.331548,156.975449 757.686151,152.065823 757.686151,146.810369 C757.686151,141.554915 758.446797,136.622238 759.968113,132.012191 C761.489429,127.402144 763.656118,123.368413 766.468247,119.910877 C769.280376,116.453342 772.71481,113.733455 776.771651,111.751134 C780.828493,109.768814 785.438471,108.777669 790.601724,108.777669 C800.467225,108.777669 808.211989,112.166003 813.836246,118.942772 C819.460504,125.719542 822.226491,135.561845 822.13429,148.469978 L766.537397,148.469978 Z M813.283043,141.554941 C813.283043,138.051305 812.798996,134.755171 811.830886,131.666439 C810.862776,128.577707 809.433683,125.90392 807.543563,123.644997 C805.653444,121.386074 803.279305,119.588182 800.421076,118.251268 C797.562846,116.914355 794.289762,116.245908 790.601724,116.245908 C786.913686,116.245908 783.663652,116.937405 780.851523,118.320419 C778.039394,119.703433 775.642205,121.547424 773.659885,123.852448 C771.677565,126.157472 770.087122,128.831259 768.88851,131.87389 C767.689898,134.916521 766.906201,138.143506 766.537397,141.554941 L813.283043,141.554941 Z M847.028421,182.353656 L838.730377,182.353656 L838.730377,110.713879 L847.028421,110.713879 L847.028421,124.129049 L847.305023,124.129049 C849.610046,118.412591 852.583482,114.42496 856.225419,112.166036 C859.867357,109.907113 864.684784,108.777669 870.677846,108.777669 L870.677846,117.767216 C865.975597,117.675015 862.103216,118.412611 859.060584,119.980028 C856.017953,121.547444 853.597715,123.668034 851.799796,126.341861 C850.001878,129.015688 848.757184,132.173524 848.065677,135.815461 C847.374169,139.457398 847.028421,143.26063 847.028421,147.225271 L847.028421,182.353656 Z M886.997331,148.469978 C886.997331,152.342417 887.504429,156.00735 888.518639,159.464885 C889.53285,162.922421 891.031093,165.918907 893.013413,168.454433 C894.995733,170.989959 897.508172,173.018349 900.550803,174.539665 C903.593434,176.06098 907.097017,176.821627 911.061658,176.821627 C916.501514,176.821627 921.157592,175.392533 925.030032,172.534304 C928.902471,169.676075 931.484059,165.619294 932.774872,160.36384 L942.041021,160.36384 C941.026811,163.775275 939.689917,166.93311 938.0303,169.83744 C936.370683,172.74177 934.296193,175.277258 931.806767,177.44398 C929.317342,179.610702 926.366956,181.293344 922.955521,182.491957 C919.544086,183.690569 915.579504,184.289866 911.061658,184.289866 C905.345199,184.289866 900.412523,183.321771 896.26348,181.385551 C892.114438,179.449331 888.703054,176.798593 886.029226,173.433259 C883.355399,170.067924 881.373108,166.103343 880.082295,161.539396 C878.791482,156.975449 878.146085,152.065823 878.146085,146.810369 C878.146085,141.554915 878.906731,136.622238 880.428047,132.012191 C881.949362,127.402144 884.116052,123.368413 886.928181,119.910877 C889.74031,116.453342 893.174744,113.733455 897.231585,111.751134 C901.288427,109.768814 905.898405,108.777669 911.061658,108.777669 C920.927159,108.777669 928.671923,112.166003 934.29618,118.942772 C939.920438,125.719542 942.686425,135.561845 942.594224,148.469978 L886.997331,148.469978 Z M933.742977,141.554941 C933.742977,138.051305 933.25893,134.755171 932.29082,131.666439 C931.32271,128.577707 929.893617,125.90392 928.003497,123.644997 C926.113378,121.386074 923.739239,119.588182 920.88101,118.251268 C918.02278,116.914355 914.749696,116.245908 911.061658,116.245908 C907.37362,116.245908 904.123586,116.937405 901.311457,118.320419 C898.499328,119.703433 896.102139,121.547424 894.119819,123.852448 C892.137499,126.157472 890.547056,128.831259 889.348444,131.87389 C888.149832,134.916521 887.366135,138.143506 886.997331,141.554941 L933.742977,141.554941 Z M1014.0957,82.7771318 L1022.39374,82.7771318 L1022.39374,182.353656 L1014.0957,182.353656 L1014.0957,169.76829 L1013.8191,169.76829 C1012.62049,172.165514 1011.07614,174.263054 1009.18602,176.060973 C1007.29591,177.858891 1005.22141,179.357134 1002.96249,180.555746 C1000.70357,181.754359 998.37553,182.676354 995.978305,183.321761 C993.58108,183.967168 991.229992,184.289866 988.924968,184.289866 C983.116308,184.289866 978.183632,183.321771 974.12679,181.385551 C970.069948,179.449331 966.727714,176.798593 964.099987,173.433259 C961.47226,170.067924 959.559119,166.080293 958.360507,161.470246 C957.161895,156.860199 956.562598,151.927522 956.562598,146.672068 C956.562598,141.693217 957.207994,136.89884 958.498808,132.288792 C959.789621,127.678745 961.748862,123.645014 964.376589,120.187479 C967.004316,116.729943 970.3235,113.963956 974.334241,111.889435 C978.344982,109.814914 983.07021,108.777669 988.510066,108.777669 C993.581118,108.777669 998.444645,109.907113 1003.10079,112.166036 C1007.75694,114.42496 1011.42187,117.767194 1014.0957,122.192839 L1014.0957,82.7771318 Z M1014.0957,146.257166 C1014.0957,142.200324 1013.5425,138.350992 1012.43609,134.709055 C1011.32968,131.067118 1009.73924,127.886233 1007.66472,125.166305 C1005.5902,122.446377 1003.05471,120.279687 1000.05818,118.666171 C997.061646,117.052654 993.673312,116.245908 989.893073,116.245908 C985.559628,116.245908 981.825546,117.098754 978.690714,118.804471 C975.555882,120.510189 972.974294,122.838228 970.945873,125.788658 C968.917452,128.739088 967.442259,132.173522 966.52025,136.092062 C965.59824,140.010603 965.229442,144.228733 965.413844,148.746579 C965.413844,153.264425 966.036191,157.252056 967.280904,160.709592 C968.525617,164.167127 970.254359,167.094464 972.467181,169.491688 C974.680004,171.888913 977.261592,173.709854 980.212022,174.954567 C983.162452,176.19928 986.389437,176.821627 989.893073,176.821627 C993.765513,176.821627 997.222996,176.03793 1000.26563,174.470514 C1003.30826,172.903098 1005.84375,170.759458 1007.87217,168.039531 C1009.90059,165.319603 1011.44493,162.092618 1012.50524,158.35848 C1013.56555,154.624341 1014.0957,150.59061 1014.0957,146.257166 Z M1090.99091,182.353656 L1082.69286,182.353656 L1082.69286,82.7771318 L1090.99091,82.7771318 L1090.99091,122.192839 C1093.66473,117.767194 1097.32967,114.42496 1101.98581,112.166036 C1106.64196,109.907113 1111.50549,108.777669 1116.57654,108.777669 C1122.0164,108.777669 1126.74162,109.814914 1130.75236,111.889435 C1134.76311,113.963956 1138.08229,116.729943 1140.71002,120.187479 C1143.33774,123.645014 1145.29698,127.678745 1146.5878,132.288792 C1147.87861,136.89884 1148.52401,141.693217 1148.52401,146.672068 C1148.52401,151.927522 1147.92471,156.860199 1146.7261,161.470246 C1145.52749,166.080293 1143.61435,170.067924 1140.98662,173.433259 C1138.35889,176.798593 1135.01666,179.449331 1130.95982,181.385551 C1126.90297,183.321771 1121.9703,184.289866 1116.16164,184.289866 C1113.85661,184.289866 1111.50552,183.967168 1109.1083,183.321761 C1106.71108,182.676354 1104.38304,181.754359 1102.12411,180.555746 C1099.86519,179.357134 1097.7907,177.858891 1095.90058,176.060973 C1094.01046,174.263054 1092.46612,172.165514 1091.26751,169.76829 L1090.99091,169.76829 L1090.99091,182.353656 Z M1090.99091,146.257166 C1090.99091,150.59061 1091.52105,154.624341 1092.58136,158.35848 C1093.64167,162.092618 1095.18602,165.319603 1097.21444,168.039531 C1099.24286,170.759458 1101.77835,172.903098 1104.82098,174.470514 C1107.86361,176.03793 1111.32109,176.821627 1115.19353,176.821627 C1118.69717,176.821627 1121.92415,176.19928 1124.87458,174.954567 C1127.82501,173.709854 1130.4066,171.888913 1132.61942,169.491688 C1134.83225,167.094464 1136.56099,164.167127 1137.8057,160.709592 C1139.05041,157.252056 1139.67276,153.264425 1139.67276,148.746579 C1139.85716,144.228733 1139.48836,140.010603 1138.56636,136.092062 C1137.64435,132.173522 1136.16915,128.739088 1134.14073,125.788658 C1132.11231,122.838228 1129.50767,120.510189 1126.32674,118.804471 C1123.14581,117.098754 1119.43478,116.245908 1115.19353,116.245908 C1111.41329,116.245908 1108.02496,117.052654 1105.02843,118.666171 C1102.0319,120.279687 1099.49641,122.446377 1097.42189,125.166305 C1095.34737,127.886233 1093.75693,131.067118 1092.65051,134.709055 C1091.5441,138.350992 1090.99091,142.200324 1090.99091,146.257166 Z M1165.6733,201.854058 C1166.77971,202.03846 1167.90915,202.222859 1169.06167,202.407261 C1170.21418,202.591663 1171.38972,202.683863 1172.58833,202.683863 C1174.89336,202.683863 1176.78345,201.946266 1178.25866,200.471051 C1179.73388,198.995836 1180.95552,197.220994 1181.92363,195.146473 C1182.89174,193.071952 1183.69849,190.905262 1184.3439,188.646339 C1184.9893,186.387416 1185.7269,184.474275 1186.55671,182.906859 L1158.75826,110.713879 L1168.02441,110.713879 L1190.98233,172.257703 L1213.94025,110.713879 L1222.9298,110.713879 L1196.23776,181.385551 C1194.57814,185.903397 1192.9877,189.960178 1191.46638,193.556015 C1189.94507,197.151852 1188.33158,200.217487 1186.62586,202.753013 C1184.92014,205.288539 1183.03005,207.22473 1180.95553,208.561644 C1178.88101,209.898557 1176.41467,210.567004 1173.55644,210.567004 C1172.08122,210.567004 1170.67518,210.474805 1169.33827,210.290403 C1168.00135,210.106001 1166.77971,209.875502 1165.6733,209.598899 L1165.6733,201.854058 Z M507.016082,415.736134 L507.016082,266.371348 L560.953366,266.371348 C569.666355,266.371348 577.13452,267.270294 583.358083,269.068212 C589.581647,270.866131 594.664148,273.424669 598.605739,276.743903 C602.547329,280.063137 605.417041,284.039243 607.214959,288.67234 C609.012877,293.305438 609.911823,298.387939 609.911823,303.919996 C609.911823,309.17545 609.220326,313.704753 607.837312,317.508042 C606.454298,321.311331 604.656407,324.492216 602.443584,327.050792 C600.230761,329.609369 597.706798,331.614709 594.871619,333.066874 C592.03644,334.519039 589.097579,335.521709 586.054948,336.074915 L586.054948,336.489817 C596.427554,338.011133 604.137743,342.090963 609.185744,348.729431 C614.233746,355.3679 616.757709,363.66586 616.757709,373.623562 C616.757709,381.368442 615.54759,387.937661 613.127315,393.331416 C610.70704,398.725172 607.353281,403.081601 603.065937,406.400835 C598.778593,409.720069 593.626943,412.105733 587.610831,413.557898 C581.594719,415.010063 575.060075,415.736134 568.006703,415.736134 L507.016082,415.736134 Z M521.122756,403.703971 L557.011795,403.703971 C564.756674,403.703971 571.498767,403.358222 577.238276,402.666715 C582.977785,401.975208 587.714538,400.55764 591.448676,398.413968 C595.182814,396.270296 597.983376,393.22771 599.850445,389.28612 C601.717514,385.344529 602.651035,380.123729 602.651035,373.623562 C602.651035,367.399999 601.61379,362.386647 599.539269,358.583358 C597.464747,354.780069 594.491311,351.841208 590.618872,349.766687 C586.746432,347.692166 582.113404,346.274597 576.719648,345.51394 C571.325893,344.753282 565.309872,344.372959 558.671404,344.372959 L521.122756,344.372959 L521.122756,403.703971 Z M521.122756,332.340795 L556.804344,332.340795 C564.134319,332.340795 570.28864,331.718448 575.267491,330.473735 C580.246342,329.229023 584.257023,327.396556 587.299654,324.976281 C590.342285,322.556007 592.5205,319.582571 593.834364,316.055884 C595.148227,312.529198 595.805149,308.483942 595.805149,303.919996 C595.805149,299.217747 595.044503,295.241641 593.523187,291.991558 C592.001871,288.741474 589.581633,286.113787 586.262399,284.108416 C582.943165,282.103046 578.62131,280.650903 573.296705,279.751943 C567.972101,278.852984 561.437457,278.403511 553.692577,278.403511 L521.122756,278.403511 L521.122756,332.340795 Z M645.38596,415.736134 L645.38596,266.371348 L657.833025,266.371348 L657.833025,415.736134 L645.38596,415.736134 Z M732.307967,418.640449 C725.392896,418.502148 718.927402,417.257454 712.91129,414.90633 C706.895179,412.555206 701.639803,409.028572 697.145007,404.326324 C692.650211,399.624076 689.089003,393.746354 686.461276,386.692981 C683.833549,379.639609 682.519705,371.410798 682.519705,362.006301 C682.519705,354.12312 683.55695,346.75868 685.631472,339.91276 C687.705993,333.06684 690.817728,327.085393 694.966771,321.968241 C699.115813,316.851088 704.302039,312.805832 710.525603,309.832352 C716.749167,306.858871 724.009882,305.372153 732.307967,305.372153 C740.744354,305.372153 748.074219,306.858871 754.297783,309.832352 C760.521347,312.805832 765.707572,316.816513 769.856615,321.864515 C774.005658,326.912517 777.082818,332.893964 779.088189,339.809034 C781.093559,346.724105 782.096229,354.12312 782.096229,362.006301 C782.096229,370.580989 780.920685,378.325753 778.569561,385.240824 C776.218437,392.155895 772.864678,398.102766 768.508183,403.081617 C764.151688,408.060469 758.896313,411.898275 752.7419,414.595153 C746.587487,417.292031 739.776244,418.640449 732.307967,418.640449 Z M768.819359,362.006301 C768.819359,355.644436 768.127863,349.697564 766.744849,344.165507 C765.361834,338.633451 763.218195,333.827548 760.313865,329.747657 C757.409535,325.667765 753.675453,322.452305 749.111506,320.101181 C744.547559,317.750057 738.946435,316.574512 732.307967,316.574512 C725.807801,316.574512 720.241252,317.853781 715.608154,320.412357 C710.975057,322.970934 707.2064,326.359268 704.30207,330.577461 C701.39774,334.795654 699.2541,339.636131 697.871086,345.099037 C696.488072,350.561943 695.796575,356.197642 695.796575,362.006301 C695.796575,368.644769 696.591796,374.764515 698.182263,380.365723 C699.772729,385.96693 702.089243,390.772833 705.131874,394.783574 C708.174506,398.794315 711.977738,401.90605 716.541684,404.118873 C721.105631,406.331696 726.361006,407.43809 732.307967,407.43809 C738.808134,407.43809 744.374683,406.158821 749.00778,403.600245 C753.640878,401.041669 757.409535,397.61876 760.313865,393.331416 C763.218195,389.044072 765.361834,384.203595 766.744849,378.80984 C768.127863,373.416084 768.819359,367.814961 768.819359,362.006301 Z M887.896286,308.276469 L900.343352,308.276469 L900.343352,405.36358 C900.343352,412.555253 899.61728,419.435646 898.165115,426.004963 C896.71295,432.574281 894.119838,438.348278 890.385699,443.327129 C886.651561,448.30598 881.534485,452.282087 875.034318,455.255567 C868.534152,458.229048 860.167041,459.715766 849.932736,459.715766 C842.049555,459.715766 835.272888,458.713095 829.602529,456.707725 C823.932171,454.702354 819.299143,452.178391 815.703306,449.13576 C812.107469,446.093129 809.376057,442.73937 807.508988,439.074382 C805.641919,435.409394 804.639249,431.986486 804.500947,428.805553 L817.777817,428.805553 C818.745927,432.816294 820.26722,436.100903 822.341741,438.65948 C824.416262,441.218056 826.871076,443.223396 829.706255,444.675561 C832.541434,446.127726 835.687744,447.130397 839.14528,447.683602 C842.602815,448.236808 846.198598,448.513407 849.932736,448.513407 C858.369123,448.513407 865.145791,447.061263 870.262943,444.156934 C875.380096,441.252604 879.252478,437.449372 881.880205,432.747124 C884.507931,428.044875 886.202098,422.720351 886.962756,416.77339 C887.723414,410.826429 888.034588,404.741257 887.896286,398.517693 C883.885545,405.156162 878.388146,410.169513 871.403924,413.557898 C864.419703,416.946282 857.124412,418.640449 849.517834,418.640449 C841.35805,418.640449 834.270209,417.084582 828.254097,413.9728 C822.237986,410.861018 817.259209,406.712038 813.317619,401.525734 C809.376028,396.339431 806.437167,390.288835 804.500947,383.373764 C802.564727,376.458693 801.596632,369.267127 801.596632,361.79885 C801.596632,353.915669 802.495578,346.516654 804.293496,339.601583 C806.091415,332.686512 808.961126,326.705066 812.902716,321.657064 C816.844307,316.609062 821.857658,312.632956 827.942921,309.728626 C834.028183,306.824296 841.427198,305.372153 850.140187,305.372153 C853.597723,305.372153 857.124356,305.856201 860.720193,306.824311 C864.31603,307.792421 867.808089,309.175414 871.196473,310.973333 C874.584858,312.771251 877.696593,315.05319 880.531772,317.819219 C883.366952,320.585247 885.683466,323.696982 887.481384,327.154518 L887.896286,327.154518 L887.896286,308.276469 Z M887.896286,362.421204 C887.896286,355.921037 887.101065,349.87044 885.510599,344.269233 C883.920132,338.668025 881.603618,333.827548 878.560987,329.747657 C875.518356,325.667765 871.715124,322.452305 867.151177,320.101181 C862.58723,317.750057 857.401005,316.574512 851.592345,316.574512 C846.336891,316.574512 841.496414,317.508033 837.070769,319.375102 C832.645123,321.242171 828.772742,323.973583 825.453508,327.56942 C822.134273,331.165257 819.541161,335.556261 817.674092,340.742564 C815.807022,345.928868 814.873502,351.910314 814.873502,358.687084 C814.596899,365.463853 815.150096,371.791048 816.533111,377.668859 C817.916125,383.546669 820.128914,388.69832 823.171546,393.123965 C826.214177,397.549611 830.086558,401.041669 834.788807,403.600245 C839.491055,406.158821 845.092178,407.43809 851.592345,407.43809 C857.262703,407.43809 862.345204,406.227971 866.84,403.807696 C871.334796,401.387421 875.138028,398.137387 878.24981,394.057495 C881.361592,389.977603 883.747256,385.206276 885.406873,379.74337 C887.06649,374.280464 887.896286,368.506466 887.896286,362.421204 Z M939.344157,364.910617 C939.344157,370.719276 940.104803,376.216675 941.626119,381.402978 C943.147435,386.589282 945.394799,391.08401 948.368279,394.887299 C951.34176,398.690588 955.110417,401.733174 959.674364,404.015147 C964.238311,406.297121 969.493686,407.43809 975.440647,407.43809 C983.600431,407.43809 990.584548,405.294451 996.393207,401.007107 C1002.20187,396.719763 1006.07425,390.634591 1008.01047,382.75141 L1021.90969,382.75141 C1020.38838,387.868563 1018.38304,392.605316 1015.89361,396.96181 C1013.40418,401.318305 1010.29245,405.121537 1006.55831,408.37162 C1002.82417,411.621704 998.398593,414.145667 993.281441,415.943585 C988.164288,417.741504 982.217416,418.640449 975.440647,418.640449 C966.865959,418.640449 959.466944,417.188306 953.24338,414.283976 C947.019816,411.379647 941.90274,407.40354 937.891999,402.355539 C933.881258,397.307537 930.907822,391.360665 928.971602,384.514745 C927.035382,377.668825 926.067287,370.304384 926.067287,362.421204 C926.067287,354.538023 927.208257,347.139008 929.49023,340.223937 C931.772203,333.308866 935.022238,327.258269 939.240431,322.071966 C943.458625,316.885663 948.610275,312.805832 954.695538,309.832352 C960.7808,306.858871 967.695767,305.372153 975.440647,305.372153 C990.238899,305.372153 1001.85604,310.454654 1010.29243,320.619809 C1018.72882,330.784963 1022.8778,345.548418 1022.7395,364.910617 L939.344157,364.910617 Z M1009.46263,354.538062 C1009.46263,349.282608 1008.73655,344.338407 1007.28439,339.705309 C1005.83222,335.072211 1003.68858,331.06153 1000.85341,327.673146 C998.018227,324.284761 994.457018,321.587924 990.169674,319.582553 C985.88233,317.577182 980.972704,316.574512 975.440647,316.574512 C969.90859,316.574512 965.033538,317.611757 960.815345,319.686279 C956.597152,321.7608 953.001369,324.526787 950.027888,327.984322 C947.054408,331.441858 944.668744,335.452539 942.870825,340.016486 C941.072907,344.580432 939.897363,349.420909 939.344157,354.538062 L1009.46263,354.538062 Z M1048.87833,415.736134 L1048.87833,266.371348 L1061.3254,266.371348 L1061.3254,415.736134 L1048.87833,415.736134 Z M1142.43878,353.085904 C1144.7899,352.809302 1147.59046,352.394403 1150.84055,351.841198 C1154.09063,351.287992 1156.75289,350.527346 1158.82741,349.559236 C1160.90193,348.591126 1162.1812,346.966109 1162.66526,344.684135 C1163.14931,342.402162 1163.39134,340.293097 1163.39134,338.356877 C1163.39134,331.995012 1161.35142,326.774211 1157.27153,322.694319 C1153.19164,318.614428 1146.31124,316.574512 1136.63015,316.574512 C1132.3428,316.574512 1128.40127,316.954835 1124.80543,317.715493 C1121.2096,318.476151 1118.06329,319.789995 1115.36641,321.657064 C1112.66953,323.524133 1110.45674,326.013521 1108.72797,329.125303 C1106.99921,332.237085 1105.85824,336.144042 1105.30503,340.84629 L1092.65051,340.84629 C1093.06542,334.484425 1094.51756,329.056175 1097.00699,324.561379 C1099.49641,320.066583 1102.71187,316.40165 1106.65346,313.566471 C1110.59505,310.731292 1115.15893,308.656802 1120.34523,307.342939 C1125.53154,306.029075 1131.02894,305.372153 1136.8376,305.372153 C1142.23135,305.372153 1147.31385,305.959925 1152.08525,307.135488 C1156.85665,308.31105 1161.00563,310.178091 1164.53232,312.736667 C1168.059,315.295243 1170.82499,318.718152 1172.83036,323.005496 C1174.83573,327.29284 1175.8384,332.548215 1175.8384,338.771779 L1175.8384,397.272987 C1175.8384,402.113537 1176.70277,405.190697 1178.43154,406.504561 C1180.16031,407.818424 1183.65237,407.50725 1188.90782,405.571031 L1188.90782,415.321232 C1187.93971,415.597835 1186.52214,416.012733 1184.65507,416.565938 C1182.788,417.119144 1180.95554,417.395743 1179.15762,417.395743 C1177.2214,417.395743 1175.35436,417.188294 1173.55644,416.77339 C1171.48192,416.496787 1169.82233,415.839865 1168.57761,414.802604 C1167.3329,413.765344 1166.33023,412.520649 1165.56957,411.068485 C1164.80891,409.61632 1164.29029,408.025877 1164.01369,406.297109 C1163.73709,404.568342 1163.59879,402.735875 1163.59879,400.799655 C1158.34333,406.608315 1152.32731,411.033894 1145.55054,414.076525 C1138.77377,417.119157 1131.44391,418.640449 1123.56073,418.640449 C1118.85848,418.640449 1114.32917,418.018102 1109.97268,416.77339 C1105.61619,415.528677 1101.77838,413.592486 1098.45914,410.964759 C1095.13991,408.337032 1092.51222,405.121572 1090.576,401.318283 C1088.63978,397.514994 1087.67169,392.985691 1087.67169,387.730237 C1087.67169,369.474449 1100.18778,358.6871 1125.22034,355.367866 L1142.43878,353.085904 Z M1163.39134,359.309437 C1158.13588,361.52226 1152.81136,362.974403 1147.4176,363.66591 C1142.02385,364.357417 1136.63017,364.910615 1131.23642,365.325519 C1121.69362,366.017026 1114.26003,368.160666 1108.93542,371.756503 C1103.61082,375.35234 1100.94856,380.815164 1100.94856,388.145139 C1100.94856,391.464373 1101.60548,394.334084 1102.91934,396.754359 C1104.23321,399.174634 1105.96195,401.179975 1108.10562,402.770441 C1110.24929,404.360907 1112.73868,405.536452 1115.57386,406.297109 C1118.40904,407.057767 1121.27875,407.43809 1124.18308,407.43809 C1129.16193,407.43809 1134.00241,406.815743 1138.70466,405.571031 C1143.4069,404.326318 1147.59046,402.424702 1151.25545,399.866126 C1154.92043,397.307549 1157.8593,394.057515 1160.07212,390.115924 C1162.28494,386.174334 1163.39134,381.506731 1163.39134,376.112976 L1163.39134,359.309437 Z M1246.16432,416.151036 C1244.64301,416.427639 1242.63767,416.911687 1240.14824,417.603194 C1237.65881,418.294701 1234.89283,418.640449 1231.8502,418.640449 C1225.62663,418.640449 1220.88988,417.084582 1217.6398,413.9728 C1214.38971,410.861018 1212.7647,405.294469 1212.7647,397.272987 L1212.7647,318.649023 L1197.62077,318.649023 L1197.62077,308.276469 L1212.7647,308.276469 L1212.7647,278.403511 L1225.21176,278.403511 L1225.21176,308.276469 L1245.33452,308.276469 L1245.33452,318.649023 L1225.21176,318.649023 L1225.21176,392.294161 C1225.21176,394.921888 1225.28091,397.203827 1225.41921,399.140047 C1225.55751,401.076267 1225.97241,402.666709 1226.66392,403.911422 C1227.35543,405.156135 1228.42725,406.05508 1229.87941,406.608286 C1231.33158,407.161492 1233.37149,407.43809 1235.99922,407.43809 C1237.65884,407.43809 1239.353,407.299791 1241.08177,407.023188 C1242.81054,406.746585 1244.5047,406.400837 1246.16432,405.985933 L1246.16432,416.151036 Z M1308.81455,418.640449 C1301.89948,418.502148 1295.43399,417.257454 1289.41787,414.90633 C1283.40176,412.555206 1278.14639,409.028572 1273.65159,404.326324 C1269.1568,399.624076 1265.59559,393.746354 1262.96786,386.692981 C1260.34013,379.639609 1259.02629,371.410798 1259.02629,362.006301 C1259.02629,354.12312 1260.06353,346.75868 1262.13806,339.91276 C1264.21258,333.06684 1267.32431,327.085393 1271.47335,321.968241 C1275.6224,316.851088 1280.80862,312.805832 1287.03219,309.832352 C1293.25575,306.858871 1300.51647,305.372153 1308.81455,305.372153 C1317.25094,305.372153 1324.5808,306.858871 1330.80437,309.832352 C1337.02793,312.805832 1342.21416,316.816513 1346.3632,321.864515 C1350.51224,326.912517 1353.5894,332.893964 1355.59477,339.809034 C1357.60014,346.724105 1358.60281,354.12312 1358.60281,362.006301 C1358.60281,370.580989 1357.42727,378.325753 1355.07614,385.240824 C1352.72502,392.155895 1349.37126,398.102766 1345.01477,403.081617 C1340.65827,408.060469 1335.4029,411.898275 1329.24848,414.595153 C1323.09407,417.292031 1316.28283,418.640449 1308.81455,418.640449 Z M1345.32594,362.006301 C1345.32594,355.644436 1344.63445,349.697564 1343.25143,344.165507 C1341.86842,338.633451 1339.72478,333.827548 1336.82045,329.747657 C1333.91612,325.667765 1330.18204,322.452305 1325.61809,320.101181 C1321.05414,317.750057 1315.45302,316.574512 1308.81455,316.574512 C1302.31438,316.574512 1296.74784,317.853781 1292.11474,320.412357 C1287.48164,322.970934 1283.71298,326.359268 1280.80865,330.577461 C1277.90432,334.795654 1275.76068,339.636131 1274.37767,345.099037 C1272.99466,350.561943 1272.30316,356.197642 1272.30316,362.006301 C1272.30316,368.644769 1273.09838,374.764515 1274.68885,380.365723 C1276.27931,385.96693 1278.59583,390.772833 1281.63846,394.783574 C1284.68109,398.794315 1288.48432,401.90605 1293.04827,404.118873 C1297.61222,406.331696 1302.86759,407.43809 1308.81455,407.43809 C1315.31472,407.43809 1320.88127,406.158821 1325.51436,403.600245 C1330.14746,401.041669 1333.91612,397.61876 1336.82045,393.331416 C1339.72478,389.044072 1341.86842,384.203595 1343.25143,378.80984 C1344.63445,373.416084 1345.32594,367.814961 1345.32594,362.006301 Z M1394.49185,415.736134 L1382.04479,415.736134 L1382.04479,308.276469 L1394.49185,308.276469 L1394.49185,328.399224 L1394.90675,328.399224 C1398.36429,319.824536 1402.82444,313.84309 1408.28735,310.454705 C1413.75026,307.06632 1420.9764,305.372153 1429.96599,305.372153 L1429.96599,318.856474 C1422.91262,318.718173 1417.10404,319.824568 1412.5401,322.175692 C1407.97615,324.526816 1404.34579,327.707701 1401.64891,331.718442 C1398.95204,335.729183 1397.085,340.465936 1396.04774,345.928842 C1395.01047,351.391748 1394.49185,357.096596 1394.49185,363.043557 L1394.49185,415.736134 Z" id="Powered-by" fill="#A9A9A9" sketch:type="MSShapeGroup"></path>
13
+ </g>
14
+ </g>
15
+ </svg>
@@ -0,0 +1,19 @@
1
+ //= require jquery
2
+ //= require jquery_ujs
3
+ //= require handlebars
4
+ //= require ember
5
+ //= require ember-data
6
+ //= require moment
7
+ //= require_self
8
+ //= require_tree ./config
9
+ //= require_tree ./components
10
+ //= require_tree ./controllers
11
+ //= require_tree ./models
12
+ //= require_tree ./routes
13
+ //= require_tree ./templates
14
+ //= require_tree ./views
15
+
16
+ App = Ember.Application.create({
17
+ LOG_TRANSITIONS: true,
18
+ blogelatorPath: '/' + (location.pathname.split('/')[1] === 'admin' ? '' : location.pathname.split('/')[1])
19
+ });
@@ -0,0 +1,2 @@
1
+ //= require local_time
2
+ //= require_self
@@ -0,0 +1,187 @@
1
+ //= require codemirror/codemirror
2
+ //= require codemirror/closebrackets
3
+ //= require codemirror/overlay
4
+ //= require codemirror/markdown
5
+ //= require codemirror/gfm
6
+ //= require codemirror/coffeescript
7
+ //= require codemirror/css
8
+ //= require codemirror/htmlmixed
9
+ //= require codemirror/javascript
10
+ //= require codemirror/php
11
+ //= require codemirror/ruby
12
+ //= require codemirror/sass
13
+ //= require codemirror/xml
14
+ //= require codemirror/yaml
15
+ //= require inline-attach
16
+ //= require marked
17
+
18
+ (function() {
19
+ "use strict";
20
+
21
+ App.MarkdownEditorComponent = Ember.Component.extend({
22
+ classNames: ['blogelator-markdown-editor'],
23
+ parseDelay: 100,
24
+ resizeDelay: 50,
25
+ scrollDelay: 10,
26
+
27
+ didInsertElement: function() {
28
+ var textArea = this.$('textarea')[0],
29
+ editor = CodeMirror.fromTextArea(textArea, {
30
+ autoCloseBrackets: true,
31
+ indentWithTabs: false,
32
+ lineWrapping: true,
33
+ mode: 'gfm',
34
+ smartIndent: false,
35
+ tabSize: 2
36
+ });
37
+
38
+ // Replace tab with spaces
39
+ editor.addKeyMap({
40
+ Tab: function(cm) {
41
+ var spaces = new Array(cm.getOption("indentUnit") + 1).join(" ");
42
+ cm.replaceSelection(spaces, "end", "+input");
43
+ }
44
+ });
45
+ this.set('editor', editor);
46
+
47
+ // Capture Command/Ctrl + S
48
+ var self = this;
49
+ $(this.get('element')).on('keydown', function(e) {
50
+ if (e.keyCode === 83 && (e.metaKey || e.ctrlKey)) {
51
+ self.sendAction();
52
+ return false;
53
+ }
54
+ });
55
+ },
56
+
57
+ editorDidChange: function() {
58
+ var editor = this.get('editor'),
59
+ preview = this.$('.html-preview .post'),
60
+ parseContext = { name: 'parseMarkdown' },
61
+ parseDelay = this.get('parseDelay'),
62
+ scrollContext = { name: 'scrollViewport' },
63
+ scrollDelay = this.get('scrollDelay'),
64
+ viewport = $(this.get('element')),
65
+ self = this;
66
+
67
+ // Set initial editor value from component content
68
+ editor.setValue(this.get('content'));
69
+
70
+ // Syncs the preview scroll top from editor scroll top
71
+ var syncEditorScrolling = function() {
72
+ var viewportHeight = viewport.height(),
73
+ editorScrollInfo = editor.getScrollInfo(),
74
+ codeHeight = editorScrollInfo.height - viewportHeight,
75
+ codeTop = editorScrollInfo.top,
76
+ previewHeight = preview[0].scrollHeight - viewportHeight,
77
+ ratio = previewHeight / codeHeight;
78
+
79
+ preview.scrollTop(codeTop * ratio);
80
+ };
81
+
82
+ // Syncs the component content w/ the new editor value
83
+ // And syncs scrolling after a change occurs
84
+ var updateContent = function() {
85
+ self.set('content', editor.getValue());
86
+ Ember.run.debounce(scrollContext, syncEditorScrolling, scrollDelay);
87
+ };
88
+
89
+ // Update preview on change
90
+ editor.on('change', function() {
91
+ Ember.run.debounce(parseContext, updateContent, parseDelay);
92
+ });
93
+
94
+ // Scroll preview when markdown is scrolled
95
+ editor.on('scroll', function() {
96
+ Ember.run.debounce(scrollContext, syncEditorScrolling, scrollDelay);
97
+ });
98
+
99
+ // Handle image drag and drop uploading
100
+ this._addInlineAttach(editor);
101
+ }.observes('editor'),
102
+
103
+ html: function() {
104
+ var content = this.get('content');
105
+ if (Ember.isNone(content)) {
106
+ content = '';
107
+ }
108
+ return marked(content);
109
+ }.property('content'),
110
+
111
+ willDestroyElement: function() {
112
+ // Remove scrolling observers
113
+ var editor = this.get('editor');
114
+ editor.off('change');
115
+ editor.off('scroll');
116
+ // Remove Command/Ctrl + S observer
117
+ $(this.get('element')).off('keydown');
118
+ },
119
+
120
+ _addInlineAttach: function(editor) {
121
+ function CodeMirrorEditor(instance) {
122
+ var codeMirror = instance;
123
+
124
+ return {
125
+ getValue: function() {
126
+ return codeMirror.getValue();
127
+ },
128
+ setValue: function(val) {
129
+ var cursor = codeMirror.getCursor();
130
+ codeMirror.setValue(val);
131
+ codeMirror.setCursor(cursor);
132
+ }
133
+ };
134
+ }
135
+ CodeMirrorEditor.prototype = new inlineAttach.Editor();
136
+
137
+ var inlineAttachInstance,
138
+ inlineAttachEditor = new CodeMirrorEditor(editor);
139
+
140
+ inlineAttachInstance = new inlineAttach({
141
+ customUploadHandler: function(file) {
142
+ var formData = new FormData(),
143
+ filename = 'image-',
144
+ extension = 'png',
145
+ uploadUrl = (App.get('blogelatorPath') === '/' ? '/' : App.get('blogelatorPath') + '/') + 'api/images';
146
+
147
+ // Attach the file. If coming from clipboard, add a default filename (only works in Chrome for now)
148
+ // http://stackoverflow.com/questions/6664967/how-to-give-a-blob-uploaded-as-formdata-a-file-name
149
+ if (file.name) {
150
+ var fileNameMatches = file.name.match(/\.(.+)$/);
151
+ if (fileNameMatches) {
152
+ extension = fileNameMatches[1];
153
+ filename = file.name.replace('.' + extension, '-');
154
+ }
155
+ }
156
+ formData.append('file', file, filename + Date.now() + '.' + extension);
157
+
158
+ $.ajax({
159
+ url: uploadUrl,
160
+ data: formData,
161
+ processData: false,
162
+ contentType: false,
163
+ type: 'POST',
164
+ success: function(data){
165
+ inlineAttachInstance.onUploadedFile(data);
166
+ },
167
+ error: function() {
168
+ inlineAttachInstance.onErrorUploading();
169
+ }
170
+ });
171
+
172
+ return false;
173
+ },
174
+ urlText: "![image]({filename})"
175
+ }, inlineAttachEditor);
176
+
177
+ editor.setOption('onDragEvent', function(data, e) {
178
+ if (e.type === "drop") {
179
+ e.stopPropagation();
180
+ e.preventDefault();
181
+ return inlineAttachInstance.onDrop(e);
182
+ }
183
+ });
184
+ }
185
+ });
186
+
187
+ })();
@@ -0,0 +1,76 @@
1
+ (function() {
2
+ "use strict";
3
+
4
+ App.SaveButtonComponent = Ember.Component.extend({
5
+ attributeBindings: ['href'],
6
+ classNames: ['save-button'],
7
+ classNameBindings: ['disabled', 'isConfirming:confirm', 'isSaving:saving', 'isSaved:saved', 'isError:error'],
8
+ href: '#',
9
+ isDisabled: false,
10
+ isConfirming: false,
11
+ isSaving: false,
12
+ isSaved: false,
13
+ isError: false,
14
+ tagName: 'a',
15
+
16
+ click: function(event) {
17
+ if (this.get('isSaving') || this.get('isDisabled')) {
18
+ return false;
19
+ }
20
+
21
+ if (this.get('confirm')) {
22
+ if (!this.get('isConfirming')) {
23
+ this.set('isConfirming', true);
24
+ return false;
25
+ } else {
26
+ this.set('isConfirming', false);
27
+ if ($(event.target).hasClass('no')) {
28
+ return false;
29
+ }
30
+ }
31
+ }
32
+
33
+ var defer = Ember.RSVP.defer(),
34
+ self = this;
35
+
36
+ defer.promise.then(function() {
37
+ if (self && !self.isDestroyed) {
38
+ self.set('isSaved', true);
39
+ self.set('isSaving', false);
40
+ }
41
+ Ember.run.later(function() {
42
+ if (self && !self.isDestroyed) {
43
+ self.set('isSaved', false);
44
+ }
45
+ }, 800);
46
+ }, function() {
47
+ if (self && !self.isDestroyed) {
48
+ self.set('isError', true);
49
+ self.set('isSaving', false);
50
+ }
51
+ Ember.run.later(function() {
52
+ if (self && !self.isDestroyed) {
53
+ self.set('isError', false);
54
+ }
55
+ }, 800);
56
+ });
57
+
58
+ this.set('isSaving', true);
59
+ this.sendAction('action', defer);
60
+
61
+ return false;
62
+ },
63
+
64
+ disabled: function() {
65
+ if (this.get('isSaving') ||
66
+ this.get('isSaved') ||
67
+ this.get('isError')
68
+ ) {
69
+ return false;
70
+ } else {
71
+ return this.get('isDisabled');
72
+ }
73
+ }.property('isDisabled', 'isSaving', 'isSaved', 'isError')
74
+ });
75
+
76
+ })();