vapid 0.1.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.
- checksums.yaml +7 -0
- data/.gitignore +10 -0
- data/.gitmodules +6 -0
- data/.rspec +2 -0
- data/.rubocop.yml +133 -0
- data/.travis.yml +5 -0
- data/Gemfile +10 -0
- data/README.md +37 -0
- data/Rakefile +6 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/exe/vapid +7 -0
- data/lib/vapid.rb +24 -0
- data/lib/vapid/assets/javascripts/vapid/admin.coffee +2 -0
- data/lib/vapid/assets/stylesheets/vapid/admin.scss +72 -0
- data/lib/vapid/builder.rb +70 -0
- data/lib/vapid/cli.rb +96 -0
- data/lib/vapid/controllers/admin_controller.rb +282 -0
- data/lib/vapid/controllers/project_controller.rb +41 -0
- data/lib/vapid/db/migrate/20170202182310_create_groups.rb +12 -0
- data/lib/vapid/db/migrate/20170202183017_create_records.rb +11 -0
- data/lib/vapid/db/migrate/20170202185150_create_users.rb +11 -0
- data/lib/vapid/directive.rb +168 -0
- data/lib/vapid/directives.rb +30 -0
- data/lib/vapid/directives/audio.rb +27 -0
- data/lib/vapid/directives/group.rb +71 -0
- data/lib/vapid/directives/hide.rb +11 -0
- data/lib/vapid/directives/href.rb +11 -0
- data/lib/vapid/directives/image.rb +14 -0
- data/lib/vapid/directives/richtext.rb +15 -0
- data/lib/vapid/directives/show.rb +11 -0
- data/lib/vapid/directives/text.rb +24 -0
- data/lib/vapid/directives/video.rb +28 -0
- data/lib/vapid/generator_template/.gitignore +21 -0
- data/lib/vapid/generator_template/Gemfile.tt +13 -0
- data/lib/vapid/generator_template/README.md +0 -0
- data/lib/vapid/generator_template/assets/favicon.ico +0 -0
- data/lib/vapid/generator_template/assets/images/.keep +0 -0
- data/lib/vapid/generator_template/assets/javascripts/.keep +0 -0
- data/lib/vapid/generator_template/assets/stylesheets/.keep +0 -0
- data/lib/vapid/generator_template/assets/stylesheets/application.css +120 -0
- data/lib/vapid/generator_template/config.ru +3 -0
- data/lib/vapid/generator_template/config/database.yml +12 -0
- data/lib/vapid/generator_template/config/settings.yml.tt +11 -0
- data/lib/vapid/generator_template/templates/index.html.erb +25 -0
- data/lib/vapid/generator_template/templates/layouts/default.html.erb +22 -0
- data/lib/vapid/models.rb +18 -0
- data/lib/vapid/models/group.rb +36 -0
- data/lib/vapid/models/record.rb +30 -0
- data/lib/vapid/models/user.rb +16 -0
- data/lib/vapid/server.rb +93 -0
- data/lib/vapid/settings.rb +13 -0
- data/lib/vapid/template.rb +79 -0
- data/lib/vapid/template/node.rb +91 -0
- data/lib/vapid/template/parser.rb +50 -0
- data/lib/vapid/vendor/semantic-ui/.versions +4 -0
- data/lib/vapid/vendor/semantic-ui/LICENSE +22 -0
- data/lib/vapid/vendor/semantic-ui/README.md +7 -0
- data/lib/vapid/vendor/semantic-ui/components/accordion.css +252 -0
- data/lib/vapid/vendor/semantic-ui/components/accordion.js +610 -0
- data/lib/vapid/vendor/semantic-ui/components/accordion.min.css +9 -0
- data/lib/vapid/vendor/semantic-ui/components/accordion.min.js +10 -0
- data/lib/vapid/vendor/semantic-ui/components/ad.css +275 -0
- data/lib/vapid/vendor/semantic-ui/components/ad.min.css +10 -0
- data/lib/vapid/vendor/semantic-ui/components/api.js +1167 -0
- data/lib/vapid/vendor/semantic-ui/components/api.min.js +10 -0
- data/lib/vapid/vendor/semantic-ui/components/breadcrumb.css +124 -0
- data/lib/vapid/vendor/semantic-ui/components/breadcrumb.min.css +9 -0
- data/lib/vapid/vendor/semantic-ui/components/button.css +3450 -0
- data/lib/vapid/vendor/semantic-ui/components/button.min.css +9 -0
- data/lib/vapid/vendor/semantic-ui/components/card.css +964 -0
- data/lib/vapid/vendor/semantic-ui/components/card.min.css +9 -0
- data/lib/vapid/vendor/semantic-ui/components/checkbox.css +625 -0
- data/lib/vapid/vendor/semantic-ui/components/checkbox.js +831 -0
- data/lib/vapid/vendor/semantic-ui/components/checkbox.min.css +9 -0
- data/lib/vapid/vendor/semantic-ui/components/checkbox.min.js +10 -0
- data/lib/vapid/vendor/semantic-ui/components/colorize.js +274 -0
- data/lib/vapid/vendor/semantic-ui/components/colorize.min.js +11 -0
- data/lib/vapid/vendor/semantic-ui/components/comment.css +270 -0
- data/lib/vapid/vendor/semantic-ui/components/comment.min.css +9 -0
- data/lib/vapid/vendor/semantic-ui/components/container.css +147 -0
- data/lib/vapid/vendor/semantic-ui/components/container.min.css +9 -0
- data/lib/vapid/vendor/semantic-ui/components/dimmer.css +200 -0
- data/lib/vapid/vendor/semantic-ui/components/dimmer.js +708 -0
- data/lib/vapid/vendor/semantic-ui/components/dimmer.min.css +9 -0
- data/lib/vapid/vendor/semantic-ui/components/dimmer.min.js +10 -0
- data/lib/vapid/vendor/semantic-ui/components/divider.css +260 -0
- data/lib/vapid/vendor/semantic-ui/components/divider.min.css +9 -0
- data/lib/vapid/vendor/semantic-ui/components/dropdown.css +1442 -0
- data/lib/vapid/vendor/semantic-ui/components/dropdown.js +3767 -0
- data/lib/vapid/vendor/semantic-ui/components/dropdown.min.css +9 -0
- data/lib/vapid/vendor/semantic-ui/components/dropdown.min.js +11 -0
- data/lib/vapid/vendor/semantic-ui/components/embed.css +166 -0
- data/lib/vapid/vendor/semantic-ui/components/embed.js +696 -0
- data/lib/vapid/vendor/semantic-ui/components/embed.min.css +9 -0
- data/lib/vapid/vendor/semantic-ui/components/embed.min.js +10 -0
- data/lib/vapid/vendor/semantic-ui/components/feed.css +296 -0
- data/lib/vapid/vendor/semantic-ui/components/feed.min.css +9 -0
- data/lib/vapid/vendor/semantic-ui/components/flag.css +1031 -0
- data/lib/vapid/vendor/semantic-ui/components/flag.min.css +9 -0
- data/lib/vapid/vendor/semantic-ui/components/form.css +1067 -0
- data/lib/vapid/vendor/semantic-ui/components/form.js +1603 -0
- data/lib/vapid/vendor/semantic-ui/components/form.min.css +9 -0
- data/lib/vapid/vendor/semantic-ui/components/form.min.js +10 -0
- data/lib/vapid/vendor/semantic-ui/components/grid.css +2002 -0
- data/lib/vapid/vendor/semantic-ui/components/grid.min.css +9 -0
- data/lib/vapid/vendor/semantic-ui/components/header.css +721 -0
- data/lib/vapid/vendor/semantic-ui/components/header.min.css +9 -0
- data/lib/vapid/vendor/semantic-ui/components/icon.css +3292 -0
- data/lib/vapid/vendor/semantic-ui/components/icon.min.css +9 -0
- data/lib/vapid/vendor/semantic-ui/components/image.css +306 -0
- data/lib/vapid/vendor/semantic-ui/components/image.min.css +9 -0
- data/lib/vapid/vendor/semantic-ui/components/input.css +510 -0
- data/lib/vapid/vendor/semantic-ui/components/input.min.css +9 -0
- data/lib/vapid/vendor/semantic-ui/components/item.css +486 -0
- data/lib/vapid/vendor/semantic-ui/components/item.min.css +9 -0
- data/lib/vapid/vendor/semantic-ui/components/label.css +1307 -0
- data/lib/vapid/vendor/semantic-ui/components/label.min.css +9 -0
- data/lib/vapid/vendor/semantic-ui/components/list.css +951 -0
- data/lib/vapid/vendor/semantic-ui/components/list.min.css +9 -0
- data/lib/vapid/vendor/semantic-ui/components/loader.css +347 -0
- data/lib/vapid/vendor/semantic-ui/components/loader.min.css +9 -0
- data/lib/vapid/vendor/semantic-ui/components/menu.css +2002 -0
- data/lib/vapid/vendor/semantic-ui/components/menu.min.css +1 -0
- data/lib/vapid/vendor/semantic-ui/components/message.css +477 -0
- data/lib/vapid/vendor/semantic-ui/components/message.min.css +9 -0
- data/lib/vapid/vendor/semantic-ui/components/modal.css +502 -0
- data/lib/vapid/vendor/semantic-ui/components/modal.js +913 -0
- data/lib/vapid/vendor/semantic-ui/components/modal.min.css +9 -0
- data/lib/vapid/vendor/semantic-ui/components/modal.min.js +10 -0
- data/lib/vapid/vendor/semantic-ui/components/nag.css +147 -0
- data/lib/vapid/vendor/semantic-ui/components/nag.js +507 -0
- data/lib/vapid/vendor/semantic-ui/components/nag.min.css +9 -0
- data/lib/vapid/vendor/semantic-ui/components/nag.min.js +10 -0
- data/lib/vapid/vendor/semantic-ui/components/popup.css +733 -0
- data/lib/vapid/vendor/semantic-ui/components/popup.js +1475 -0
- data/lib/vapid/vendor/semantic-ui/components/popup.min.css +9 -0
- data/lib/vapid/vendor/semantic-ui/components/popup.min.js +10 -0
- data/lib/vapid/vendor/semantic-ui/components/progress.css +516 -0
- data/lib/vapid/vendor/semantic-ui/components/progress.js +931 -0
- data/lib/vapid/vendor/semantic-ui/components/progress.min.css +9 -0
- data/lib/vapid/vendor/semantic-ui/components/progress.min.js +10 -0
- data/lib/vapid/vendor/semantic-ui/components/rail.css +152 -0
- data/lib/vapid/vendor/semantic-ui/components/rail.min.css +9 -0
- data/lib/vapid/vendor/semantic-ui/components/rating.css +263 -0
- data/lib/vapid/vendor/semantic-ui/components/rating.js +508 -0
- data/lib/vapid/vendor/semantic-ui/components/rating.min.css +9 -0
- data/lib/vapid/vendor/semantic-ui/components/rating.min.js +10 -0
- data/lib/vapid/vendor/semantic-ui/components/reset.css +424 -0
- data/lib/vapid/vendor/semantic-ui/components/reset.min.css +9 -0
- data/lib/vapid/vendor/semantic-ui/components/reveal.css +284 -0
- data/lib/vapid/vendor/semantic-ui/components/reveal.min.css +9 -0
- data/lib/vapid/vendor/semantic-ui/components/search.css +408 -0
- data/lib/vapid/vendor/semantic-ui/components/search.js +1442 -0
- data/lib/vapid/vendor/semantic-ui/components/search.min.css +9 -0
- data/lib/vapid/vendor/semantic-ui/components/search.min.js +10 -0
- data/lib/vapid/vendor/semantic-ui/components/segment.css +798 -0
- data/lib/vapid/vendor/semantic-ui/components/segment.min.css +9 -0
- data/lib/vapid/vendor/semantic-ui/components/shape.css +157 -0
- data/lib/vapid/vendor/semantic-ui/components/shape.js +921 -0
- data/lib/vapid/vendor/semantic-ui/components/shape.min.css +9 -0
- data/lib/vapid/vendor/semantic-ui/components/shape.min.js +10 -0
- data/lib/vapid/vendor/semantic-ui/components/sidebar.css +634 -0
- data/lib/vapid/vendor/semantic-ui/components/sidebar.js +1036 -0
- data/lib/vapid/vendor/semantic-ui/components/sidebar.min.css +9 -0
- data/lib/vapid/vendor/semantic-ui/components/sidebar.min.js +10 -0
- data/lib/vapid/vendor/semantic-ui/components/site.css +160 -0
- data/lib/vapid/vendor/semantic-ui/components/site.js +487 -0
- data/lib/vapid/vendor/semantic-ui/components/site.min.css +9 -0
- data/lib/vapid/vendor/semantic-ui/components/site.min.js +10 -0
- data/lib/vapid/vendor/semantic-ui/components/state.js +708 -0
- data/lib/vapid/vendor/semantic-ui/components/state.min.js +10 -0
- data/lib/vapid/vendor/semantic-ui/components/statistic.css +569 -0
- data/lib/vapid/vendor/semantic-ui/components/statistic.min.css +9 -0
- data/lib/vapid/vendor/semantic-ui/components/step.css +623 -0
- data/lib/vapid/vendor/semantic-ui/components/step.min.css +9 -0
- data/lib/vapid/vendor/semantic-ui/components/sticky.css +78 -0
- data/lib/vapid/vendor/semantic-ui/components/sticky.js +942 -0
- data/lib/vapid/vendor/semantic-ui/components/sticky.min.css +9 -0
- data/lib/vapid/vendor/semantic-ui/components/sticky.min.js +10 -0
- data/lib/vapid/vendor/semantic-ui/components/tab.css +91 -0
- data/lib/vapid/vendor/semantic-ui/components/tab.js +952 -0
- data/lib/vapid/vendor/semantic-ui/components/tab.min.css +9 -0
- data/lib/vapid/vendor/semantic-ui/components/tab.min.js +10 -0
- data/lib/vapid/vendor/semantic-ui/components/table.css +1108 -0
- data/lib/vapid/vendor/semantic-ui/components/table.min.css +9 -0
- data/lib/vapid/vendor/semantic-ui/components/transition.css +1964 -0
- data/lib/vapid/vendor/semantic-ui/components/transition.js +1095 -0
- data/lib/vapid/vendor/semantic-ui/components/transition.min.css +9 -0
- data/lib/vapid/vendor/semantic-ui/components/transition.min.js +10 -0
- data/lib/vapid/vendor/semantic-ui/components/video.css +125 -0
- data/lib/vapid/vendor/semantic-ui/components/video.js +532 -0
- data/lib/vapid/vendor/semantic-ui/components/video.min.css +10 -0
- data/lib/vapid/vendor/semantic-ui/components/video.min.js +11 -0
- data/lib/vapid/vendor/semantic-ui/components/visibility.js +1288 -0
- data/lib/vapid/vendor/semantic-ui/components/visibility.min.js +10 -0
- data/lib/vapid/vendor/semantic-ui/components/visit.js +517 -0
- data/lib/vapid/vendor/semantic-ui/components/visit.min.js +11 -0
- data/lib/vapid/vendor/semantic-ui/package.js +34 -0
- data/lib/vapid/vendor/semantic-ui/package.json +20 -0
- data/lib/vapid/vendor/semantic-ui/semantic.css +36844 -0
- data/lib/vapid/vendor/semantic-ui/semantic.js +22617 -0
- data/lib/vapid/vendor/semantic-ui/semantic.min.css +364 -0
- data/lib/vapid/vendor/semantic-ui/semantic.min.js +19 -0
- data/lib/vapid/vendor/semantic-ui/themes/default/assets/fonts/icons.eot +0 -0
- data/lib/vapid/vendor/semantic-ui/themes/default/assets/fonts/icons.otf +0 -0
- data/lib/vapid/vendor/semantic-ui/themes/default/assets/fonts/icons.svg +2671 -0
- data/lib/vapid/vendor/semantic-ui/themes/default/assets/fonts/icons.ttf +0 -0
- data/lib/vapid/vendor/semantic-ui/themes/default/assets/fonts/icons.woff +0 -0
- data/lib/vapid/vendor/semantic-ui/themes/default/assets/fonts/icons.woff2 +0 -0
- data/lib/vapid/vendor/semantic-ui/themes/default/assets/images/flags.png +0 -0
- data/lib/vapid/vendor/trix/.blade.yml +45 -0
- data/lib/vapid/vendor/trix/.github/ISSUE_TEMPLATE.md +13 -0
- data/lib/vapid/vendor/trix/.gitignore +3 -0
- data/lib/vapid/vendor/trix/.ruby-version +1 -0
- data/lib/vapid/vendor/trix/.travis.yml +6 -0
- data/lib/vapid/vendor/trix/CONDUCT.md +79 -0
- data/lib/vapid/vendor/trix/Gemfile +17 -0
- data/lib/vapid/vendor/trix/Gemfile.lock +152 -0
- data/lib/vapid/vendor/trix/LICENSE +20 -0
- data/lib/vapid/vendor/trix/README.md +382 -0
- data/lib/vapid/vendor/trix/assets/index.html +55 -0
- data/lib/vapid/vendor/trix/assets/trix-core.coffee +2 -0
- data/lib/vapid/vendor/trix/assets/trix.coffee +3 -0
- data/lib/vapid/vendor/trix/assets/trix.scss +5 -0
- data/lib/vapid/vendor/trix/assets/trix/banner/index.coffee.erb +3 -0
- data/lib/vapid/vendor/trix/assets/trix/banner/index.scss.erb +3 -0
- data/lib/vapid/vendor/trix/assets/trix/banner/index.txt.erb +3 -0
- data/lib/vapid/vendor/trix/assets/trix/images/README.md +6 -0
- data/lib/vapid/vendor/trix/assets/trix/images/attach.svg +5 -0
- data/lib/vapid/vendor/trix/assets/trix/images/bold.svg +5 -0
- data/lib/vapid/vendor/trix/assets/trix/images/bullets.svg +5 -0
- data/lib/vapid/vendor/trix/assets/trix/images/code.svg +5 -0
- data/lib/vapid/vendor/trix/assets/trix/images/heading_1.svg +5 -0
- data/lib/vapid/vendor/trix/assets/trix/images/italic.svg +5 -0
- data/lib/vapid/vendor/trix/assets/trix/images/link.svg +6 -0
- data/lib/vapid/vendor/trix/assets/trix/images/nesting_level_decrease.svg +5 -0
- data/lib/vapid/vendor/trix/assets/trix/images/nesting_level_increase.svg +5 -0
- data/lib/vapid/vendor/trix/assets/trix/images/numbers.svg +5 -0
- data/lib/vapid/vendor/trix/assets/trix/images/quote.svg +5 -0
- data/lib/vapid/vendor/trix/assets/trix/images/redo.svg +5 -0
- data/lib/vapid/vendor/trix/assets/trix/images/remove.svg +4 -0
- data/lib/vapid/vendor/trix/assets/trix/images/strike.svg +6 -0
- data/lib/vapid/vendor/trix/assets/trix/images/trash.svg +5 -0
- data/lib/vapid/vendor/trix/assets/trix/images/undo.svg +5 -0
- data/lib/vapid/vendor/trix/assets/trix/stylesheets/attachments.scss +112 -0
- data/lib/vapid/vendor/trix/assets/trix/stylesheets/content.scss +88 -0
- data/lib/vapid/vendor/trix/assets/trix/stylesheets/editor.scss +8 -0
- data/lib/vapid/vendor/trix/assets/trix/stylesheets/icons.scss +14 -0
- data/lib/vapid/vendor/trix/assets/trix/stylesheets/media-queries.scss +7 -0
- data/lib/vapid/vendor/trix/assets/trix/stylesheets/toolbar.scss +194 -0
- data/lib/vapid/vendor/trix/bin/blade +16 -0
- data/lib/vapid/vendor/trix/bin/ci +21 -0
- data/lib/vapid/vendor/trix/bin/rackup +16 -0
- data/lib/vapid/vendor/trix/bin/rake +16 -0
- data/lib/vapid/vendor/trix/bin/release +139 -0
- data/lib/vapid/vendor/trix/bin/setup +69 -0
- data/lib/vapid/vendor/trix/bin/update-status-image +100 -0
- data/lib/vapid/vendor/trix/bower.json +34 -0
- data/lib/vapid/vendor/trix/config.ru +32 -0
- data/lib/vapid/vendor/trix/dist/trix-core.js +11 -0
- data/lib/vapid/vendor/trix/dist/trix.css +286 -0
- data/lib/vapid/vendor/trix/dist/trix.js +20 -0
- data/lib/vapid/vendor/trix/package.json +29 -0
- data/lib/vapid/vendor/trix/polyfills/polyfills.coffee +3 -0
- data/lib/vapid/vendor/trix/polyfills/set.coffee +24 -0
- data/lib/vapid/vendor/trix/polyfills/vendor/CustomElements.js +1029 -0
- data/lib/vapid/vendor/trix/polyfills/vendor/README.md +2 -0
- data/lib/vapid/vendor/trix/polyfills/vendor/promise.js +228 -0
- data/lib/vapid/vendor/trix/src/trix/VERSION +1 -0
- data/lib/vapid/vendor/trix/src/trix/config/block_attributes.coffee +37 -0
- data/lib/vapid/vendor/trix/src/trix/config/css.coffee +12 -0
- data/lib/vapid/vendor/trix/src/trix/config/file_size_formatting.coffee +22 -0
- data/lib/vapid/vendor/trix/src/trix/config/index.coffee +9 -0
- data/lib/vapid/vendor/trix/src/trix/config/lang.coffee +26 -0
- data/lib/vapid/vendor/trix/src/trix/config/selection_elements.coffee +26 -0
- data/lib/vapid/vendor/trix/src/trix/config/serialization.coffee +63 -0
- data/lib/vapid/vendor/trix/src/trix/config/text_attributes.coffee +25 -0
- data/lib/vapid/vendor/trix/src/trix/config/toolbar.coffee +41 -0
- data/lib/vapid/vendor/trix/src/trix/config/undo_interval.coffee +7 -0
- data/lib/vapid/vendor/trix/src/trix/controllers/attachment_editor_controller.coffee +104 -0
- data/lib/vapid/vendor/trix/src/trix/controllers/composition_controller.coffee +117 -0
- data/lib/vapid/vendor/trix/src/trix/controllers/controller.coffee +3 -0
- data/lib/vapid/vendor/trix/src/trix/controllers/editor_controller.coffee +369 -0
- data/lib/vapid/vendor/trix/src/trix/controllers/input/composition_input.coffee +57 -0
- data/lib/vapid/vendor/trix/src/trix/controllers/input_controller.coffee +473 -0
- data/lib/vapid/vendor/trix/src/trix/controllers/toolbar_controller.coffee +173 -0
- data/lib/vapid/vendor/trix/src/trix/core/basic_object.coffee +44 -0
- data/lib/vapid/vendor/trix/src/trix/core/collections/element_store.coffee +21 -0
- data/lib/vapid/vendor/trix/src/trix/core/collections/hash.coffee +98 -0
- data/lib/vapid/vendor/trix/src/trix/core/collections/index.coffee +4 -0
- data/lib/vapid/vendor/trix/src/trix/core/collections/object_group.coffee +37 -0
- data/lib/vapid/vendor/trix/src/trix/core/collections/object_map.coffee +10 -0
- data/lib/vapid/vendor/trix/src/trix/core/helpers/arrays.coffee +34 -0
- data/lib/vapid/vendor/trix/src/trix/core/helpers/config.coffee +23 -0
- data/lib/vapid/vendor/trix/src/trix/core/helpers/custom_elements.coffee +45 -0
- data/lib/vapid/vendor/trix/src/trix/core/helpers/dom.coffee +185 -0
- data/lib/vapid/vendor/trix/src/trix/core/helpers/extend.coffee +4 -0
- data/lib/vapid/vendor/trix/src/trix/core/helpers/functions.coffee +3 -0
- data/lib/vapid/vendor/trix/src/trix/core/helpers/global.coffee +23 -0
- data/lib/vapid/vendor/trix/src/trix/core/helpers/index.coffee +10 -0
- data/lib/vapid/vendor/trix/src/trix/core/helpers/objects.coffee +11 -0
- data/lib/vapid/vendor/trix/src/trix/core/helpers/ranges.coffee +33 -0
- data/lib/vapid/vendor/trix/src/trix/core/helpers/selection.coffee +25 -0
- data/lib/vapid/vendor/trix/src/trix/core/helpers/strings.coffee +46 -0
- data/lib/vapid/vendor/trix/src/trix/core/index.coffee +4 -0
- data/lib/vapid/vendor/trix/src/trix/core/object.coffee +33 -0
- data/lib/vapid/vendor/trix/src/trix/core/utilities/index.coffee +2 -0
- data/lib/vapid/vendor/trix/src/trix/core/utilities/operation.coffee +37 -0
- data/lib/vapid/vendor/trix/src/trix/core/utilities/utf16_string.coffee +93 -0
- data/lib/vapid/vendor/trix/src/trix/elements/trix_editor_element.coffee +166 -0
- data/lib/vapid/vendor/trix/src/trix/elements/trix_toolbar_element.coffee +28 -0
- data/lib/vapid/vendor/trix/src/trix/index.coffee.erb +14 -0
- data/lib/vapid/vendor/trix/src/trix/inspector/control_element.coffee +60 -0
- data/lib/vapid/vendor/trix/src/trix/inspector/debugger.coffee +104 -0
- data/lib/vapid/vendor/trix/src/trix/inspector/element.coffee +86 -0
- data/lib/vapid/vendor/trix/src/trix/inspector/index.coffee +17 -0
- data/lib/vapid/vendor/trix/src/trix/inspector/polyfills/vendor/details-element-polyfill.js +5 -0
- data/lib/vapid/vendor/trix/src/trix/inspector/templates/debug.jst.eco +17 -0
- data/lib/vapid/vendor/trix/src/trix/inspector/templates/document.jst.eco +33 -0
- data/lib/vapid/vendor/trix/src/trix/inspector/templates/performance.jst.eco +10 -0
- data/lib/vapid/vendor/trix/src/trix/inspector/templates/render.jst.eco +1 -0
- data/lib/vapid/vendor/trix/src/trix/inspector/templates/selection.jst.eco +5 -0
- data/lib/vapid/vendor/trix/src/trix/inspector/templates/undo.jst.eco +13 -0
- data/lib/vapid/vendor/trix/src/trix/inspector/view.coffee +58 -0
- data/lib/vapid/vendor/trix/src/trix/inspector/views/debug_view.coffee +33 -0
- data/lib/vapid/vendor/trix/src/trix/inspector/views/document_view.coffee +12 -0
- data/lib/vapid/vendor/trix/src/trix/inspector/views/performance_view.coffee +51 -0
- data/lib/vapid/vendor/trix/src/trix/inspector/views/render_view.coffee +21 -0
- data/lib/vapid/vendor/trix/src/trix/inspector/views/selection_view.coffee +33 -0
- data/lib/vapid/vendor/trix/src/trix/inspector/views/undo_view.coffee +12 -0
- data/lib/vapid/vendor/trix/src/trix/inspector/watchdog/deserializer.coffee +55 -0
- data/lib/vapid/vendor/trix/src/trix/inspector/watchdog/index.coffee +5 -0
- data/lib/vapid/vendor/trix/src/trix/inspector/watchdog/player.coffee +60 -0
- data/lib/vapid/vendor/trix/src/trix/inspector/watchdog/player_controller.coffee +43 -0
- data/lib/vapid/vendor/trix/src/trix/inspector/watchdog/player_element.coffee +32 -0
- data/lib/vapid/vendor/trix/src/trix/inspector/watchdog/player_view.coffee +133 -0
- data/lib/vapid/vendor/trix/src/trix/inspector/watchdog/recorder.coffee +82 -0
- data/lib/vapid/vendor/trix/src/trix/inspector/watchdog/recording.coffee +54 -0
- data/lib/vapid/vendor/trix/src/trix/inspector/watchdog/serializer.coffee +61 -0
- data/lib/vapid/vendor/trix/src/trix/models/attachment.coffee +157 -0
- data/lib/vapid/vendor/trix/src/trix/models/attachment_manager.coffee +24 -0
- data/lib/vapid/vendor/trix/src/trix/models/attachment_piece.coffee +47 -0
- data/lib/vapid/vendor/trix/src/trix/models/block.coffee +230 -0
- data/lib/vapid/vendor/trix/src/trix/models/composition.coffee +521 -0
- data/lib/vapid/vendor/trix/src/trix/models/document.coffee +538 -0
- data/lib/vapid/vendor/trix/src/trix/models/editor.coffee +141 -0
- data/lib/vapid/vendor/trix/src/trix/models/html_parser.coffee +335 -0
- data/lib/vapid/vendor/trix/src/trix/models/line_break_insertion.coffee +31 -0
- data/lib/vapid/vendor/trix/src/trix/models/location_mapper.coffee +156 -0
- data/lib/vapid/vendor/trix/src/trix/models/managed_attachment.coffee +28 -0
- data/lib/vapid/vendor/trix/src/trix/models/piece.coffee +95 -0
- data/lib/vapid/vendor/trix/src/trix/models/point_mapper.coffee +28 -0
- data/lib/vapid/vendor/trix/src/trix/models/selection_manager.coffee +129 -0
- data/lib/vapid/vendor/trix/src/trix/models/splittable_list.coffee +168 -0
- data/lib/vapid/vendor/trix/src/trix/models/string_piece.coffee +49 -0
- data/lib/vapid/vendor/trix/src/trix/models/text.coffee +168 -0
- data/lib/vapid/vendor/trix/src/trix/models/undo_manager.coffee +40 -0
- data/lib/vapid/vendor/trix/src/trix/observers/mutation_observer.coffee +131 -0
- data/lib/vapid/vendor/trix/src/trix/observers/selection_change_observer.coffee +56 -0
- data/lib/vapid/vendor/trix/src/trix/operations/file_verification_operation.coffee +15 -0
- data/lib/vapid/vendor/trix/src/trix/operations/image_preload_operation.coffee +15 -0
- data/lib/vapid/vendor/trix/src/trix/views/attachment_view.coffee +99 -0
- data/lib/vapid/vendor/trix/src/trix/views/block_view.coffee +37 -0
- data/lib/vapid/vendor/trix/src/trix/views/document_view.coffee +68 -0
- data/lib/vapid/vendor/trix/src/trix/views/object_group_view.coffee +23 -0
- data/lib/vapid/vendor/trix/src/trix/views/object_view.coffee +86 -0
- data/lib/vapid/vendor/trix/src/trix/views/piece_view.coffee +97 -0
- data/lib/vapid/vendor/trix/src/trix/views/previewable_attachment_view.coffee +49 -0
- data/lib/vapid/vendor/trix/src/trix/views/text_view.coffee +30 -0
- data/lib/vapid/vendor/trix/test/.gitignore +1 -0
- data/lib/vapid/vendor/trix/test/src/system/attachment_test.coffee +70 -0
- data/lib/vapid/vendor/trix/test/src/system/basic_input_test.coffee +68 -0
- data/lib/vapid/vendor/trix/test/src/system/block_formatting_test.coffee +602 -0
- data/lib/vapid/vendor/trix/test/src/system/caching_test.coffee +21 -0
- data/lib/vapid/vendor/trix/test/src/system/composition_input_test.coffee +138 -0
- data/lib/vapid/vendor/trix/test/src/system/cursor_movement_test.coffee +54 -0
- data/lib/vapid/vendor/trix/test/src/system/custom_element_test.coffee +314 -0
- data/lib/vapid/vendor/trix/test/src/system/html_loading_test.coffee +62 -0
- data/lib/vapid/vendor/trix/test/src/system/html_replacement_test.coffee +101 -0
- data/lib/vapid/vendor/trix/test/src/system/installation_process_test.coffee +59 -0
- data/lib/vapid/vendor/trix/test/src/system/list_formatting_test.coffee +70 -0
- data/lib/vapid/vendor/trix/test/src/system/mutation_input_test.coffee +73 -0
- data/lib/vapid/vendor/trix/test/src/system/pasting_test.coffee +215 -0
- data/lib/vapid/vendor/trix/test/src/system/text_formatting_test.coffee +151 -0
- data/lib/vapid/vendor/trix/test/src/system/undo_test.coffee +48 -0
- data/lib/vapid/vendor/trix/test/src/test.coffee +16 -0
- data/lib/vapid/vendor/trix/test/src/test_helpers/assertions.coffee +38 -0
- data/lib/vapid/vendor/trix/test/src/test_helpers/editor_helpers.coffee +37 -0
- data/lib/vapid/vendor/trix/test/src/test_helpers/fixtures/editor_empty.jst.eco +1 -0
- data/lib/vapid/vendor/trix/test/src/test_helpers/fixtures/editor_html.jst.eco +2 -0
- data/lib/vapid/vendor/trix/test/src/test_helpers/fixtures/editor_in_table.jst.eco +7 -0
- data/lib/vapid/vendor/trix/test/src/test_helpers/fixtures/editor_with_block_styles.jst.eco +6 -0
- data/lib/vapid/vendor/trix/test/src/test_helpers/fixtures/editor_with_bold_styles.jst.eco +7 -0
- data/lib/vapid/vendor/trix/test/src/test_helpers/fixtures/editor_with_image.jst.eco +2 -0
- data/lib/vapid/vendor/trix/test/src/test_helpers/fixtures/editor_with_styled_content.jst.eco +7 -0
- data/lib/vapid/vendor/trix/test/src/test_helpers/fixtures/editor_with_toolbar_and_input.jst.eco +5 -0
- data/lib/vapid/vendor/trix/test/src/test_helpers/fixtures/fixtures.coffee +536 -0
- data/lib/vapid/vendor/trix/test/src/test_helpers/fixtures/logo.png +0 -0
- data/lib/vapid/vendor/trix/test/src/test_helpers/index.coffee +18 -0
- data/lib/vapid/vendor/trix/test/src/test_helpers/input_helpers.coffee +183 -0
- data/lib/vapid/vendor/trix/test/src/test_helpers/selection_helpers.coffee +91 -0
- data/lib/vapid/vendor/trix/test/src/test_helpers/test_helpers.coffee +72 -0
- data/lib/vapid/vendor/trix/test/src/test_helpers/test_stubs.coffee +31 -0
- data/lib/vapid/vendor/trix/test/src/test_helpers/toolbar_helpers.coffee +45 -0
- data/lib/vapid/vendor/trix/test/src/unit/attachment_test.coffee +23 -0
- data/lib/vapid/vendor/trix/test/src/unit/block_test.coffee +22 -0
- data/lib/vapid/vendor/trix/test/src/unit/composition_test.coffee +13 -0
- data/lib/vapid/vendor/trix/test/src/unit/document_test.coffee +11 -0
- data/lib/vapid/vendor/trix/test/src/unit/document_view_test.coffee +6 -0
- data/lib/vapid/vendor/trix/test/src/unit/html_parser_test.coffee +162 -0
- data/lib/vapid/vendor/trix/test/src/unit/location_mapper_test.coffee +185 -0
- data/lib/vapid/vendor/trix/test/src/unit/mutation_observer_test.coffee +84 -0
- data/lib/vapid/vendor/trix/test/src/unit/serialization_test.coffee +7 -0
- data/lib/vapid/vendor/trix/test/src/unit/string_change_summary_test.coffee +57 -0
- data/lib/vapid/vendor/trix/test/src/unit/text_test.coffee +19 -0
- data/lib/vapid/vendor/trix/test/vendor/rangy-core.js +3845 -0
- data/lib/vapid/vendor/trix/test/vendor/rangy-textrange.js +1930 -0
- data/lib/vapid/version.rb +4 -0
- data/lib/vapid/views/admin/install.html.erb +19 -0
- data/lib/vapid/views/admin/login.html.erb +11 -0
- data/lib/vapid/views/admin/overview/index.html.erb +1 -0
- data/lib/vapid/views/admin/records/_form.erb +9 -0
- data/lib/vapid/views/admin/records/edit.html.erb +5 -0
- data/lib/vapid/views/admin/records/index.html.erb +38 -0
- data/lib/vapid/views/admin/records/new.html.erb +3 -0
- data/lib/vapid/views/errors/404.html.erb +1 -0
- data/lib/vapid/views/errors/500.html.erb +1 -0
- data/lib/vapid/views/layouts/admin.html.erb +41 -0
- data/lib/vapid/views/layouts/admin_form.html.erb +22 -0
- data/lib/vapid/views/layouts/error.html.erb +11 -0
- data/vapid.gemspec +48 -0
- metadata +811 -0
@@ -0,0 +1,25 @@
|
|
1
|
+
<div class="hero">
|
2
|
+
<div class="container">
|
3
|
+
<h1>Hello, <span vp-text="world"></span></h1>
|
4
|
+
<div vp-show="world">Nice to meet you, and congrats on getting this set up.</div>
|
5
|
+
</div>
|
6
|
+
</div>
|
7
|
+
|
8
|
+
<div class="how container">
|
9
|
+
<ul>
|
10
|
+
<li>
|
11
|
+
<h2>Develop</h2>
|
12
|
+
<p>Use special HTML attributes, like <code>vp-text</code> and <code>vp-richtext</code> to describe the data model. Group attributes together using <code>vp-group</code>.</p>
|
13
|
+
</li>
|
14
|
+
<li>
|
15
|
+
<h2>Build</h2>
|
16
|
+
<p>Execute <code>vapid build</code> from the command line, or through your <%= link_to "admin login", "/admin" %>, and see your data model converted into a custom control panel.</p>
|
17
|
+
</li>
|
18
|
+
<li>
|
19
|
+
<h2>Deploy</h2>
|
20
|
+
<p>Host your content on Vapid's servers using <code>vapid deploy</code>, or on a Rack-compliant server like Heroku.</p>
|
21
|
+
</li>
|
22
|
+
</ul>
|
23
|
+
|
24
|
+
<p class="support">And if you get into any trouble, <code>vapid support</code>.</p>
|
25
|
+
</div>
|
@@ -0,0 +1,22 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>Vapid</title>
|
5
|
+
<%= stylesheet_link_tag "application" %>
|
6
|
+
</head>
|
7
|
+
<body>
|
8
|
+
<nav>
|
9
|
+
<div class="container">
|
10
|
+
<%= link_to "Vapid", "/", class: "vapid" %>
|
11
|
+
|
12
|
+
<ul>
|
13
|
+
<li><%= link_to "Admin Login", "/admin" %></li>
|
14
|
+
</ul>
|
15
|
+
</div>
|
16
|
+
</nav>
|
17
|
+
|
18
|
+
<main>
|
19
|
+
<%= yield %>
|
20
|
+
</main>
|
21
|
+
</body>
|
22
|
+
</html>
|
data/lib/vapid/models.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
require "sinatra/activerecord"
|
2
|
+
require_relative "models/group"
|
3
|
+
require_relative "models/record"
|
4
|
+
require_relative "models/user"
|
5
|
+
|
6
|
+
module Vapid
|
7
|
+
# Namespace for models
|
8
|
+
module Models
|
9
|
+
ActiveRecord::Base.logger = nil
|
10
|
+
ActiveRecord::Tasks::DatabaseTasks.tap do |config|
|
11
|
+
config.migrations_paths = [File.join(File.dirname(__FILE__), "db", "migrate")]
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.migrate!
|
15
|
+
ActiveRecord::Tasks::DatabaseTasks.migrate
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Vapid
|
2
|
+
module Models
|
3
|
+
# Group model
|
4
|
+
class Group < ActiveRecord::Base
|
5
|
+
DEFAULT_NAME = "general".freeze
|
6
|
+
|
7
|
+
serialize :fields, JSON
|
8
|
+
|
9
|
+
has_many :records, dependent: :destroy
|
10
|
+
accepts_nested_attributes_for :records, allow_destroy: true
|
11
|
+
|
12
|
+
default_scope { order("name = '#{DEFAULT_NAME}' DESC, created_at DESC") }
|
13
|
+
scope :with_fields, -> { where("fields <> ?", "{}") }
|
14
|
+
|
15
|
+
def self.named(name)
|
16
|
+
find_by(name: name.downcase) if table_exists?
|
17
|
+
end
|
18
|
+
|
19
|
+
def name=(name)
|
20
|
+
super name.try(:downcase)
|
21
|
+
end
|
22
|
+
|
23
|
+
def fields=(fields)
|
24
|
+
super fields.each_with_object({}) { |(k, v), h| h[k.downcase] = v }
|
25
|
+
end
|
26
|
+
|
27
|
+
def text_fields
|
28
|
+
fields.select { |_k, v| v == "text" }.keys
|
29
|
+
end
|
30
|
+
|
31
|
+
def display_name
|
32
|
+
(repeating? ? name.pluralize : name).capitalize
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Vapid
|
2
|
+
module Models
|
3
|
+
# Record model
|
4
|
+
class Record < ActiveRecord::Base
|
5
|
+
serialize :content, JSON
|
6
|
+
belongs_to :group, touch: true
|
7
|
+
validates :group, presence: true
|
8
|
+
|
9
|
+
def display_name
|
10
|
+
content["name"] || content["title"]
|
11
|
+
end
|
12
|
+
|
13
|
+
def slug
|
14
|
+
return unless display_name
|
15
|
+
display_name.downcase.gsub(/[^a-z0-9]+/, "-").chomp("-")
|
16
|
+
end
|
17
|
+
|
18
|
+
def url
|
19
|
+
return unless group.repeating?
|
20
|
+
|
21
|
+
parts = [group.name, id, slug].reject(&:nil?)
|
22
|
+
"/#{parts.join('/')}".downcase
|
23
|
+
end
|
24
|
+
|
25
|
+
def content_summary
|
26
|
+
group.text_fields.any? ? content.values_at(*group.text_fields).join(", ") : content.to_json
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Vapid
|
2
|
+
module Models
|
3
|
+
# User model
|
4
|
+
class User < ActiveRecord::Base
|
5
|
+
has_secure_password
|
6
|
+
|
7
|
+
validates :email, presence: true, uniqueness: { case_sensitive: false, message: "is already taken" }
|
8
|
+
validates :password, presence: true, length: { within: 6..42 }
|
9
|
+
|
10
|
+
def self.authenticate(email, password)
|
11
|
+
user = find_by("lower(email) = ?", email.downcase)
|
12
|
+
user && user.authenticate(password)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/lib/vapid/server.rb
ADDED
@@ -0,0 +1,93 @@
|
|
1
|
+
require "sinatra/base"
|
2
|
+
require "sinatra/activerecord"
|
3
|
+
require "sinatra/extension"
|
4
|
+
require "sinatra/flash"
|
5
|
+
require "sinatra/namespace"
|
6
|
+
require "padrino-helpers"
|
7
|
+
require "coffee-script"
|
8
|
+
require "sass"
|
9
|
+
require "sprockets"
|
10
|
+
require "uglifier"
|
11
|
+
require "rack-livereload"
|
12
|
+
require_relative "controllers/admin_controller"
|
13
|
+
require_relative "controllers/project_controller"
|
14
|
+
|
15
|
+
module Vapid
|
16
|
+
# Local preview server
|
17
|
+
class Server < Sinatra::Base
|
18
|
+
configure do
|
19
|
+
enable :logging
|
20
|
+
|
21
|
+
set :gem_pwd, File.dirname(__FILE__)
|
22
|
+
set :gem_assets, File.join(gem_pwd, "assets")
|
23
|
+
set :gem_views, File.join(gem_pwd, "views")
|
24
|
+
|
25
|
+
set :project_pwd, Dir.pwd
|
26
|
+
set :project_assets, File.join(project_pwd, "assets")
|
27
|
+
set :project_views, File.join(project_pwd, "templates")
|
28
|
+
set :project_uploads, File.join(project_assets, "uploads")
|
29
|
+
|
30
|
+
set :vendor_assets, File.join(gem_pwd, "vendor")
|
31
|
+
|
32
|
+
set :uri_root, "assets"
|
33
|
+
set :public_folder, project_assets
|
34
|
+
|
35
|
+
set :sprockets, Sprockets::Environment.new
|
36
|
+
|
37
|
+
set :cache, File.join(project_pwd, ".cache")
|
38
|
+
set :reload, File.join(cache, "livereload.txt")
|
39
|
+
set :protect_from_csrf, true
|
40
|
+
|
41
|
+
sprockets.append_path project_assets
|
42
|
+
sprockets.append_path gem_assets
|
43
|
+
sprockets.append_path vendor_assets
|
44
|
+
|
45
|
+
use Rack::MethodOverride
|
46
|
+
use Rack::Session::Cookie, key: "_vapid_session",
|
47
|
+
expire_after: 2_592_000,
|
48
|
+
secret: Settings.secret_key
|
49
|
+
end
|
50
|
+
|
51
|
+
configure :development do
|
52
|
+
set :show_exceptions, :after_handler
|
53
|
+
use Rack::LiveReload, no_swf: true,
|
54
|
+
ignore: [%r{^/(admin|auth)}]
|
55
|
+
FileUtils.touch settings.reload
|
56
|
+
end
|
57
|
+
|
58
|
+
configure :production do
|
59
|
+
sprockets.js_compressor = :uglify
|
60
|
+
sprockets.css_compressor = :scss
|
61
|
+
end
|
62
|
+
|
63
|
+
helpers do
|
64
|
+
def render_view(template, options = {})
|
65
|
+
render template, options.merge(views: settings.project_views)
|
66
|
+
rescue Padrino::Rendering::TemplateNotFound, Errno::ENOENT
|
67
|
+
render template, options.merge(views: settings.gem_views)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
get "/assets/*" do
|
72
|
+
env["PATH_INFO"].sub!("/assets", "")
|
73
|
+
settings.sprockets.call(env)
|
74
|
+
end
|
75
|
+
|
76
|
+
error Padrino::Rendering::TemplateNotFound do
|
77
|
+
status 404
|
78
|
+
render "errors/404", layout: :error
|
79
|
+
end
|
80
|
+
|
81
|
+
error do
|
82
|
+
status 500
|
83
|
+
render "errors/500", layout: :error
|
84
|
+
end
|
85
|
+
|
86
|
+
register Sinatra::Flash
|
87
|
+
register Sinatra::Namespace
|
88
|
+
register Padrino::Helpers
|
89
|
+
|
90
|
+
register Controllers::AdminController
|
91
|
+
register Controllers::ProjectController
|
92
|
+
end
|
93
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# Settings
|
2
|
+
module Vapid
|
3
|
+
class Settings
|
4
|
+
def self.method_missing(sym, *)
|
5
|
+
(@settings ||= load_settings)[sym.to_s]
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.load_settings
|
9
|
+
settings_file = File.join(Dir.pwd, "config", "settings.yml")
|
10
|
+
File.exist?(settings_file) ? YAML.load_file(settings_file)[Server.environment.to_s] : {}
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
require "nokogiri"
|
2
|
+
require "nokogiri-styles"
|
3
|
+
require_relative "template/parser"
|
4
|
+
require_relative "template/node"
|
5
|
+
|
6
|
+
module Vapid
|
7
|
+
# Template handler
|
8
|
+
class Template
|
9
|
+
def initialize(html)
|
10
|
+
@html = html
|
11
|
+
@development = Server.environment == :development
|
12
|
+
end
|
13
|
+
|
14
|
+
def tree
|
15
|
+
branches = {}
|
16
|
+
|
17
|
+
@parser = Parser.new(@html, default_group)
|
18
|
+
@parser.walk do |node, group_expr|
|
19
|
+
branches[group_expr] ||= {}
|
20
|
+
node.directives.each do |type, field|
|
21
|
+
branches[group_expr][field] ||= []
|
22
|
+
branches[group_expr][field] << type
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
branches
|
27
|
+
end
|
28
|
+
|
29
|
+
def render
|
30
|
+
@parser = Parser.new(@html, default_group_content)
|
31
|
+
@parser.walk set_context: method(:fetch_content) do |node, content|
|
32
|
+
node.clone(content.size - 1) if node.cloneable?
|
33
|
+
record = node.clone? ? content[node.clone_index] : content.first
|
34
|
+
apply_directives(node, record)
|
35
|
+
end
|
36
|
+
|
37
|
+
add_development_styles if @development
|
38
|
+
|
39
|
+
@parser.to_html
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
def apply_directives(node, record)
|
45
|
+
node.directives.each do |type, field_key|
|
46
|
+
field_directive = Directives[type].new(field_key)
|
47
|
+
field_content = record.try { |r| r.content[field_directive.subject] }
|
48
|
+
node.modify field_directive.render(field_content)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def fetch_content(group_expr)
|
53
|
+
Directives::Group.new(group_expr).render.to_a
|
54
|
+
end
|
55
|
+
|
56
|
+
def default_group
|
57
|
+
Models::Group::DEFAULT_NAME
|
58
|
+
end
|
59
|
+
|
60
|
+
def default_group_content
|
61
|
+
fetch_content(default_group)
|
62
|
+
end
|
63
|
+
|
64
|
+
# TODO: Figure out a better way to do this
|
65
|
+
# Maybe let the directive determine the placeholder?
|
66
|
+
def add_development_styles
|
67
|
+
(@parser.doc.at("head") || @parser.doc.at("body")).after """
|
68
|
+
<style>
|
69
|
+
[vp-placeholder]:before { opacity: 0.5; }
|
70
|
+
[vp-placeholder][vp-text]:before { content: '{ ' attr(vp-text) ' }'; }
|
71
|
+
[vp-placeholder][vp-richtext]:before { content: '{ ' attr(vp-richtext) ' }'; }
|
72
|
+
[vp-placeholder][vp-image]:before { content: '{ ' attr(vp-image) ' }'; }
|
73
|
+
[vp-placeholder][vp-audio]:before { content: '{ ' attr(vp-audio) ' }'; }
|
74
|
+
[vp-placeholder][vp-video]:before { content: '{ ' attr(vp-video) ' }'; }
|
75
|
+
</style>
|
76
|
+
"""
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
module Vapid
|
2
|
+
class Template
|
3
|
+
# A wrapper around Nokogiri's node, so we can manipulate using our own methods
|
4
|
+
class Node
|
5
|
+
attr_reader :directives, :clone_index
|
6
|
+
|
7
|
+
def initialize(node, clone_index = 0)
|
8
|
+
@node = node
|
9
|
+
@directives = parse_directives
|
10
|
+
@clone_index = node["vp-clone"].present? ? node["vp-clone"].to_i : clone_index
|
11
|
+
end
|
12
|
+
|
13
|
+
def group_expr
|
14
|
+
@directives["group"]
|
15
|
+
end
|
16
|
+
|
17
|
+
def group?
|
18
|
+
group_expr.present?
|
19
|
+
end
|
20
|
+
|
21
|
+
def clone(num_clones = 1)
|
22
|
+
num_clones.times do |n|
|
23
|
+
cloned = @node.dup
|
24
|
+
cloned["vp-clone"] = num_clones - n
|
25
|
+
@node.after cloned
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def clone?
|
30
|
+
clone_index > 0
|
31
|
+
end
|
32
|
+
|
33
|
+
def cloneable?
|
34
|
+
group? && !clone?
|
35
|
+
end
|
36
|
+
|
37
|
+
def directives?
|
38
|
+
@directives.any?
|
39
|
+
end
|
40
|
+
|
41
|
+
def first_child
|
42
|
+
wrap @node.first_element_child
|
43
|
+
end
|
44
|
+
|
45
|
+
def next_sibling
|
46
|
+
wrap @node.next_element
|
47
|
+
end
|
48
|
+
|
49
|
+
# TODO: Abstract this, so that directives only need to pass in
|
50
|
+
# html, text, etc, and don't have to know about Nokogiri methods/concepts
|
51
|
+
def modify(obj)
|
52
|
+
return unless obj
|
53
|
+
|
54
|
+
obj.each do |prop, value|
|
55
|
+
if value.is_a?(String)
|
56
|
+
@node.send "#{prop}=", value
|
57
|
+
elsif prop == :attributes
|
58
|
+
modify_attributes(value)
|
59
|
+
elsif value.is_a?(Hash)
|
60
|
+
modify_properties(prop, value)
|
61
|
+
elsif prop == :placeholder
|
62
|
+
@node["vp-placeholder"] = true
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
private
|
68
|
+
|
69
|
+
def wrap(node)
|
70
|
+
node && self.class.new(node, clone_index)
|
71
|
+
end
|
72
|
+
|
73
|
+
def parse_directives
|
74
|
+
@node.attribute_nodes.each_with_object({}) do |attribute, memo|
|
75
|
+
vp_type = attribute.name[/^(?:data-)?vp-(.+)$/, 1]
|
76
|
+
memo[vp_type] = attribute.value if Directives[vp_type]
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def modify_attributes(attributes)
|
81
|
+
attributes.each { |k, v| @node[k.to_s] = v }
|
82
|
+
end
|
83
|
+
|
84
|
+
def modify_properties(prop, values)
|
85
|
+
property = @node.send(prop)
|
86
|
+
values.each { |k, v| property[k.to_s] = v }
|
87
|
+
@node.send "#{prop}=", property
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|