ecrire 0.20.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (233) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +20 -0
  3. data/Gemfile +4 -0
  4. data/LICENCE +9 -0
  5. data/README.md +62 -0
  6. data/Rakefile +72 -0
  7. data/bin/ecrire +42 -0
  8. data/ecrire.gemspec +26 -0
  9. data/lib/ecrire/app/assets/javascripts/admin/editor/content.coffee +319 -0
  10. data/lib/ecrire/app/assets/javascripts/admin/editor/ext.coffee +94 -0
  11. data/lib/ecrire/app/assets/javascripts/admin/editor/extensions/clipboard.coffee +98 -0
  12. data/lib/ecrire/app/assets/javascripts/admin/editor/extensions/image.coffee +19 -0
  13. data/lib/ecrire/app/assets/javascripts/admin/editor/navigation/delete.js.coffee +11 -0
  14. data/lib/ecrire/app/assets/javascripts/admin/editor/navigation/draft.js.coffee +42 -0
  15. data/lib/ecrire/app/assets/javascripts/admin/editor/navigation/help.js.coffee +6 -0
  16. data/lib/ecrire/app/assets/javascripts/admin/editor/navigation/save.js.coffee +61 -0
  17. data/lib/ecrire/app/assets/javascripts/admin/editor/navigation/sticky.js.coffee +11 -0
  18. data/lib/ecrire/app/assets/javascripts/admin/editor/navigation/toggle.js.coffee +10 -0
  19. data/lib/ecrire/app/assets/javascripts/admin/editor/parsers/code.coffee +39 -0
  20. data/lib/ecrire/app/assets/javascripts/admin/editor/parsers/heading.coffee +19 -0
  21. data/lib/ecrire/app/assets/javascripts/admin/editor/parsers/image.coffee +129 -0
  22. data/lib/ecrire/app/assets/javascripts/admin/editor/parsers/link.coffee +44 -0
  23. data/lib/ecrire/app/assets/javascripts/admin/editor/parsers/lists.coffee +48 -0
  24. data/lib/ecrire/app/assets/javascripts/admin/editor/parsers/word.coffee +56 -0
  25. data/lib/ecrire/app/assets/javascripts/admin/posts/header.coffee +69 -0
  26. data/lib/ecrire/app/assets/javascripts/admin/posts/new.js.coffee +7 -0
  27. data/lib/ecrire/app/assets/javascripts/admin/posts/title.coffee +15 -0
  28. data/lib/ecrire/app/assets/javascripts/admin.js +5 -0
  29. data/lib/ecrire/app/assets/javascripts/application.js +21 -0
  30. data/lib/ecrire/app/assets/javascripts/shared/overlay.js.coffee +29 -0
  31. data/lib/ecrire/app/assets/javascripts/shared/popup.js.coffee +7 -0
  32. data/lib/ecrire/app/assets/javascripts/vendor/moment.js +3043 -0
  33. data/lib/ecrire/app/assets/javascripts/vendor/prism/prism.ruby.js +25 -0
  34. data/lib/ecrire/app/assets/javascripts/vendor/prism.js +578 -0
  35. data/lib/ecrire/app/assets/stylesheets/admin/base.css.scss +98 -0
  36. data/lib/ecrire/app/assets/stylesheets/admin/documentation.css.scss +28 -0
  37. data/lib/ecrire/app/assets/stylesheets/admin/editor/base.css.scss +41 -0
  38. data/lib/ecrire/app/assets/stylesheets/admin/editor/content.css.scss +57 -0
  39. data/lib/ecrire/app/assets/stylesheets/admin/editor/header.css.scss +62 -0
  40. data/lib/ecrire/app/assets/stylesheets/admin/editor/image.css.scss +58 -0
  41. data/lib/ecrire/app/assets/stylesheets/admin/editor/publish.css.scss +40 -0
  42. data/lib/ecrire/app/assets/stylesheets/admin/editor/save.css.scss +44 -0
  43. data/lib/ecrire/app/assets/stylesheets/admin/images.css.scss +64 -0
  44. data/lib/ecrire/app/assets/stylesheets/admin/loading.css.scss +48 -0
  45. data/lib/ecrire/app/assets/stylesheets/admin/mixins/animations.css.scss +30 -0
  46. data/lib/ecrire/app/assets/stylesheets/admin/mixins/form.css.scss +22 -0
  47. data/lib/ecrire/app/assets/stylesheets/admin/navigation.css.scss +96 -0
  48. data/lib/ecrire/app/assets/stylesheets/admin/posts.css.scss +46 -0
  49. data/lib/ecrire/app/assets/stylesheets/admin/variables.css.scss +7 -0
  50. data/lib/ecrire/app/assets/stylesheets/admin.css.scss +5 -0
  51. data/lib/ecrire/app/assets/stylesheets/application.css.scss +12 -0
  52. data/lib/ecrire/app/assets/stylesheets/sessions.css.scss +97 -0
  53. data/lib/ecrire/app/assets/stylesheets/shared/main.css.scss +5 -0
  54. data/lib/ecrire/app/assets/stylesheets/shared/popup.css.scss +76 -0
  55. data/lib/ecrire/app/assets/stylesheets/vendor/prism/ruby.scss +11 -0
  56. data/lib/ecrire/app/assets/stylesheets/vendor/prism.scss +149 -0
  57. data/lib/ecrire/app/controllers/admin/application_controller.rb +16 -0
  58. data/lib/ecrire/app/controllers/admin/configurations/images_controller.rb +28 -0
  59. data/lib/ecrire/app/controllers/admin/images_controller.rb +35 -0
  60. data/lib/ecrire/app/controllers/admin/labels_controller.rb +18 -0
  61. data/lib/ecrire/app/controllers/admin/partials_controller.rb +43 -0
  62. data/lib/ecrire/app/controllers/admin/posts_controller.rb +90 -0
  63. data/lib/ecrire/app/controllers/admin/properties_controller.rb +35 -0
  64. data/lib/ecrire/app/controllers/application_controller.rb +29 -0
  65. data/lib/ecrire/app/controllers/concerns/.keep +0 -0
  66. data/lib/ecrire/app/controllers/ecrire/posts_controller.rb +42 -0
  67. data/lib/ecrire/app/controllers/images_controller.rb +2 -0
  68. data/lib/ecrire/app/controllers/onboarding/databases_controller.rb +67 -0
  69. data/lib/ecrire/app/controllers/onboarding/users_controller.rb +32 -0
  70. data/lib/ecrire/app/controllers/onboarding_controller.rb +20 -0
  71. data/lib/ecrire/app/controllers/partials_controller.rb +8 -0
  72. data/lib/ecrire/app/controllers/sessions_controller.rb +23 -0
  73. data/lib/ecrire/app/controllers/static_controller.rb +5 -0
  74. data/lib/ecrire/app/forms/admin/image_builder.rb +24 -0
  75. data/lib/ecrire/app/forms/admin/partial_builder.rb +105 -0
  76. data/lib/ecrire/app/forms/admin/post_builder.rb +47 -0
  77. data/lib/ecrire/app/helpers/admin/images_helper.rb +60 -0
  78. data/lib/ecrire/app/helpers/admin/labels_helper.rb +26 -0
  79. data/lib/ecrire/app/helpers/admin/posts_helper.rb +26 -0
  80. data/lib/ecrire/app/helpers/application_helper.rb +64 -0
  81. data/lib/ecrire/app/helpers/content_tag_helper.rb +91 -0
  82. data/lib/ecrire/app/helpers/open_graph_helper.rb +45 -0
  83. data/lib/ecrire/app/helpers/posts_helper.rb +19 -0
  84. data/lib/ecrire/app/models/admin/image.rb +108 -0
  85. data/lib/ecrire/app/models/admin/partial.rb +4 -0
  86. data/lib/ecrire/app/models/admin/post.rb +56 -0
  87. data/lib/ecrire/app/models/concerns/.keep +0 -0
  88. data/lib/ecrire/app/models/image.rb +5 -0
  89. data/lib/ecrire/app/models/label.rb +3 -0
  90. data/lib/ecrire/app/models/partial.rb +3 -0
  91. data/lib/ecrire/app/models/post.rb +90 -0
  92. data/lib/ecrire/app/models/property/image.rb +30 -0
  93. data/lib/ecrire/app/models/property/label.rb +28 -0
  94. data/lib/ecrire/app/models/user.rb +31 -0
  95. data/lib/ecrire/app/strategies/password_strategy.rb +17 -0
  96. data/lib/ecrire/app/views/admin/configurations/images/complete.html.erb +6 -0
  97. data/lib/ecrire/app/views/admin/configurations/images/show.html.erb +14 -0
  98. data/lib/ecrire/app/views/admin/images/_errors.html.erb +14 -0
  99. data/lib/ecrire/app/views/admin/images/_form.html.erb +15 -0
  100. data/lib/ecrire/app/views/admin/images/destroy.js.erb +0 -0
  101. data/lib/ecrire/app/views/admin/images/errors.js.erb +1 -0
  102. data/lib/ecrire/app/views/admin/images/update.js.erb +1 -0
  103. data/lib/ecrire/app/views/admin/posts/_documentation.html.erb +61 -0
  104. data/lib/ecrire/app/views/admin/posts/_list.html.erb +18 -0
  105. data/lib/ecrire/app/views/admin/posts/_post.html.erb +3 -0
  106. data/lib/ecrire/app/views/admin/posts/edit.html.erb +73 -0
  107. data/lib/ecrire/app/views/admin/posts/help.js.erb +1 -0
  108. data/lib/ecrire/app/views/admin/posts/index.js.erb +1 -0
  109. data/lib/ecrire/app/views/admin/posts/title.html.erb +10 -0
  110. data/lib/ecrire/app/views/admin/posts/update/content.js.erb +1 -0
  111. data/lib/ecrire/app/views/admin/posts/update/title.js.erb +1 -0
  112. data/lib/ecrire/app/views/admin/properties/image/create.js.erb +14 -0
  113. data/lib/ecrire/app/views/admin/properties/image/destroy.js.erb +6 -0
  114. data/lib/ecrire/app/views/admin/properties/label/create.js.erb +8 -0
  115. data/lib/ecrire/app/views/admin/properties/label/destroy.js.erb +2 -0
  116. data/lib/ecrire/app/views/layouts/admin/application.html.erb +47 -0
  117. data/lib/ecrire/app/views/partials/show.html.erb +14 -0
  118. data/lib/ecrire/app/views/sessions/_form.html.erb +18 -0
  119. data/lib/ecrire/app/views/sessions/_navigation.html.erb +24 -0
  120. data/lib/ecrire/app/views/sessions/new.html.erb +1 -0
  121. data/lib/ecrire/application.rb +18 -0
  122. data/lib/ecrire/commands/base.rb +9 -0
  123. data/lib/ecrire/commands/console.rb +21 -0
  124. data/lib/ecrire/commands/new.rb +47 -0
  125. data/lib/ecrire/commands/server.rb +27 -0
  126. data/lib/ecrire/commands.rb +19 -0
  127. data/lib/ecrire/config/environment/development.rb +12 -0
  128. data/lib/ecrire/config/environment/production.rb +12 -0
  129. data/lib/ecrire/config/environment/test.rb +3 -0
  130. data/lib/ecrire/config/environment.rb +46 -0
  131. data/lib/ecrire/config/onboarding_routes.rb +11 -0
  132. data/lib/ecrire/config/routes.rb +32 -0
  133. data/lib/ecrire/db/migrate/20131111222709_create_posts.rb +16 -0
  134. data/lib/ecrire/db/migrate/20131113200949_create_users.rb +12 -0
  135. data/lib/ecrire/db/migrate/20131114205041_add_excerpt_to_post.rb +5 -0
  136. data/lib/ecrire/db/migrate/20131221181640_add_javascript_to_posts.rb +5 -0
  137. data/lib/ecrire/db/migrate/20131221195338_create_partials.rb +12 -0
  138. data/lib/ecrire/db/migrate/20140115215122_create_images.rb +12 -0
  139. data/lib/ecrire/db/migrate/20140209144412_add_favorite_flag_to_image.rb +5 -0
  140. data/lib/ecrire/db/migrate/20140617224837_create_labels.rb +12 -0
  141. data/lib/ecrire/db/migrate/20140618321984_add_properties_to_posts.rb +6 -0
  142. data/lib/ecrire/db/migrate/20150113839713_convert_markdown_in_post_content.rb +6 -0
  143. data/lib/ecrire/db/migrate/20150120093481_add_preview_to_posts.rb +8 -0
  144. data/lib/ecrire/db/schema.rb +76 -0
  145. data/lib/ecrire/locales/admin/configurations/images/en.yml +3 -0
  146. data/lib/ecrire/locales/admin/en.yml +26 -0
  147. data/lib/ecrire/locales/admin/images/en.yml +5 -0
  148. data/lib/ecrire/locales/admin/partials/en.yml +18 -0
  149. data/lib/ecrire/locales/admin/posts/en.yml +14 -0
  150. data/lib/ecrire/locales/en.yml +9 -0
  151. data/lib/ecrire/onboarding/assets/images/.keep +0 -0
  152. data/lib/ecrire/onboarding/assets/images/background.png +0 -0
  153. data/lib/ecrire/onboarding/assets/images/github-logo.png +0 -0
  154. data/lib/ecrire/onboarding/assets/images/profile.png +0 -0
  155. data/lib/ecrire/onboarding/assets/images/twitter-logo.png +0 -0
  156. data/lib/ecrire/onboarding/assets/javascripts/base.js +2 -0
  157. data/lib/ecrire/onboarding/assets/javascripts/databases/information.js.coffee +17 -0
  158. data/lib/ecrire/onboarding/assets/javascripts/message.js.coffee +5 -0
  159. data/lib/ecrire/onboarding/assets/stylesheets/base.css.scss +80 -0
  160. data/lib/ecrire/onboarding/assets/stylesheets/complete.css.scss +3 -0
  161. data/lib/ecrire/onboarding/assets/stylesheets/fonts.css.scss +17 -0
  162. data/lib/ecrire/onboarding/assets/stylesheets/form.css.scss +25 -0
  163. data/lib/ecrire/onboarding/assets/stylesheets/message.css.scss +11 -0
  164. data/lib/ecrire/onboarding/assets/stylesheets/terminal.css.scss +16 -0
  165. data/lib/ecrire/onboarding/assets/stylesheets/variables.css.scss +3 -0
  166. data/lib/ecrire/onboarding/assets/stylesheets/welcome.css.scss +62 -0
  167. data/lib/ecrire/onboarding/views/layouts/application.html.erb +16 -0
  168. data/lib/ecrire/onboarding/views/onboarding/complete.html.erb +6 -0
  169. data/lib/ecrire/onboarding/views/onboarding/databases/index.html.erb +34 -0
  170. data/lib/ecrire/onboarding/views/onboarding/users/index.html.erb +16 -0
  171. data/lib/ecrire/onboarding/views/onboarding/welcome.html.erb +12 -0
  172. data/lib/ecrire/railtie/onboarding.rb +63 -0
  173. data/lib/ecrire/railtie/theme.rb +69 -0
  174. data/lib/ecrire/railtie.rb +30 -0
  175. data/lib/ecrire/tasks/assets.rake +15 -0
  176. data/lib/ecrire/tasks/routes.rake +6 -0
  177. data/lib/ecrire/template/Gemfile +31 -0
  178. data/lib/ecrire/template/Rakefile +4 -0
  179. data/lib/ecrire/template/assets/images/.keep +0 -0
  180. data/lib/ecrire/template/assets/javascripts/base.js.coffee +0 -0
  181. data/lib/ecrire/template/assets/javascripts/post.js.coffee +0 -0
  182. data/lib/ecrire/template/assets/stylesheets/base.css.scss +86 -0
  183. data/lib/ecrire/template/assets/stylesheets/code.css.scss +24 -0
  184. data/lib/ecrire/template/assets/stylesheets/footer.css.scss +5 -0
  185. data/lib/ecrire/template/assets/stylesheets/header.css.scss +18 -0
  186. data/lib/ecrire/template/assets/stylesheets/home.css.scss +35 -0
  187. data/lib/ecrire/template/config.ru +4 -0
  188. data/lib/ecrire/template/controllers/posts_controller.rb +2 -0
  189. data/lib/ecrire/template/helpers/blog_helper.rb +2 -0
  190. data/lib/ecrire/template/views/layouts/application.html.erb +35 -0
  191. data/lib/ecrire/template/views/posts/_post.html.erb +9 -0
  192. data/lib/ecrire/template/views/posts/index.html.erb +13 -0
  193. data/lib/ecrire/template/views/posts/show.html.erb +7 -0
  194. data/lib/ecrire/template/views/static/about.html +0 -0
  195. data/lib/ecrire/template/views/static/customize/_helper.html +7 -0
  196. data/lib/ecrire/template/views/static/customize/_helper_used.html +6 -0
  197. data/lib/ecrire/template/views/static/customize/_image.html +1 -0
  198. data/lib/ecrire/template/views/static/customize/_index.html +1 -0
  199. data/lib/ecrire/template/views/static/customize/_javascript.html +1 -0
  200. data/lib/ecrire/template/views/static/customize/_layout.html.erb +15 -0
  201. data/lib/ecrire/template/views/static/customize/_post.html +3 -0
  202. data/lib/ecrire/template/views/static/customize.html +95 -0
  203. data/lib/ecrire/version.rb +3 -0
  204. data/lib/ecrire.rb +24 -0
  205. data/test/editor/controllers/admin/images_controller_test.rb +6 -0
  206. data/test/editor/controllers/admin/posts_controller_test.rb +90 -0
  207. data/test/editor/controllers/base_controller_test.rb +26 -0
  208. data/test/editor/controllers/images_controller_test.rb +2 -0
  209. data/test/editor/controllers/partials_controller_test.rb +2 -0
  210. data/test/editor/controllers/posts_controller_test.rb +21 -0
  211. data/test/editor/controllers/sessions_controller_test.rb +21 -0
  212. data/test/editor/helpers/base_helper_test.rb +19 -0
  213. data/test/editor/helpers/posts_helper_test.rb +3 -0
  214. data/test/editor/models/image_test.rb +33 -0
  215. data/test/editor/models/partial_test.rb +4 -0
  216. data/test/editor/models/post_test.rb +109 -0
  217. data/test/editor/models/user_test.rb +4 -0
  218. data/test/editor/test_helper.rb +28 -0
  219. data/test/fixtures/images.yml +11 -0
  220. data/test/fixtures/partials.yml +9 -0
  221. data/test/fixtures/posts.yml +16 -0
  222. data/test/fixtures/users.yml +9 -0
  223. data/test/initializations/railtie_test.rb +49 -0
  224. data/test/isolation.rb +16 -0
  225. data/test/themes/template/Gemfile +28 -0
  226. data/test/themes/template/assets/javascripts/blog.js.coffee +0 -0
  227. data/test/themes/template/assets/javascripts/post.js.coffee +0 -0
  228. data/test/themes/template/assets/stylesheets/blog.css.scss +0 -0
  229. data/test/themes/template/assets/stylesheets/post.css.scss +0 -0
  230. data/test/themes/template/config.ru +0 -0
  231. data/test/themes/template/views/layouts/application.html.erb +1 -0
  232. data/test/themes/template/views/posts/index.html.erb +0 -0
  233. metadata +275 -0
@@ -0,0 +1,25 @@
1
+ Prism.languages.ruby = {
2
+ 'comment': /#[^\r\n]*(\r?\n|$)/g,
3
+ 'string': /("|')(\\?.)*?\1/g,
4
+ 'regex': {
5
+ pattern: /(^|[^/])\/(?!\/)(\[.+?]|\\.|[^/\r\n])+\/[gim]{0,3}(?=\s*($|[\r\n,.;})]))/g,
6
+ lookbehind: true
7
+ },
8
+ 'keyword': /\b(alias|and|BEGIN|begin|break|case|class|def|define_method|defined|do|each|else|elsif|END|end|ensure|false|for|if|in|module|new|next|nil|not|or|raise|redo|rescue|retry|return|self|super|then|throw|true|undef|unless|until|when|while|yield)\b/g,
9
+ 'builtin': /\b(Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Stat|File|Fixnum|Fload|Hash|Integer|IO|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|String|Struct|TMS|Symbol|ThreadGroup|Thread|Time|TrueClass)\b/,
10
+ 'boolean': /\b(true|false)\b/g,
11
+ 'number': /\b-?(0x)?\d*\.?\d+\b/g,
12
+ 'instance-variable': /[@$]\b[a-zA-Z_][a-zA-Z_0-9]*[?!]?\b/g,
13
+ 'const': {
14
+ 'pattern': /\b[A-Z][a-zA-Z_0-9]*\b/,
15
+ 'inside': {
16
+ 'separator': /:{2}/,
17
+ },
18
+ },
19
+ 'literals': /%[wWqQriIx][\[\({]([a-zA-Z_0-9\s]+)[\]\)}]/g,
20
+ 'symbol': /:\b[a-zA-Z_][a-zA-Z_0-9]*[?!]?\b/g,
21
+ 'ignore': /&(lt|gt|amp);/gi,
22
+ 'punctuation': /[{}[\];(),.:]/g,
23
+ 'method': /.?[a-zA-Z0-9_?]+/g,
24
+ 'operator': /[-+]{1,2}|!|=?<|=?>|={1,2}|(&){1,2}|\|?\||\?|\*|\//g,
25
+ };
@@ -0,0 +1,578 @@
1
+ /**
2
+ * Prism: Lightweight, robust, elegant syntax highlighting
3
+ * MIT license http://www.opensource.org/licenses/mit-license.php/
4
+ * @author Lea Verou http://lea.verou.me
5
+ */
6
+
7
+ (function(){
8
+
9
+ // Private helper vars
10
+ var lang = /\blang(?:uage)?-(?!\*)(\w+)\b/i;
11
+
12
+ var _ = self.Prism = {
13
+ util: {
14
+ type: function (o) {
15
+ return Object.prototype.toString.call(o).match(/\[object (\w+)\]/)[1];
16
+ },
17
+
18
+ // Deep clone a language definition (e.g. to extend it)
19
+ clone: function (o) {
20
+ var type = _.util.type(o);
21
+
22
+ switch (type) {
23
+ case 'Object':
24
+ var clone = {};
25
+
26
+ for (var key in o) {
27
+ if (o.hasOwnProperty(key)) {
28
+ clone[key] = _.util.clone(o[key]);
29
+ }
30
+ }
31
+
32
+ return clone;
33
+
34
+ case 'Array':
35
+ return o.slice();
36
+ }
37
+
38
+ return o;
39
+ }
40
+ },
41
+
42
+ languages: {
43
+ extend: function (id, redef) {
44
+ var lang = _.util.clone(_.languages[id]);
45
+
46
+ for (var key in redef) {
47
+ lang[key] = redef[key];
48
+ }
49
+
50
+ return lang;
51
+ },
52
+
53
+ // Insert a token before another token in a language literal
54
+ insertBefore: function (inside, before, insert, root) {
55
+ root = root || _.languages;
56
+ var grammar = root[inside];
57
+ var ret = {};
58
+
59
+ for (var token in grammar) {
60
+
61
+ if (grammar.hasOwnProperty(token)) {
62
+
63
+ if (token == before) {
64
+
65
+ for (var newToken in insert) {
66
+
67
+ if (insert.hasOwnProperty(newToken)) {
68
+ ret[newToken] = insert[newToken];
69
+ }
70
+ }
71
+ }
72
+
73
+ ret[token] = grammar[token];
74
+ }
75
+ }
76
+
77
+ return root[inside] = ret;
78
+ },
79
+
80
+ // Traverse a language definition with Depth First Search
81
+ DFS: function(o, callback) {
82
+ for (var i in o) {
83
+ callback.call(o, i, o[i]);
84
+
85
+ if (_.util.type(o) === 'Object') {
86
+ _.languages.DFS(o[i], callback);
87
+ }
88
+ }
89
+ }
90
+ },
91
+
92
+ highlightAll: function(async, callback) {
93
+ var elements = document.querySelectorAll('code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code');
94
+
95
+ for (var i=0, element; element = elements[i++];) {
96
+ _.highlightElement(element, async === true, callback);
97
+ }
98
+ },
99
+
100
+ highlightElement: function(element, async, callback) {
101
+ // Find language
102
+ var language, grammar, parent = element;
103
+
104
+ while (parent && !lang.test(parent.className)) {
105
+ parent = parent.parentNode;
106
+ }
107
+
108
+ if (parent) {
109
+ language = (parent.className.match(lang) || [,''])[1];
110
+ grammar = _.languages[language];
111
+ }
112
+
113
+ if (!grammar) {
114
+ return;
115
+ }
116
+
117
+ // Set language on the element, if not present
118
+ element.className = element.className.replace(lang, '').replace(/\s+/g, ' ') + ' language-' + language;
119
+
120
+ // Set language on the parent, for styling
121
+ parent = element.parentNode;
122
+
123
+ if (/pre/i.test(parent.nodeName)) {
124
+ parent.className = parent.className.replace(lang, '').replace(/\s+/g, ' ') + ' language-' + language;
125
+ }
126
+
127
+ var code = element.textContent;
128
+
129
+ if(!code) {
130
+ return;
131
+ }
132
+
133
+ code = code.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/\u00a0/g, ' ');
134
+
135
+ var env = {
136
+ element: element,
137
+ language: language,
138
+ grammar: grammar,
139
+ code: code
140
+ };
141
+
142
+ _.hooks.run('before-highlight', env);
143
+
144
+ if (async && self.Worker) {
145
+ var worker = new Worker(_.filename);
146
+
147
+ worker.onmessage = function(evt) {
148
+ env.highlightedCode = Token.stringify(JSON.parse(evt.data), language);
149
+
150
+ _.hooks.run('before-insert', env);
151
+
152
+ env.element.innerHTML = env.highlightedCode;
153
+
154
+ callback && callback.call(env.element);
155
+ _.hooks.run('after-highlight', env);
156
+ };
157
+
158
+ worker.postMessage(JSON.stringify({
159
+ language: env.language,
160
+ code: env.code
161
+ }));
162
+ }
163
+ else {
164
+ env.highlightedCode = _.highlight(env.code, env.grammar, env.language)
165
+
166
+ _.hooks.run('before-insert', env);
167
+
168
+ env.element.innerHTML = env.highlightedCode;
169
+
170
+ callback && callback.call(element);
171
+
172
+ _.hooks.run('after-highlight', env);
173
+ }
174
+ },
175
+
176
+ highlight: function (text, grammar, language) {
177
+ return Token.stringify(_.tokenize(text, grammar), language);
178
+ },
179
+
180
+ tokenize: function(text, grammar, language) {
181
+ var Token = _.Token;
182
+
183
+ var strarr = [text];
184
+
185
+ var rest = grammar.rest;
186
+
187
+ if (rest) {
188
+ for (var token in rest) {
189
+ grammar[token] = rest[token];
190
+ }
191
+
192
+ delete grammar.rest;
193
+ }
194
+
195
+ tokenloop: for (var token in grammar) {
196
+ if(!grammar.hasOwnProperty(token) || !grammar[token]) {
197
+ continue;
198
+ }
199
+
200
+ var pattern = grammar[token],
201
+ inside = pattern.inside,
202
+ lookbehind = !!pattern.lookbehind,
203
+ lookbehindLength = 0;
204
+
205
+ pattern = pattern.pattern || pattern;
206
+
207
+ for (var i=0; i<strarr.length; i++) { // Don’t cache length as it changes during the loop
208
+
209
+ var str = strarr[i];
210
+
211
+ if (strarr.length > text.length) {
212
+ // Something went terribly wrong, ABORT, ABORT!
213
+ break tokenloop;
214
+ }
215
+
216
+ if (str instanceof Token) {
217
+ continue;
218
+ }
219
+
220
+ pattern.lastIndex = 0;
221
+
222
+ var match = pattern.exec(str);
223
+
224
+ if (match) {
225
+ if(lookbehind) {
226
+ lookbehindLength = match[1].length;
227
+ }
228
+
229
+ var from = match.index - 1 + lookbehindLength,
230
+ match = match[0].slice(lookbehindLength),
231
+ len = match.length,
232
+ to = from + len,
233
+ before = str.slice(0, from + 1),
234
+ after = str.slice(to + 1);
235
+
236
+ var args = [i, 1];
237
+
238
+ if (before) {
239
+ args.push(before);
240
+ }
241
+
242
+ var wrapped = new Token(token, inside? _.tokenize(match, inside) : match);
243
+
244
+ args.push(wrapped);
245
+
246
+ if (after) {
247
+ args.push(after);
248
+ }
249
+
250
+ Array.prototype.splice.apply(strarr, args);
251
+ }
252
+ }
253
+ }
254
+
255
+ return strarr;
256
+ },
257
+
258
+ hooks: {
259
+ all: {},
260
+
261
+ add: function (name, callback) {
262
+ var hooks = _.hooks.all;
263
+
264
+ hooks[name] = hooks[name] || [];
265
+
266
+ hooks[name].push(callback);
267
+ },
268
+
269
+ run: function (name, env) {
270
+ var callbacks = _.hooks.all[name];
271
+
272
+ if (!callbacks || !callbacks.length) {
273
+ return;
274
+ }
275
+
276
+ for (var i=0, callback; callback = callbacks[i++];) {
277
+ callback(env);
278
+ }
279
+ }
280
+ }
281
+ };
282
+
283
+ var Token = _.Token = function(type, content) {
284
+ this.type = type;
285
+ this.content = content;
286
+ };
287
+
288
+ Token.stringify = function(o, language, parent) {
289
+ if (typeof o == 'string') {
290
+ return o;
291
+ }
292
+
293
+ if (Object.prototype.toString.call(o) == '[object Array]') {
294
+ return o.map(function(element) {
295
+ return Token.stringify(element, language, o);
296
+ }).join('');
297
+ }
298
+
299
+ var env = {
300
+ type: o.type,
301
+ content: Token.stringify(o.content, language, parent),
302
+ tag: 'span',
303
+ classes: ['token', o.type],
304
+ attributes: {},
305
+ language: language,
306
+ parent: parent
307
+ };
308
+
309
+ if (env.type == 'comment') {
310
+ env.attributes['spellcheck'] = 'true';
311
+ }
312
+
313
+ _.hooks.run('wrap', env);
314
+
315
+ var attributes = '';
316
+
317
+ for (var name in env.attributes) {
318
+ attributes += name + '="' + (env.attributes[name] || '') + '"';
319
+ }
320
+
321
+ return '<' + env.tag + ' class="' + env.classes.join(' ') + '" ' + attributes + '>' + env.content + '</' + env.tag + '>';
322
+
323
+ };
324
+
325
+ if (!self.document) {
326
+ // In worker
327
+ self.addEventListener('message', function(evt) {
328
+ var message = JSON.parse(evt.data),
329
+ lang = message.language,
330
+ code = message.code;
331
+
332
+ self.postMessage(JSON.stringify(_.tokenize(code, _.languages[lang])));
333
+ self.close();
334
+ }, false);
335
+
336
+ return;
337
+ }
338
+
339
+ })();;
340
+ Prism.languages.markup = {
341
+ 'comment': /&lt;!--[\w\W]*?-->/g,
342
+ 'prolog': /&lt;\?.+?\?>/,
343
+ 'doctype': /&lt;!DOCTYPE.+?>/,
344
+ 'cdata': /&lt;!\[CDATA\[[\w\W]*?]]>/i,
345
+ 'tag': {
346
+ pattern: /&lt;\/?[\w:-]+\s*(?:\s+[\w:-]+(?:=(?:("|')(\\?[\w\W])*?\1|\w+))?\s*)*\/?>/gi,
347
+ inside: {
348
+ 'tag': {
349
+ pattern: /^&lt;\/?[\w:-]+/i,
350
+ inside: {
351
+ 'punctuation': /^&lt;\/?/,
352
+ 'namespace': /^[\w-]+?:/
353
+ }
354
+ },
355
+ 'attr-value': {
356
+ pattern: /=(?:('|")[\w\W]*?(\1)|[^\s>]+)/gi,
357
+ inside: {
358
+ 'punctuation': /=|>|"/g
359
+ }
360
+ },
361
+ 'punctuation': /\/?>/g,
362
+ 'attr-name': {
363
+ pattern: /[\w:-]+/g,
364
+ inside: {
365
+ 'namespace': /^[\w-]+?:/
366
+ }
367
+ }
368
+
369
+ }
370
+ },
371
+ 'entity': /&amp;#?[\da-z]{1,8};/gi
372
+ };
373
+
374
+ // Plugin to make entity title show the real entity, idea by Roman Komarov
375
+ Prism.hooks.add('wrap', function(env) {
376
+
377
+ if (env.type === 'entity') {
378
+ env.attributes['title'] = env.content.replace(/&amp;/, '&');
379
+ }
380
+ });;
381
+ Prism.languages.css = {
382
+ 'comment': /\/\*[\w\W]*?\*\//g,
383
+ 'atrule': {
384
+ pattern: /@[\w-]+?.*?(;|(?=\s*{))/gi,
385
+ inside: {
386
+ 'punctuation': /[;:]/g
387
+ }
388
+ },
389
+ 'url': /url\((["']?).*?\1\)/gi,
390
+ 'selector': /[^\{\}\s][^\{\};]*(?=\s*\{)/g,
391
+ 'property': /(\b|\B)[\w-]+(?=\s*:)/ig,
392
+ 'string': /("|')(\\?.)*?\1/g,
393
+ 'important': /\B!important\b/gi,
394
+ 'ignore': /&(lt|gt|amp);/gi,
395
+ 'punctuation': /[\{\};:]/g
396
+ };
397
+
398
+ if (Prism.languages.markup) {
399
+ Prism.languages.insertBefore('markup', 'tag', {
400
+ 'style': {
401
+ pattern: /(&lt;|<)style[\w\W]*?(>|&gt;)[\w\W]*?(&lt;|<)\/style(>|&gt;)/ig,
402
+ inside: {
403
+ 'tag': {
404
+ pattern: /(&lt;|<)style[\w\W]*?(>|&gt;)|(&lt;|<)\/style(>|&gt;)/ig,
405
+ inside: Prism.languages.markup.tag.inside
406
+ },
407
+ rest: Prism.languages.css
408
+ }
409
+ }
410
+ });
411
+ };
412
+ Prism.languages.clike = {
413
+ 'comment': {
414
+ pattern: /(^|[^\\])(\/\*[\w\W]*?\*\/|(^|[^:])\/\/.*?(\r?\n|$))/g,
415
+ lookbehind: true
416
+ },
417
+ 'string': /("|')(\\?.)*?\1/g,
418
+ 'class-name': {
419
+ pattern: /((?:(?:class|interface|extends|implements|trait|instanceof|new)\s+)|(?:catch\s+\())[a-z0-9_\.\\]+/ig,
420
+ lookbehind: true,
421
+ inside: {
422
+ punctuation: /(\.|\\)/
423
+ }
424
+ },
425
+ 'keyword': /\b(if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/g,
426
+ 'boolean': /\b(true|false)\b/g,
427
+ 'function': {
428
+ pattern: /[a-z0-9_]+\(/ig,
429
+ inside: {
430
+ punctuation: /\(/
431
+ }
432
+ },
433
+ 'number': /\b-?(0x[\dA-Fa-f]+|\d*\.?\d+([Ee]-?\d+)?)\b/g,
434
+ 'operator': /[-+]{1,2}|!|&lt;=?|>=?|={1,3}|(&amp;){1,2}|\|?\||\?|\*|\/|\~|\^|\%/g,
435
+ 'ignore': /&(lt|gt|amp);/gi,
436
+ 'punctuation': /[{}[\];(),.:]/g
437
+ };
438
+ ;
439
+ Prism.languages.javascript = Prism.languages.extend('clike', {
440
+ 'keyword': /\b(var|let|if|else|while|do|for|return|in|instanceof|function|new|with|typeof|try|throw|catch|finally|null|break|continue)\b/g,
441
+ 'number': /\b-?(0x[\dA-Fa-f]+|\d*\.?\d+([Ee]-?\d+)?|NaN|-?Infinity)\b/g
442
+ });
443
+
444
+ Prism.languages.insertBefore('javascript', 'keyword', {
445
+ 'regex': {
446
+ pattern: /(^|[^/])\/(?!\/)(\[.+?]|\\.|[^/\r\n])+\/[gim]{0,3}(?=\s*($|[\r\n,.;})]))/g,
447
+ lookbehind: true
448
+ }
449
+ });
450
+
451
+ if (Prism.languages.markup) {
452
+ Prism.languages.insertBefore('markup', 'tag', {
453
+ 'script': {
454
+ pattern: /(&lt;|<)script[\w\W]*?(>|&gt;)[\w\W]*?(&lt;|<)\/script(>|&gt;)/ig,
455
+ inside: {
456
+ 'tag': {
457
+ pattern: /(&lt;|<)script[\w\W]*?(>|&gt;)|(&lt;|<)\/script(>|&gt;)/ig,
458
+ inside: Prism.languages.markup.tag.inside
459
+ },
460
+ rest: Prism.languages.javascript
461
+ }
462
+ }
463
+ });
464
+ }
465
+ ;
466
+ Prism.languages.coffeescript = Prism.languages.extend('javascript', {
467
+ 'block-comment': /([#]{3}\s*\r?\n(.*\s*\r*\n*)\s*?\r?\n[#]{3})/g,
468
+ 'comment': /(\s|^)([#]{1}[^#^\r^\n]{2,}?(\r?\n|$))/g,
469
+ 'keyword': /\b(this|window|delete|class|extends|namespace|extend|ar|let|if|else|while|do|for|each|of|return|in|instanceof|new|with|typeof|try|catch|finally|null|undefined|break|continue)\b/g
470
+ });
471
+
472
+ Prism.languages.insertBefore('coffeescript', 'keyword', {
473
+ 'function': {
474
+ pattern: /[a-z|A-z]+\s*[:|=]\s*(\([.|a-z\s|,|:|{|}|\"|\'|=]*\))?\s*-&gt;/gi,
475
+ inside: {
476
+ 'function-name': /[_?a-z-|A-Z-]+(\s*[:|=])| @[_?$?a-z-|A-Z-]+(\s*)| /g,
477
+ 'operator': /[-+]{1,2}|!|=?&lt;|=?&gt;|={1,2}|(&amp;){1,2}|\|?\||\?|\*|\//g
478
+ }
479
+ },
480
+ 'attr-name': /[_?a-z-|A-Z-]+(\s*:)| @[_?$?a-z-|A-Z-]+(\s*)| /g
481
+ });
482
+ ;
483
+ Prism.languages.scss = Prism.languages.extend('css', {
484
+ 'comment': {
485
+ pattern: /(^|[^\\])(\/\*[\w\W]*?\*\/|\/\/.*?(\r?\n|$))/g,
486
+ lookbehind: true
487
+ },
488
+ // aturle is just the @***, not the entire rule (to highlight var & stuffs)
489
+ // + add ability to highlight number & unit for media queries
490
+ 'atrule': /@[\w-]+(?=\s+(\(|\{|;))/gi,
491
+ // url, compassified
492
+ 'url': /([-a-z]+-)*url(?=\()/gi,
493
+ // CSS selector regex is not appropriate for Sass
494
+ // since there can be lot more things (var, @ directive, nesting..)
495
+ // a selector must start at the end of a property or after a brace (end of other rules or nesting)
496
+ // it can contain some caracters that aren't used for defining rules or end of selector, & (parent selector), or interpolated variable
497
+ // the end of a selector is found when there is no rules in it ( {} or {\s}) or if there is a property (because an interpolated var
498
+ // can "pass" as a selector- e.g: proper#{$erty})
499
+ // this one was ard to do, so please be careful if you edit this one :)
500
+ 'selector': /([^@;\{\}\(\)]?([^@;\{\}\(\)]|&amp;|\#\{\$[-_\w]+\})+)(?=\s*\{(\}|\s|[^\}]+(:|\{)[^\}]+))/gm
501
+ });
502
+
503
+ Prism.languages.insertBefore('scss', 'atrule', {
504
+ 'keyword': /@(if|else if|else|for|each|while|import|extend|debug|warn|mixin|include|function|return)|(?=@for\s+\$[-_\w]+\s)+from/i
505
+ });
506
+
507
+ Prism.languages.insertBefore('scss', 'property', {
508
+ // var and interpolated vars
509
+ 'variable': /((\$[-_\w]+)|(#\{\$[-_\w]+\}))/i
510
+ });
511
+
512
+ Prism.languages.insertBefore('scss', 'ignore', {
513
+ 'placeholder': /%[-_\w]+/i,
514
+ 'statement': /\B!(default|optional)\b/gi,
515
+ 'boolean': /\b(true|false)\b/g,
516
+ 'null': /\b(null)\b/g,
517
+ 'operator': /\s+([-+]{1,2}|={1,2}|!=|\|?\||\?|\*|\/|\%)\s+/g
518
+ });
519
+ ;
520
+ Prism.languages.bash = Prism.languages.extend('clike', {
521
+ 'comment': {
522
+ pattern: /(^|[^"{\\])(#.*?(\r?\n|$))/g,
523
+ lookbehind: true
524
+ },
525
+ 'string': {
526
+ //allow multiline string
527
+ pattern: /("|')(\\?[\s\S])*?\1/g,
528
+ inside: {
529
+ //'property' class reused for bash variables
530
+ 'property': /\$([a-zA-Z0-9_#\?\-\*!@]+|\{[^\}]+\})/g
531
+ }
532
+ },
533
+ 'keyword': /\b(if|then|else|elif|fi|for|break|continue|while|in|case|function|select|do|done|until|echo|exit|return|set|declare)\b/g
534
+ });
535
+
536
+ Prism.languages.insertBefore('bash', 'keyword', {
537
+ //'property' class reused for bash variables
538
+ 'property': /\$([a-zA-Z0-9_#\?\-\*!@]+|\{[^}]+\})/g
539
+ });
540
+ Prism.languages.insertBefore('bash', 'comment', {
541
+ //shebang must be before comment, 'important' class from css reused
542
+ 'important': /(^#!\s*\/bin\/bash)|(^#!\s*\/bin\/sh)/g
543
+ });
544
+ ;
545
+ Prism.languages.c = Prism.languages.extend('clike', {
546
+ 'keyword': /\b(asm|typeof|inline|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|void|volatile|while)\b/g,
547
+ 'operator': /[-+]{1,2}|!=?|&lt;{1,2}=?|&gt;{1,2}=?|\-&gt;|={1,2}|\^|~|%|(&amp;){1,2}|\|?\||\?|\*|\//g
548
+ });
549
+
550
+ Prism.languages.insertBefore('c', 'keyword', {
551
+ //property class reused for macro statements
552
+ 'property': /#\s*[a-zA-Z]+/g
553
+ });
554
+ ;
555
+ Prism.hooks.add('after-highlight', function (env) {
556
+ // works only for <code> wrapped inside <pre data-line-numbers> (not inline)
557
+ var pre = env.element.parentNode;
558
+ if (!pre || !/pre/i.test(pre.nodeName) || pre.className.indexOf('line-numbers') === -1) {
559
+ return;
560
+ }
561
+
562
+ var linesNum = (1 + env.code.split('\n').length);
563
+ var lineNumbersWrapper;
564
+
565
+ lines = new Array(linesNum);
566
+ lines = lines.join('<span></span>');
567
+
568
+ lineNumbersWrapper = document.createElement('span');
569
+ lineNumbersWrapper.className = 'line-numbers-rows';
570
+ lineNumbersWrapper.innerHTML = lines;
571
+
572
+ if (pre.hasAttribute('data-start')) {
573
+ pre.style.counterReset = 'linenumber ' + (parseInt(pre.getAttribute('data-start'), 10) - 1);
574
+ }
575
+
576
+ env.element.appendChild(lineNumbersWrapper);
577
+
578
+ });;
@@ -0,0 +1,98 @@
1
+ @import 'variables';
2
+
3
+ * {
4
+ box-sizing: border-box;
5
+ -moz-box-sizing: border-box;
6
+ }
7
+
8
+ html, body {
9
+ @include display(flex);
10
+ @include flex(1);
11
+ }
12
+
13
+ html {
14
+ min-height: 100%;
15
+ }
16
+
17
+ body {
18
+ margin: 0;
19
+ padding: 0;
20
+ font-family: $fonts;
21
+ font-weight: 200;
22
+ font-size: 14px;
23
+ color: $text-color;
24
+ }
25
+
26
+ a {
27
+ color: rgb(114, 153, 204);
28
+ }
29
+
30
+ ol.list {
31
+ overflow-y: scroll;
32
+ }
33
+
34
+ h1, h2, h3, h4, h5 {
35
+ font-weight: 100;
36
+ }
37
+
38
+ ul, ol {
39
+ margin: 0;
40
+ padding: 0;
41
+ list-style-type: none;
42
+
43
+ li {
44
+ margin: 1em 0;
45
+ }
46
+ }
47
+
48
+ fieldset {
49
+ border: none;
50
+ padding: 0;
51
+ margin: 0;
52
+ }
53
+
54
+ input {
55
+ padding: 4px 8px;
56
+ font-family: Helvetica;
57
+ font-weight: lighter;
58
+ outline: none;
59
+ }
60
+
61
+ textarea {
62
+ font-family: Helvetica;
63
+ }
64
+
65
+ button, input[type=submit] {
66
+ border: 1px solid transparent;
67
+ background: none;
68
+ font-family: inherit;
69
+ font-size: inherit;
70
+ font-weight: inherit;
71
+ cursor: pointer;
72
+ color: inherit;
73
+ outline: none;
74
+ }
75
+
76
+ main {
77
+ @include flex(1 100%);
78
+ @include display(flex);
79
+ position: relative;
80
+ z-index: 1;
81
+ }
82
+
83
+
84
+ .hidden {
85
+ display: none;
86
+ }
87
+
88
+ .flash {
89
+ height: 100%;
90
+ line-height: 45px;
91
+ padding: 0 8px;
92
+ font-size: 1em;
93
+ text-align: center;
94
+ background: rgba(160, 207, 194, 0.5);
95
+ box-shadow: inset 0px 0px 3px 1px rgba(76, 120, 155, 1);
96
+ color: #FEFEFE;
97
+ }
98
+