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,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