ecrire 0.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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,97 @@
1
+ [id^='Sessions'] {
2
+ @include display(flex);
3
+
4
+ & > main {
5
+ @include justify-content(center);
6
+ @include flex(1);
7
+ @include display(flex);
8
+ @include align-items(center);
9
+ @include justify-content(center);
10
+ }
11
+
12
+ form {
13
+ min-width: 250px;
14
+ @include display(flex);
15
+ @include flex-wrap(wrap);
16
+
17
+ div.fieldset {
18
+ @include display(flex);
19
+ @include flex(3 auto);
20
+ @include flex-direction(column);
21
+ border: 1px solid #BABABA;
22
+ border-right: none;
23
+ border-radius: 2px 0 0 2px;
24
+ background: #FFF;
25
+ }
26
+
27
+ p {
28
+ @include flex(1 100%);
29
+ padding: 0 1em;
30
+ }
31
+
32
+ p.errors {
33
+ color: rgb(193, 56, 28);
34
+ }
35
+
36
+ p.back {
37
+ margin: 1em 0;
38
+ &:before {
39
+ font-family: entypo;
40
+ font-size: 3em;
41
+ content: "←";
42
+ vertical-align: middle;
43
+ }
44
+
45
+ a {
46
+ text-decoration: none;
47
+ &:hover {
48
+ text-decoration: underline;
49
+ }
50
+ }
51
+ }
52
+
53
+ input, button {
54
+ margin: 0;
55
+ outline: none;
56
+ }
57
+
58
+ input {
59
+ @include flex(1);
60
+ font-family: 'Helvetica Neue';
61
+ font-weight: lighter;
62
+ border: none;
63
+ background: none;
64
+ font-size: 1.3em;
65
+ padding: 1em;
66
+
67
+ &:first-child {
68
+ border-bottom: 1px solid #BABABA;
69
+ }
70
+ }
71
+
72
+ button {
73
+ @include transition(box-shadow 0.3s);
74
+ @include user-select(none);
75
+ background: none;
76
+ border: 1px solid rgb(109, 154, 127);
77
+ cursor: pointer;
78
+ background: rgb(86, 205, 121);
79
+ padding: 0 0.3em;
80
+ border-radius: 0 2px 2px 0;
81
+ box-shadow: inset 0 1px 1px 0 rgba(215, 255, 225, 0.52);
82
+ width: 100px;
83
+
84
+ svg {
85
+ width: 60px;
86
+ height: auto;
87
+ fill: #a9ffb3;
88
+ padding: 1em;
89
+ }
90
+
91
+ &:active {
92
+ box-shadow: inset 0 1px 3px 0 rgba(57, 88, 58, 0.26);
93
+ }
94
+ }
95
+ }
96
+ }
97
+
@@ -0,0 +1,5 @@
1
+ main {
2
+ width: 100vw;
3
+ min-height: 100vh;
4
+ }
5
+
@@ -0,0 +1,76 @@
1
+ div.overlay {
2
+ @include display(flex);
3
+ @include justify-content(center);
4
+ @include align-items(center);
5
+ min-height: 100vh;
6
+ width: 100vw;
7
+ position: absolute;
8
+ top: 0;
9
+ left: 0;
10
+ background: rgba(0,0,0,0.5);
11
+ z-index: 5000;
12
+ }
13
+
14
+ main.overlayed {
15
+ position: fixed;
16
+ }
17
+
18
+ div.popup {
19
+ @include display(flex);
20
+ @include flex-direction(column);
21
+ border-radius: 2px;
22
+ max-width: 90vw;
23
+ width: 600px;
24
+ margin: 80px 0 80px 0;
25
+ background: #DDE4EA;
26
+ box-shadow: 0 0 3px #1a3642;
27
+ color: #15191B;
28
+ z-index: 101;
29
+ }
30
+
31
+ div.popup header {
32
+ @include flex(0 0 auto);
33
+ @include display(flex);
34
+ @include align-items(center);
35
+ padding: 0.5em 1em;
36
+ color: #224056;
37
+ border-bottom: 1px solid #B7C4CD;
38
+ box-shadow: 0 1px 0 0 #E7EFF5;
39
+ letter-spacing: 2px;
40
+ border-radius: 2px 2px 0 0;
41
+ background: rgb(203, 212, 219);
42
+ h5 {
43
+ margin: 8px 0;
44
+ font-size: 1.2em;
45
+ }
46
+ }
47
+
48
+ div.popup.errors {
49
+ background: rgb(200, 158, 158);
50
+
51
+ header {
52
+ background: rgb(229, 185, 185);
53
+ border-color: #542727;
54
+ color: rgb(116, 40, 40);
55
+ box-shadow: 0 1px 0 0 #DAB6B6;
56
+ }
57
+
58
+ ol {
59
+ margin: 1em;
60
+ }
61
+ }
62
+
63
+ #PostsListPopup {
64
+ ol {
65
+ font-size: 1.2em;
66
+ padding: 0;
67
+ li {
68
+ margin: 1.2em 1em;
69
+ padding: 0;
70
+ }
71
+ }
72
+
73
+ div.empty {
74
+ text-align: center;
75
+ }
76
+ }
@@ -0,0 +1,11 @@
1
+ .language-ruby {
2
+ .symbol {
3
+ color: #997400;
4
+ }
5
+ .namespace, .const {
6
+ color: #C03FE2;
7
+ }
8
+ .literals {
9
+ color: #4FA3A0;
10
+ }
11
+ }
@@ -0,0 +1,149 @@
1
+ /**
2
+ * prism.js default theme for JavaScript, CSS and HTML
3
+ * Based on dabblet (http://dabblet.com)
4
+ * @author Lea Verou
5
+ */
6
+
7
+ code, pre {
8
+ color: black;
9
+ font-family: Consolas, Monaco, 'Andale Mono', monospace;
10
+ direction: ltr;
11
+ text-align: left;
12
+ white-space: pre;
13
+ word-spacing: normal;
14
+ font-size: 1em;
15
+
16
+ -moz-tab-size: 4;
17
+ -o-tab-size: 4;
18
+ tab-size: 4;
19
+ }
20
+
21
+ pre::-moz-selection, pre ::-moz-selection,
22
+ code::-moz-selection, code ::-moz-selection {
23
+ text-shadow: none;
24
+ background: #b3d4fc;
25
+ }
26
+
27
+ pre::selection, pre ::selection,
28
+ code::selection, code ::selection {
29
+ text-shadow: none;
30
+ background: #b3d4fc;
31
+ }
32
+
33
+ @media print {
34
+ code[class*="language-"],
35
+ pre[class*="language-"] {
36
+ text-shadow: none;
37
+ }
38
+ }
39
+
40
+ /* Code blocks */
41
+ pre {
42
+ padding: 1em;
43
+ margin: .5em 0;
44
+ overflow: auto;
45
+ }
46
+
47
+ /* Inline code */
48
+ :not(pre) > code {
49
+ padding: .1em;
50
+ border-radius: .3em;
51
+ }
52
+
53
+ .token.comment,
54
+ .token.prolog,
55
+ .token.doctype,
56
+ .token.cdata {
57
+ color: slategray;
58
+ }
59
+
60
+ .token.punctuation {
61
+ color: #999;
62
+ }
63
+
64
+ .namespace {
65
+ opacity: .7;
66
+ }
67
+
68
+ .token.property,
69
+ .token.tag,
70
+ .token.boolean,
71
+ .token.number {
72
+ color: #905;
73
+ }
74
+
75
+ .token.selector,
76
+ .token.attr-name,
77
+ .token.string {
78
+ color: #690;
79
+ }
80
+
81
+ .token.operator,
82
+ .token.entity,
83
+ .token.url,
84
+ .language-css .token.string,
85
+ .style .token.string {
86
+ color: #a67f59;
87
+ }
88
+
89
+ .token.atrule,
90
+ .token.attr-value,
91
+ .token.keyword {
92
+ color: #009BDD;
93
+ }
94
+
95
+
96
+ .token.regex,
97
+ .token.important {
98
+ color: #e90;
99
+ }
100
+
101
+ .token.important {
102
+ font-weight: bold;
103
+ }
104
+
105
+ .token.entity {
106
+ cursor: help;
107
+ }
108
+ pre.line-numbers {
109
+ position: relative;
110
+ padding-left: 3.8em;
111
+ counter-reset: linenumber;
112
+ }
113
+
114
+ pre.line-numbers > code {
115
+ position: relative;
116
+ }
117
+
118
+ .line-numbers .line-numbers-rows {
119
+ position: absolute;
120
+ pointer-events: none;
121
+ top: 0;
122
+ font-size: 0.8rem;
123
+ line-height: 1.1rem;
124
+ left: -3.8em;
125
+ width: 3em; /* works for line-numbers below 1000 lines */
126
+ letter-spacing: -1px;
127
+ border-right: 1px solid #999;
128
+
129
+ -webkit-user-select: none;
130
+ -moz-user-select: none;
131
+ -ms-user-select: none;
132
+ user-select: none;
133
+
134
+ }
135
+
136
+ .line-numbers-rows > span {
137
+ pointer-events: none;
138
+ display: block;
139
+ counter-increment: linenumber;
140
+ }
141
+
142
+ .line-numbers-rows > span:before {
143
+ content: counter(linenumber);
144
+ color: #999;
145
+ display: block;
146
+ padding-right: 0.8em;
147
+ text-align: right;
148
+ }
149
+
@@ -0,0 +1,16 @@
1
+ require_relative '../application_controller'
2
+
3
+ module Admin
4
+ class ApplicationController < ::ApplicationController
5
+ before_action :authenticate!
6
+ before_action :pagination, only: [:index]
7
+
8
+ protected
9
+
10
+ def pagination
11
+ params[:per_page] ||= 10
12
+ params[:page] ||= 1
13
+ end
14
+
15
+ end
16
+ end
@@ -0,0 +1,28 @@
1
+ class Admin::Configurations::ImagesController < Admin::ApplicationController
2
+
3
+ def show
4
+ @s3 = Admin::Image::S3.new
5
+ end
6
+
7
+ def create
8
+ @s3 = Admin::Image::S3.new params[:s3]
9
+ @s3.connect
10
+ if @s3.errors.any?
11
+ render 'show' and return
12
+ else
13
+ save_configurations!
14
+ render 'complete'
15
+ end
16
+ end
17
+
18
+ protected
19
+
20
+ def save_configurations!
21
+ path = Rails.application.paths['config/secrets'].expanded.last
22
+ secrets = YAML.load_file(path)
23
+ Rails.application.secrets.s3 = secrets['development']['s3'] = secrets['production']['s3'] = @s3.configuration_hash
24
+ File.open(path, 'w') do |file|
25
+ file.write(secrets.to_yaml)
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,35 @@
1
+ module Admin
2
+ class ImagesController < Admin::ApplicationController
3
+ def index
4
+ @images = post.images
5
+ respond_to do |format|
6
+ format.js
7
+ end
8
+ end
9
+
10
+ def update
11
+ @image = post.header
12
+ if @image.update(image_params)
13
+ @image.touch
14
+ else
15
+ render 'errors'
16
+ end
17
+ end
18
+
19
+ def destroy
20
+ @image = post.header
21
+ @image.clear!
22
+ end
23
+
24
+ protected
25
+
26
+ def post
27
+ @post ||= Admin::Post.find(params[:post_id])
28
+ end
29
+
30
+ def image_params
31
+ params.require(:image).permit(:file)
32
+ end
33
+
34
+ end
35
+ end
@@ -0,0 +1,18 @@
1
+ module Admin
2
+ class LabelsController < Admin::ApplicationController
3
+ def create
4
+ Admin::Label.create(label_param)
5
+ end
6
+
7
+ protected
8
+
9
+ def label_param
10
+ params.require(:admin_label).permit(:name)
11
+ end
12
+
13
+ def post
14
+ @post ||= Post.find(params[:post_id])
15
+ end
16
+
17
+ end
18
+ end
@@ -0,0 +1,43 @@
1
+ module Admin
2
+ class PartialsController < Admin::ApplicationController
3
+
4
+ def index
5
+ @partials = Admin::Partial.page(params[:page]).per(params[:per_page])
6
+
7
+ respond_to do |format|
8
+ format.js
9
+ format.html
10
+ end
11
+ end
12
+
13
+ def new
14
+ @partial = Admin::Partial.new
15
+ end
16
+
17
+ def edit
18
+ @partial = Admin::Partial.find(params[:id].to_i)
19
+ end
20
+
21
+ def create
22
+ @partial = Admin::Partial.create(partial_params)
23
+ respond_to do |format|
24
+ format.html do
25
+ redirect_to edit_admin_partial_path(@partial)
26
+ end
27
+ end
28
+ end
29
+
30
+ def update
31
+ @partial = Admin::Partial.find(params[:id].to_i)
32
+ @partial.update(partial_params)
33
+ redirect_to edit_admin_partial_path(@partial) and return
34
+ end
35
+
36
+ protected
37
+
38
+ def partial_params
39
+ params.require(:admin_partial).permit(:title, :content, :javascript, :stylesheet)
40
+ end
41
+
42
+ end
43
+ end
@@ -0,0 +1,90 @@
1
+ module Admin
2
+ class PostsController < Admin::ApplicationController
3
+ before_action :fetch_post, only: [:show, :edit, :update]
4
+
5
+ def new
6
+ if /new\/title/i =~ request.path
7
+ render 'title' and return
8
+ end
9
+ end
10
+
11
+ def index
12
+ params[:type] ||= "drafted"
13
+ @posts = Admin::Post.status params[:type]
14
+ @posts = @posts.order('posts.created_at')
15
+ respond_to do |format|
16
+ format.js
17
+ end
18
+ end
19
+
20
+ def create
21
+ @post = Admin::Post.create post_params
22
+
23
+ respond_to do |format|
24
+ format.html do
25
+ if @post.errors.blank?
26
+ redirect_to edit_admin_post_path(@post.id)
27
+ end
28
+ end
29
+ end
30
+ end
31
+
32
+ def destroy
33
+ post = Admin::Post.find(params[:id])
34
+ post.destroy
35
+ redirect_to :root
36
+ end
37
+
38
+ def edit
39
+ end
40
+
41
+ def update
42
+ if params.has_key?(:post)
43
+ @post.update!(post_params)
44
+ end
45
+ respond_to do |format|
46
+ format.js do
47
+ render_context and return
48
+ end
49
+ format.html do
50
+ case params[:button]
51
+ when 'publish'
52
+ @post.publish!
53
+ flash[:notice] = t(".successful", title: @post.title)
54
+ redirect_to post_path(@post.published_at.year, @post.published_at.month, @post.slug) and return
55
+ when 'unpublish'
56
+ @post.unpublish!
57
+ end
58
+ redirect_to edit_admin_post_path(@post) and return
59
+ end
60
+ end
61
+ end
62
+
63
+ def show
64
+ respond_to do |format|
65
+ format.html do
66
+ render layout: false if request.xhr?
67
+ end
68
+ end
69
+ end
70
+
71
+ protected
72
+
73
+ def post_params
74
+ params.require(:post).permit(:title, :content, :status, :stylesheet, :javascript, :slug)
75
+ end
76
+
77
+ def fetch_post
78
+ @post = Admin::Post.find(params[:id])
79
+ end
80
+
81
+ def render_context
82
+ available_contexts = %w(title content)
83
+ if params.has_key?(:context) && available_contexts.include?(params[:context])
84
+ render "admin/posts/update/#{params[:context]}" and return
85
+ else
86
+ render nothing: true
87
+ end
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,35 @@
1
+ module Admin
2
+ class PropertiesController < Admin::ApplicationController
3
+ INSTANCES = {
4
+ label: Property::Label,
5
+ image: Property::Image
6
+ }.with_indifferent_access
7
+
8
+ helper_method :post
9
+
10
+ def create
11
+ instance = instance_for_property(params[:property])
12
+ @property = instance.create(params)
13
+ render "admin/properties/#{instance.name}/create"
14
+ end
15
+
16
+ def destroy
17
+ instance = instance_for_property(params[:property])
18
+ @property = instance.destroy(params)
19
+ render "admin/properties/#{instance.name}/destroy"
20
+ end
21
+
22
+ protected
23
+
24
+ def post
25
+ @post ||= Admin::Post.find(params[:post_id])
26
+ end
27
+
28
+ def instance_for_property(name)
29
+ instance = INSTANCES[name].new
30
+ instance.post = post
31
+ instance
32
+ end
33
+
34
+ end
35
+ end
@@ -0,0 +1,29 @@
1
+ class ApplicationController < ::ActionController::Base
2
+
3
+ protect_from_forgery with: :exception
4
+ helper_method :current_user, :signed_in?
5
+
6
+ helper_method :warden, :posts
7
+
8
+ def current_user
9
+ warden.user
10
+ end
11
+
12
+ def signed_in?
13
+ !warden.user.nil?
14
+ end
15
+
16
+ def posts
17
+ @posts ||= Post.all
18
+ end
19
+
20
+ protected
21
+
22
+ def authenticate!
23
+ warden.authenticate!
24
+ end
25
+
26
+ def warden
27
+ env['warden']
28
+ end
29
+ end
File without changes
@@ -0,0 +1,42 @@
1
+ module Ecrire
2
+ class PostsController < ::ApplicationController
3
+ # TODO: This should be included. I have no idea why this isn't.
4
+ # It actually is loaded in dev as soon as the reloader reloads the files
5
+ include Rails.application.routes.url_helpers
6
+
7
+ before_action :pagination, only: :index
8
+ protect_from_forgery except: :index
9
+
10
+ helper_method :post
11
+
12
+ def index
13
+ respond_to do |format|
14
+ format.html
15
+ format.rss
16
+ format.json do
17
+ headers['Access-Control-Allow-Origin'] = '*'
18
+ end
19
+ end
20
+ end
21
+
22
+ def show
23
+ redirect_to :root and return if post.nil?
24
+ redirect_to :root and return unless post.published?
25
+ end
26
+
27
+ protected
28
+
29
+ def posts
30
+ @post ||= Post.published.page(params[:page]).per(params[:per]).order(:published_at)
31
+ end
32
+
33
+ def post
34
+ @post ||= Post.find_by_slug(params[:id])
35
+ end
36
+
37
+ def pagination
38
+ params[:per] ||= 10
39
+ params[:page] ||= 1
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,2 @@
1
+ class ImagesController < ApplicationController
2
+ end