answers-core 0.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Rakefile +6 -0
- data/answers-core.gemspec +30 -0
- data/app/assets/fonts/answers/League_Gothic-webfont.eot +0 -0
- data/app/assets/fonts/answers/League_Gothic-webfont.svg +230 -0
- data/app/assets/fonts/answers/League_Gothic-webfont.ttf +0 -0
- data/app/assets/fonts/answers/League_Gothic-webfont.woff +0 -0
- data/app/assets/images/OaklandCityTree.png +0 -0
- data/app/assets/images/background_image.jpg +0 -0
- data/app/assets/images/background_pattern.png +0 -0
- data/app/assets/images/beta.png +0 -0
- data/app/assets/images/bg_transparent.png +0 -0
- data/app/assets/images/border.png +0 -0
- data/app/assets/images/brigade.png +0 -0
- data/app/assets/images/cfa.png +0 -0
- data/app/assets/images/cfa_logo.png +0 -0
- data/app/assets/images/cfa_logo_footer.png +0 -0
- data/app/assets/images/favicon.ico +0 -0
- data/app/assets/images/forest.jpeg +0 -0
- data/app/assets/images/getting_started_btn.png +0 -0
- data/app/assets/images/govuk.png +0 -0
- data/app/assets/images/openoaklandlogo.png +0 -0
- data/app/assets/images/quick_answers_icon.png +0 -0
- data/app/assets/images/quick_answers_icon_small.png +0 -0
- data/app/assets/images/searchIcon.png +0 -0
- data/app/assets/images/wmd-buttons.png +0 -0
- data/app/assets/images/yellow_bg.png +0 -0
- data/app/assets/javascripts/answers.js +19 -0
- data/app/assets/javascripts/answers/Markdown.Extra.js +304 -0
- data/app/assets/javascripts/answers/active_admin.js +62 -0
- data/app/assets/javascripts/answers/pagedown/LICENSE.txt +32 -0
- data/app/assets/javascripts/answers/pagedown/Markdown.Converter.js +1332 -0
- data/app/assets/javascripts/answers/pagedown/Markdown.Editor.js +2212 -0
- data/app/assets/javascripts/answers/pagedown/Markdown.Sanitizer.js +108 -0
- data/app/assets/javascripts/answers/pagedown/README.txt +0 -0
- data/app/assets/javascripts/answers/pagedown/demo/browser/demo.css +120 -0
- data/app/assets/javascripts/answers/pagedown/demo/browser/demo.html +83 -0
- data/app/assets/javascripts/answers/pagedown/demo/node/demo.js +44 -0
- data/app/assets/javascripts/answers/pagedown/local/Markdown.local.fr.js +43 -0
- data/app/assets/javascripts/answers/pagedown/node-pagedown.js +2 -0
- data/app/assets/javascripts/answers/pagedown/package.json +12 -0
- data/app/assets/javascripts/answers/pagedown/resources/wmd-buttons.psd +0 -0
- data/app/assets/javascripts/answers/pagedown/wmd-buttons.png +0 -0
- data/app/assets/javascripts/answers/skip_nav.js +8 -0
- data/app/assets/stylesheets/answers/active_admin.css.scss +17 -0
- data/app/assets/stylesheets/answers/active_admin_custom.css.scss +35 -0
- data/app/assets/stylesheets/answers/formatting.css +82 -0
- data/app/assets/stylesheets/answers/mobile.css +149 -0
- data/app/assets/stylesheets/answers/tags.css.scss +3 -0
- data/app/assets/stylesheets/answers/theme.css +916 -0
- data/app/controllers/answers/answers_controller.rb +26 -0
- data/app/controllers/answers/api/v1/answers_controller.rb +38 -0
- data/app/controllers/answers/api/v1/api_controller.rb +13 -0
- data/app/controllers/answers/api/v1/questions_controller.rb +39 -0
- data/app/controllers/answers/api/v1/taggings_controller.rb +46 -0
- data/app/controllers/answers/api/v1/tags_controller.rb +38 -0
- data/app/controllers/answers/application_controller.rb +27 -0
- data/app/controllers/answers/home_controller.rb +17 -0
- data/app/controllers/answers/questions_controller.rb +33 -0
- data/app/controllers/answers/search_controller.rb +22 -0
- data/app/controllers/answers/tags_controller.rb +36 -0
- data/app/helpers/answers/tags_helper.rb +7 -0
- data/app/models/.gitkeep +0 -0
- data/app/models/answers/ability.rb +28 -0
- data/app/models/answers/administrator.rb +5 -0
- data/app/models/answers/answer.rb +6 -0
- data/app/models/answers/api/v1/api_user.rb +5 -0
- data/app/models/answers/question.rb +31 -0
- data/app/models/answers/user.rb +30 -0
- data/app/views/answers/admin/contacts/_article.html.erb +0 -0
- data/app/views/answers/admin/dashboard/_dashboard.html.erb +5 -0
- data/app/views/answers/admin/guide_steps/_form.html.erb +17 -0
- data/app/views/answers/api/v1/answers/_answer.json.jbuilder +2 -0
- data/app/views/answers/api/v1/answers/index.json.jbuilder +1 -0
- data/app/views/answers/api/v1/answers/show.json.jbuilder +1 -0
- data/app/views/answers/api/v1/questions/_question.json.jbuilder +2 -0
- data/app/views/answers/api/v1/questions/index.json.jbuilder +1 -0
- data/app/views/answers/api/v1/questions/show.json.jbuilder +1 -0
- data/app/views/answers/api/v1/taggings/_tagging.json.jbuilder +3 -0
- data/app/views/answers/api/v1/taggings/index.json.jbuilder +1 -0
- data/app/views/answers/api/v1/taggings/show.json.jbuilder +1 -0
- data/app/views/answers/api/v1/tags/_tag.json.jbuilder +2 -0
- data/app/views/answers/api/v1/tags/index.json.jbuilder +1 -0
- data/app/views/answers/api/v1/tags/show.json.jbuilder +1 -0
- data/app/views/answers/devise/confirmations/new.html.erb +12 -0
- data/app/views/answers/devise/mailer/confirmation_instructions.html.erb +5 -0
- data/app/views/answers/devise/mailer/reset_password_instructions.html.erb +8 -0
- data/app/views/answers/devise/mailer/unlock_instructions.html.erb +7 -0
- data/app/views/answers/devise/passwords/edit.html.erb +24 -0
- data/app/views/answers/devise/passwords/new.html.erb +20 -0
- data/app/views/answers/devise/registrations/edit.html.erb +25 -0
- data/app/views/answers/devise/registrations/new.html.erb +18 -0
- data/app/views/answers/devise/sessions/new.html.erb +25 -0
- data/app/views/answers/devise/shared/_links.erb +25 -0
- data/app/views/answers/devise/unlocks/new.html.erb +12 -0
- data/app/views/answers/home/_article.html.erb +3 -0
- data/app/views/answers/home/_category.html.erb +8 -0
- data/app/views/answers/home/about.html.erb +72 -0
- data/app/views/answers/home/index.html.erb +44 -0
- data/app/views/answers/questions/index.html.erb +21 -0
- data/app/views/answers/questions/show.html.erb +31 -0
- data/app/views/answers/search/index.html.erb +32 -0
- data/app/views/answers/shared/_articles_sidebar.html.erb +22 -0
- data/app/views/answers/shared/_autocomplete.html.erb +8 -0
- data/app/views/answers/shared/_categories_sidebar.html.erb +12 -0
- data/app/views/answers/shared/_search_form.html.erb +4 -0
- data/app/views/answers/shared/admin/_administration.html.erb +38 -0
- data/app/views/answers/shared/admin/_article_actions.html.erb +86 -0
- data/app/views/answers/shared/admin/_article_content.html.erb +27 -0
- data/app/views/answers/shared/admin/_article_details.html.erb +11 -0
- data/app/views/answers/shared/admin/_article_form.html.erb +20 -0
- data/app/views/answers/shared/admin/_author_pic.html.erb +0 -0
- data/app/views/answers/tags/index.html.erb +34 -0
- data/app/views/answers/tags/show.html.erb +31 -0
- data/app/views/layouts/answers/application.html.erb +97 -0
- data/config.ru +5 -0
- data/config/initializers/active_admin.rb +245 -0
- data/config/initializers/devise.rb +228 -0
- data/config/locales/devise.en.yml +57 -0
- data/config/locales/en.yml +129 -0
- data/config/routes.rb +22 -0
- data/config/secrets.yml +68 -0
- data/db/migrate/20140911060606_answers_up.rb +79 -0
- data/lib/answers-core.rb +1 -0
- data/lib/answers.rb +175 -0
- data/lib/answers/admin/answer.rb +29 -0
- data/lib/answers/admin/dashboard.rb +75 -0
- data/lib/answers/admin/question.rb +57 -0
- data/lib/answers/admin/tag.rb +12 -0
- data/lib/answers/admin/users.rb +65 -0
- data/lib/answers/core.rb +25 -0
- data/lib/answers/core/configuration.rb +90 -0
- data/lib/answers/core/engine.rb +116 -0
- data/lib/answers/engine.rb +62 -0
- data/lib/answers/errors.rb +13 -0
- data/lib/answers/plugin.rb +75 -0
- data/lib/answers/plugins.rb +73 -0
- data/lib/answers/version.rb +16 -0
- data/lib/api_client.rb +20 -0
- data/lib/assets/.gitkeep +0 -0
- data/lib/assets/eng_stop.csv +1 -0
- data/lib/generators/answers/clash_keywords.yml +3 -0
- data/lib/generators/answers/cms/cms_generator.rb +314 -0
- data/lib/generators/answers/cms/templates/.gitignore +91 -0
- data/lib/generators/answers/cms/templates/app/decorators/controllers/answers/.keep +0 -0
- data/lib/generators/answers/cms/templates/app/decorators/models/answers/.keep +0 -0
- data/lib/generators/answers/cms/templates/app/views/sitemap/index.xml.builder +15 -0
- data/lib/generators/answers/cms/templates/config/database.yml.mysql +20 -0
- data/lib/generators/answers/cms/templates/config/database.yml.postgresql +58 -0
- data/lib/generators/answers/cms/templates/config/database.yml.sqlite3 +18 -0
- data/lib/generators/answers/core/core_generator.rb +10 -0
- data/lib/generators/answers/core/templates/config/initializers/answers/core.rb.erb +35 -0
- data/lib/generators/answers/dummy/dummy_generator.rb +86 -0
- data/lib/generators/answers/dummy/templates/rails/Rakefile +7 -0
- data/lib/generators/answers/dummy/templates/rails/application.js +3 -0
- data/lib/generators/answers/dummy/templates/rails/application.rb.erb +12 -0
- data/lib/generators/answers/dummy/templates/rails/boot.rb.erb +6 -0
- data/lib/generators/answers/dummy/templates/rails/database.yml +34 -0
- data/lib/generators/answers/dummy/templates/rails/routes.rb +3 -0
- data/lib/generators/answers/engine/USAGE +24 -0
- data/lib/generators/answers/engine/engine_generator.rb +44 -0
- data/lib/generators/answers/engine/templates/.gitignore +2 -0
- data/lib/generators/answers/engine/templates/Gemfile +42 -0
- data/lib/generators/answers/engine/templates/Rakefile +19 -0
- data/lib/generators/answers/engine/templates/answers-extension_plural_name.gemspec +19 -0
- data/lib/generators/answers/engine/templates/app/controllers/answers/namespace/admin/plural_name_controller.rb.erb +14 -0
- data/lib/generators/answers/engine/templates/app/controllers/answers/namespace/plural_name_controller.rb.erb +34 -0
- data/lib/generators/answers/engine/templates/app/models/answers/namespace/singular_name.rb.erb +37 -0
- data/lib/generators/answers/engine/templates/app/views/answers/namespace/admin/plural_name/_actions.html.erb +25 -0
- data/lib/generators/answers/engine/templates/app/views/answers/namespace/admin/plural_name/_form.html.erb +65 -0
- data/lib/generators/answers/engine/templates/app/views/answers/namespace/admin/plural_name/_plural_name.html.erb +2 -0
- data/lib/generators/answers/engine/templates/app/views/answers/namespace/admin/plural_name/_records.html.erb +16 -0
- data/lib/generators/answers/engine/templates/app/views/answers/namespace/admin/plural_name/_singular_name.html.erb +33 -0
- data/lib/generators/answers/engine/templates/app/views/answers/namespace/admin/plural_name/_sortable_list.html.erb +5 -0
- data/lib/generators/answers/engine/templates/app/views/answers/namespace/admin/plural_name/edit.html.erb +1 -0
- data/lib/generators/answers/engine/templates/app/views/answers/namespace/admin/plural_name/index.html.erb +7 -0
- data/lib/generators/answers/engine/templates/app/views/answers/namespace/admin/plural_name/new.html.erb +1 -0
- data/lib/generators/answers/engine/templates/app/views/answers/namespace/plural_name/index.html.erb +11 -0
- data/lib/generators/answers/engine/templates/app/views/answers/namespace/plural_name/show.html.erb +39 -0
- data/lib/generators/answers/engine/templates/config/locales/cs.yml +28 -0
- data/lib/generators/answers/engine/templates/config/locales/en.yml +28 -0
- data/lib/generators/answers/engine/templates/config/locales/es.yml +29 -0
- data/lib/generators/answers/engine/templates/config/locales/fr.yml +28 -0
- data/lib/generators/answers/engine/templates/config/locales/it.yml +28 -0
- data/lib/generators/answers/engine/templates/config/locales/nb.yml +28 -0
- data/lib/generators/answers/engine/templates/config/locales/nl.yml +28 -0
- data/lib/generators/answers/engine/templates/config/locales/sk.yml +28 -0
- data/lib/generators/answers/engine/templates/config/locales/tr.yml +28 -0
- data/lib/generators/answers/engine/templates/config/locales/zh-CN.yml +30 -0
- data/lib/generators/answers/engine/templates/config/routes.rb.erb +19 -0
- data/lib/generators/answers/engine/templates/db/migrate/1_create_namespace_plural_name.rb.erb +39 -0
- data/lib/generators/answers/engine/templates/db/seeds.rb.erb +21 -0
- data/lib/generators/answers/engine/templates/lib/answers-extension_plural_name.rb.erb +1 -0
- data/lib/generators/answers/engine/templates/lib/answers/plural_name.rb.erb +21 -0
- data/lib/generators/answers/engine/templates/lib/answers/plural_name/engine.rb.erb +23 -0
- data/lib/generators/answers/engine/templates/lib/generators/answers/extension_plural_name_generator.rb.erb +19 -0
- data/lib/generators/answers/engine/templates/lib/tasks/answers/extension_plural_name.rake +13 -0
- data/lib/generators/answers/engine/templates/readme.md +10 -0
- data/lib/generators/answers/engine/templates/script/rails +10 -0
- data/lib/generators/answers/engine/templates/spec/features/answers/namespace/admin/plural_name_spec.rb.erb +200 -0
- data/lib/generators/answers/engine/templates/spec/models/answers/namespace/singular_name_spec.rb.erb +20 -0
- data/lib/generators/answers/engine/templates/spec/spec_helper.rb +31 -0
- data/lib/generators/answers/engine/templates/spec/support/factories/answers/plural_name.rb.erb +7 -0
- data/lib/generators/answers/engine/templates/tasks/rspec.rake +6 -0
- data/lib/generators/answers/engine/templates/tasks/testing.rake +8 -0
- data/lib/generators/answers/generator.rb +292 -0
- data/lib/markdownifier.rb +11 -0
- data/log/.gitkeep +0 -0
- data/log/development.log +12870 -0
- data/log/newrelic_agent.log +1339 -0
- data/log/test.log +233181 -0
- data/public/404.html +25 -0
- data/public/422.html +25 -0
- data/public/500.html +24 -0
- data/public/favicon.ico +0 -0
- data/public/robots.txt +5 -0
- data/script/delayed_job +5 -0
- data/spec/controllers/answers_controller_spec.rb +55 -0
- data/spec/controllers/api/v1/answers_controller_spec.rb +144 -0
- data/spec/controllers/api/v1/questions_controller_spec.rb +144 -0
- data/spec/controllers/api/v1/taggings_controller_spec.rb +126 -0
- data/spec/controllers/api/v1/tags_controller_spec.rb +126 -0
- data/spec/controllers/home_controller_spec.rb +60 -0
- data/spec/controllers/questions_controller_spec.rb +55 -0
- data/spec/controllers/tags_controller_spec.rb +42 -0
- data/spec/factories/answers.rb +10 -0
- data/spec/factories/questions.rb +8 -0
- data/spec/factories/tags.rb +8 -0
- data/spec/factories/user.rb +32 -0
- data/spec/features/admin_dashboard_spec.rb +53 -0
- data/spec/features/admin_user_spec.rb +61 -0
- data/spec/features/searches_spec.rb +101 -0
- data/spec/fixtures/Article/_before_validation/sets_access_count_if_nil.yml +223 -0
- data/spec/fixtures/Article/_delete_orphaned_keywords/updating_an_article/destroys_orphaned_keywords_associated.yml +223 -0
- data/spec/fixtures/Article/_delete_orphaned_keywords/when_deleting_an_article/destroys_all_keywords_associated.yml +223 -0
- data/spec/fixtures/Article/_find_by_friendly_id/when_an_article_does_not_exist/does_not_raise_an_exception.yml +223 -0
- data/spec/fixtures/Article/_find_by_friendly_id/when_an_article_exists/returns_the_corresponding_article.yml +223 -0
- data/spec/fixtures/Article/_find_by_type/excludes_articles_not_matching_specified_type.yml +223 -0
- data/spec/fixtures/Article/_find_by_type/returns_articles_matching_type.yml +223 -0
- data/spec/fixtures/Article/_hits/before_an_article_has_been_viewed/has_zero_hits.yml +223 -0
- data/spec/fixtures/Article/_hits/returns_number_of_views/has_seven_views.yml +223 -0
- data/spec/fixtures/Article/_indexable_/returns_false_if_article_is_not_published.yml +223 -0
- data/spec/fixtures/Article/_indexable_/returns_true_if_article_is_published.yml +223 -0
- data/spec/fixtures/Article/_legacy_/returns_true_if_render_markdown_is_false.yml +223 -0
- data/spec/fixtures/Article/_qm_after_create/creates_wordcounts_for_relevant_keywords.yml +223 -0
- data/spec/fixtures/Article/_record_hit/viewing_an_article/increases_hit_by_one.yml +223 -0
- data/spec/fixtures/Article/_related/has_no_related_articles/.yml +223 -0
- data/spec/fixtures/Article/_related/has_related_articles/.yml +223 -0
- data/spec/fixtures/Article/_remove_stop_words/removes_common_english_words_from_the_string.yml +223 -0
- data/spec/fixtures/Article/_search/_search_titles/query_is_present_in_the_title/.yml +223 -0
- data/spec/fixtures/Article/_search/_search_titles/returns_an_empty_array_when_the_search_term_is_present_in_an_article_but_not_the_title.yml +223 -0
- data/spec/fixtures/Article/_search/matches_articles_in_the_database.yml +223 -0
- data/spec/fixtures/Article/_search/query_does_not_match_anything_in_the_database/returns_an_empty_array.yml +223 -0
- data/spec/fixtures/Article/_search/query_is_a_single_space/.yml +223 -0
- data/spec/fixtures/Article/_search/query_is_an_empty_string/.yml +223 -0
- data/spec/fixtures/Article/_to_s/when_an_article_has_a_category/returns_a_string_containing_title_id_and_category.yml +223 -0
- data/spec/fixtures/Article/can_be_published/an_unpublished_article/is_published.yml +223 -0
- data/spec/fixtures/Article/can_be_published/an_unpublished_article/returns_status_Published.yml +223 -0
- data/spec/fixtures/Article/has_a_friendly_url.yml +223 -0
- data/spec/fixtures/Article/is_valid_with_a_title.yml +223 -0
- data/spec/fixtures/Searches/search_results/1_result_found/.yml +22047 -0
- data/spec/fixtures/Searches/search_results/no_results_found/.yml +393 -0
- data/spec/fixtures/Searches/search_results/several_results_found/should_contain_the_title_and_preview_of_both_articles.yml +223 -0
- data/spec/fixtures/Searches/search_results/several_results_found/show_the_query.yml +277 -0
- data/spec/fixtures/articles.yml +428 -0
- data/spec/fixtures/categories.yml +17 -0
- data/spec/fixtures/contacts.yml +11 -0
- data/spec/fixtures/dragon_keyword_cassette.yml +77 -0
- data/spec/fixtures/oakland_answers.yml +2379 -0
- data/spec/helpers/tags_helper_spec.rb +15 -0
- data/spec/lib/markdownifier_spec.rb +12 -0
- data/spec/models/ability_spec.rb +36 -0
- data/spec/models/answer_spec.rb +5 -0
- data/spec/models/question_spec.rb +70 -0
- data/spec/models/user_spec.rb +55 -0
- data/spec/routing/answers_routing_spec.rb +19 -0
- data/spec/routing/questions_routing_spec.rb +19 -0
- data/spec/routing/routes_spec.rb +13 -0
- data/spec/security/brakeman_spec.rb +37 -0
- data/spec/spec_helper.rb +61 -0
- data/spec/support/login_helpers.rb +10 -0
- data/spec/support/wait_for_ajax_helper.rb +7 -0
- data/spec/support/wait_for_dom_helper.rb +12 -0
- data/spec/views/questions/index.html.erb_spec.rb +16 -0
- data/spec/views/questions/show.html.erb_spec.rb +14 -0
- data/spec/views/tags/index.html.erb_spec.rb +5 -0
- data/spec/views/tags/show.html.erb_spec.rb +5 -0
- data/vendor/assets/javascripts/.gitkeep +0 -0
- data/vendor/assets/stylesheets/.gitkeep +0 -0
- data/vendor/assets/stylesheets/bootstrap.css +3990 -0
- data/vendor/crudgen/lib/generators/crudgen/install_generator.rb +23 -0
- data/vendor/plugins/.gitkeep +0 -0
- metadata +484 -0
@@ -0,0 +1,108 @@
|
|
1
|
+
(function () {
|
2
|
+
var output, Converter;
|
3
|
+
if (typeof exports === "object" && typeof require === "function") { // we're in a CommonJS (e.g. Node.js) module
|
4
|
+
output = exports;
|
5
|
+
Converter = require("./Markdown.Converter").Converter;
|
6
|
+
} else {
|
7
|
+
output = window.Markdown;
|
8
|
+
Converter = output.Converter;
|
9
|
+
}
|
10
|
+
|
11
|
+
output.getSanitizingConverter = function () {
|
12
|
+
var converter = new Converter();
|
13
|
+
converter.hooks.chain("postConversion", sanitizeHtml);
|
14
|
+
converter.hooks.chain("postConversion", balanceTags);
|
15
|
+
return converter;
|
16
|
+
}
|
17
|
+
|
18
|
+
function sanitizeHtml(html) {
|
19
|
+
return html.replace(/<[^>]*>?/gi, sanitizeTag);
|
20
|
+
}
|
21
|
+
|
22
|
+
// (tags that can be opened/closed) | (tags that stand alone)
|
23
|
+
var basic_tag_whitelist = /^(<\/?(b|blockquote|code|del|dd|dl|dt|em|h1|h2|h3|i|kbd|li|ol|p|pre|s|sup|sub|strong|strike|ul)>|<(br|hr)\s?\/?>)$/i;
|
24
|
+
// <a href="url..." optional title>|</a>
|
25
|
+
var a_white = /^(<a\shref="((https?|ftp):\/\/|\/)[-A-Za-z0-9+&@#\/%?=~_|!:,.;\(\)]+"(\stitle="[^"<>]+")?\s?>|<\/a>)$/i;
|
26
|
+
|
27
|
+
// <img src="url..." optional width optional height optional alt optional title
|
28
|
+
var img_white = /^(<img\ssrc="(https?:\/\/|\/)[-A-Za-z0-9+&@#\/%?=~_|!:,.;\(\)]+"(\swidth="\d{1,3}")?(\sheight="\d{1,3}")?(\salt="[^"<>]*")?(\stitle="[^"<>]*")?\s?\/?>)$/i;
|
29
|
+
|
30
|
+
function sanitizeTag(tag) {
|
31
|
+
if (tag.match(basic_tag_whitelist) || tag.match(a_white) || tag.match(img_white))
|
32
|
+
return tag;
|
33
|
+
else
|
34
|
+
return "";
|
35
|
+
}
|
36
|
+
|
37
|
+
/// <summary>
|
38
|
+
/// attempt to balance HTML tags in the html string
|
39
|
+
/// by removing any unmatched opening or closing tags
|
40
|
+
/// IMPORTANT: we *assume* HTML has *already* been
|
41
|
+
/// sanitized and is safe/sane before balancing!
|
42
|
+
///
|
43
|
+
/// adapted from CODESNIPPET: A8591DBA-D1D3-11DE-947C-BA5556D89593
|
44
|
+
/// </summary>
|
45
|
+
function balanceTags(html) {
|
46
|
+
|
47
|
+
if (html == "")
|
48
|
+
return "";
|
49
|
+
|
50
|
+
var re = /<\/?\w+[^>]*(\s|$|>)/g;
|
51
|
+
// convert everything to lower case; this makes
|
52
|
+
// our case insensitive comparisons easier
|
53
|
+
var tags = html.toLowerCase().match(re);
|
54
|
+
|
55
|
+
// no HTML tags present? nothing to do; exit now
|
56
|
+
var tagcount = (tags || []).length;
|
57
|
+
if (tagcount == 0)
|
58
|
+
return html;
|
59
|
+
|
60
|
+
var tagname, tag;
|
61
|
+
var ignoredtags = "<p><img><br><li><hr>";
|
62
|
+
var match;
|
63
|
+
var tagpaired = [];
|
64
|
+
var tagremove = [];
|
65
|
+
var needsRemoval = false;
|
66
|
+
|
67
|
+
// loop through matched tags in forward order
|
68
|
+
for (var ctag = 0; ctag < tagcount; ctag++) {
|
69
|
+
tagname = tags[ctag].replace(/<\/?(\w+).*/, "$1");
|
70
|
+
// skip any already paired tags
|
71
|
+
// and skip tags in our ignore list; assume they're self-closed
|
72
|
+
if (tagpaired[ctag] || ignoredtags.search("<" + tagname + ">") > -1)
|
73
|
+
continue;
|
74
|
+
|
75
|
+
tag = tags[ctag];
|
76
|
+
match = -1;
|
77
|
+
|
78
|
+
if (!/^<\//.test(tag)) {
|
79
|
+
// this is an opening tag
|
80
|
+
// search forwards (next tags), look for closing tags
|
81
|
+
for (var ntag = ctag + 1; ntag < tagcount; ntag++) {
|
82
|
+
if (!tagpaired[ntag] && tags[ntag] == "</" + tagname + ">") {
|
83
|
+
match = ntag;
|
84
|
+
break;
|
85
|
+
}
|
86
|
+
}
|
87
|
+
}
|
88
|
+
|
89
|
+
if (match == -1)
|
90
|
+
needsRemoval = tagremove[ctag] = true; // mark for removal
|
91
|
+
else
|
92
|
+
tagpaired[match] = true; // mark paired
|
93
|
+
}
|
94
|
+
|
95
|
+
if (!needsRemoval)
|
96
|
+
return html;
|
97
|
+
|
98
|
+
// delete all orphaned tags from the string
|
99
|
+
|
100
|
+
var ctag = 0;
|
101
|
+
html = html.replace(re, function (match) {
|
102
|
+
var res = tagremove[ctag] ? "" : match;
|
103
|
+
ctag++;
|
104
|
+
return res;
|
105
|
+
});
|
106
|
+
return html;
|
107
|
+
}
|
108
|
+
})();
|
File without changes
|
@@ -0,0 +1,120 @@
|
|
1
|
+
body
|
2
|
+
{
|
3
|
+
background-color: White;
|
4
|
+
font-family: sans-serif;
|
5
|
+
}
|
6
|
+
|
7
|
+
.wmd-panel
|
8
|
+
{
|
9
|
+
margin-left: 25%;
|
10
|
+
margin-right: 25%;
|
11
|
+
width: 50%;
|
12
|
+
min-width: 500px;
|
13
|
+
}
|
14
|
+
|
15
|
+
.wmd-button-bar
|
16
|
+
{
|
17
|
+
width: 100%;
|
18
|
+
background-color: Silver;
|
19
|
+
}
|
20
|
+
|
21
|
+
.wmd-input
|
22
|
+
{
|
23
|
+
height: 300px;
|
24
|
+
width: 100%;
|
25
|
+
background-color: Gainsboro;
|
26
|
+
border: 1px solid DarkGray;
|
27
|
+
}
|
28
|
+
|
29
|
+
.wmd-preview
|
30
|
+
{
|
31
|
+
background-color: #c0e0ff;
|
32
|
+
}
|
33
|
+
|
34
|
+
.wmd-button-row
|
35
|
+
{
|
36
|
+
position: relative;
|
37
|
+
margin-left: 5px;
|
38
|
+
margin-right: 5px;
|
39
|
+
margin-bottom: 5px;
|
40
|
+
margin-top: 10px;
|
41
|
+
padding: 0px;
|
42
|
+
height: 20px;
|
43
|
+
}
|
44
|
+
|
45
|
+
.wmd-spacer
|
46
|
+
{
|
47
|
+
width: 1px;
|
48
|
+
height: 20px;
|
49
|
+
margin-left: 14px;
|
50
|
+
|
51
|
+
position: absolute;
|
52
|
+
background-color: Silver;
|
53
|
+
display: inline-block;
|
54
|
+
list-style: none;
|
55
|
+
}
|
56
|
+
|
57
|
+
.wmd-button {
|
58
|
+
width: 20px;
|
59
|
+
height: 20px;
|
60
|
+
padding-left: 2px;
|
61
|
+
padding-right: 3px;
|
62
|
+
position: absolute;
|
63
|
+
display: inline-block;
|
64
|
+
list-style: none;
|
65
|
+
cursor: pointer;
|
66
|
+
}
|
67
|
+
|
68
|
+
.wmd-button > span {
|
69
|
+
background-image: url(../../wmd-buttons.png);
|
70
|
+
background-repeat: no-repeat;
|
71
|
+
background-position: 0px 0px;
|
72
|
+
width: 20px;
|
73
|
+
height: 20px;
|
74
|
+
display: inline-block;
|
75
|
+
}
|
76
|
+
|
77
|
+
.wmd-spacer1
|
78
|
+
{
|
79
|
+
left: 50px;
|
80
|
+
}
|
81
|
+
.wmd-spacer2
|
82
|
+
{
|
83
|
+
left: 175px;
|
84
|
+
}
|
85
|
+
.wmd-spacer3
|
86
|
+
{
|
87
|
+
left: 300px;
|
88
|
+
}
|
89
|
+
|
90
|
+
|
91
|
+
|
92
|
+
|
93
|
+
.wmd-prompt-background
|
94
|
+
{
|
95
|
+
background-color: Black;
|
96
|
+
}
|
97
|
+
|
98
|
+
.wmd-prompt-dialog
|
99
|
+
{
|
100
|
+
border: 1px solid #999999;
|
101
|
+
background-color: #F5F5F5;
|
102
|
+
}
|
103
|
+
|
104
|
+
.wmd-prompt-dialog > div {
|
105
|
+
font-size: 0.8em;
|
106
|
+
font-family: arial, helvetica, sans-serif;
|
107
|
+
}
|
108
|
+
|
109
|
+
|
110
|
+
.wmd-prompt-dialog > form > input[type="text"] {
|
111
|
+
border: 1px solid #999999;
|
112
|
+
color: black;
|
113
|
+
}
|
114
|
+
|
115
|
+
.wmd-prompt-dialog > form > input[type="button"]{
|
116
|
+
border: 1px solid #888888;
|
117
|
+
font-family: trebuchet MS, helvetica, sans-serif;
|
118
|
+
font-size: 0.8em;
|
119
|
+
font-weight: bold;
|
120
|
+
}
|
@@ -0,0 +1,83 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
|
3
|
+
<html>
|
4
|
+
|
5
|
+
<head>
|
6
|
+
<title>PageDown Demo Page</title>
|
7
|
+
|
8
|
+
<link rel="stylesheet" type="text/css" href="demo.css" />
|
9
|
+
|
10
|
+
<script type="text/javascript" src="../../Markdown.Converter.js"></script>
|
11
|
+
<script type="text/javascript" src="../../Markdown.Sanitizer.js"></script>
|
12
|
+
<script type="text/javascript" src="../../Markdown.Editor.js"></script>
|
13
|
+
</head>
|
14
|
+
|
15
|
+
<body>
|
16
|
+
<div class="wmd-panel">
|
17
|
+
<div id="wmd-button-bar"></div>
|
18
|
+
<textarea class="wmd-input" id="wmd-input">
|
19
|
+
This is the *first* editor.
|
20
|
+
------------------------------
|
21
|
+
|
22
|
+
Just plain **Markdown**, except that the input is sanitized:
|
23
|
+
|
24
|
+
<marquee>I'm the ghost from the past!</marquee>
|
25
|
+
</textarea>
|
26
|
+
</div>
|
27
|
+
<div id="wmd-preview" class="wmd-panel wmd-preview"></div>
|
28
|
+
|
29
|
+
<br /> <br />
|
30
|
+
|
31
|
+
<div class="wmd-panel">
|
32
|
+
<div id="wmd-button-bar-second"></div>
|
33
|
+
<textarea class="wmd-input" id="wmd-input-second">
|
34
|
+
This is the *second* editor.
|
35
|
+
------------------------------
|
36
|
+
|
37
|
+
It has a plugin hook registered that surrounds all words starting with the
|
38
|
+
letter A with asterisks before doing the Markdown conversion. Another one gives bare links
|
39
|
+
a nicer link text. User input isn't sanitized here:
|
40
|
+
|
41
|
+
<marquee>I'm the ghost from the past!</marquee>
|
42
|
+
|
43
|
+
http://google.com
|
44
|
+
|
45
|
+
http://stackoverflow.com
|
46
|
+
|
47
|
+
It also includes a help button.
|
48
|
+
|
49
|
+
Finally, note that when you press Ctrl-Q or click the "Blockquote" button (without having a
|
50
|
+
selection), this editor creates an example text that's different from the first editor.
|
51
|
+
</textarea>
|
52
|
+
</div>
|
53
|
+
<div id="wmd-preview-second" class="wmd-panel wmd-preview"></div>
|
54
|
+
|
55
|
+
|
56
|
+
<script type="text/javascript">
|
57
|
+
(function () {
|
58
|
+
var converter1 = Markdown.getSanitizingConverter();
|
59
|
+
var editor1 = new Markdown.Editor(converter1);
|
60
|
+
editor1.run();
|
61
|
+
|
62
|
+
var converter2 = new Markdown.Converter();
|
63
|
+
|
64
|
+
converter2.hooks.chain("preConversion", function (text) {
|
65
|
+
return text.replace(/\b(a\w*)/gi, "*$1*");
|
66
|
+
});
|
67
|
+
|
68
|
+
converter2.hooks.chain("plainLinkText", function (url) {
|
69
|
+
return "This is a link to " + url.replace(/^https?:\/\//, "");
|
70
|
+
});
|
71
|
+
|
72
|
+
var help = function () { alert("Do you need help?"); }
|
73
|
+
var options = {
|
74
|
+
helpButton: { handler: help },
|
75
|
+
strings: { quoteexample: "whatever you're quoting, put it right here" }
|
76
|
+
};
|
77
|
+
var editor2 = new Markdown.Editor(converter2, "-second", options);
|
78
|
+
|
79
|
+
editor2.run();
|
80
|
+
})();
|
81
|
+
</script>
|
82
|
+
</body>
|
83
|
+
</html>
|
@@ -0,0 +1,44 @@
|
|
1
|
+
// NOTE: This is just a demo -- in a production environment,
|
2
|
+
// be sure to spend a few more thoughts on sanitizing user input.
|
3
|
+
// (also, you probably wouldn't use a get request)
|
4
|
+
|
5
|
+
var http = require("http"),
|
6
|
+
url = require("url"),
|
7
|
+
querystring = require("querystring"),
|
8
|
+
Converter = require("../../Markdown.Converter").Converter,
|
9
|
+
getSanitizingConverter = require("../../Markdown.Sanitizer").getSanitizingConverter,
|
10
|
+
conv = new Converter(),
|
11
|
+
saneConv = getSanitizingConverter();
|
12
|
+
|
13
|
+
http.createServer(function (req, res) {
|
14
|
+
|
15
|
+
var route = url.parse(req.url);
|
16
|
+
if (route.pathname !== "/") {
|
17
|
+
res.writeHead(404);
|
18
|
+
res.end("Page not found");
|
19
|
+
return;
|
20
|
+
}
|
21
|
+
|
22
|
+
var query = querystring.parse(route.query);
|
23
|
+
|
24
|
+
res.writeHead(200, { "Content-type": "text/html" });
|
25
|
+
res.write("<html><body>");
|
26
|
+
|
27
|
+
var markdown = query.md || "## Hello!\n\n<marquee>I'm walking</marquee>\n\nVisit [Stack Overflow](http://stackoverflow.com)\n\n<b><i>This is never closed!";
|
28
|
+
|
29
|
+
res.write("<h1>Your output, sanitized:</h1>\n" + saneConv.makeHtml(markdown))
|
30
|
+
res.write("<h1>Your output, unsanitized:</h1>\n" + conv.makeHtml(markdown))
|
31
|
+
|
32
|
+
res.write(
|
33
|
+
"<h1>Enter Markdown</h1>\n" +
|
34
|
+
"<form method='get' action='/'>" +
|
35
|
+
"<textarea cols=50 rows=10 name='md'>" +
|
36
|
+
markdown.replace(/</g, "<") +
|
37
|
+
"</textarea><br>" +
|
38
|
+
"<input type='submit' value='Convert!'>" +
|
39
|
+
"</form>"
|
40
|
+
);
|
41
|
+
|
42
|
+
res.end("</body></html>");
|
43
|
+
|
44
|
+
}).listen(8000);
|
@@ -0,0 +1,43 @@
|
|
1
|
+
// Usage:
|
2
|
+
//
|
3
|
+
// var myConverter = new Markdown.Converter(myEditor, null, { strings: Markdown.local.fr });
|
4
|
+
|
5
|
+
(function () {
|
6
|
+
Markdown.local = Markdown.local || {};
|
7
|
+
Markdown.local.fr = {
|
8
|
+
bold: "Gras <strong> Ctrl+B",
|
9
|
+
boldexample: "texte en gras",
|
10
|
+
|
11
|
+
italic: "Italique <em> Ctrl+I",
|
12
|
+
italicexample: "texte en italique",
|
13
|
+
|
14
|
+
link: "Hyperlien <a> Ctrl+L",
|
15
|
+
linkdescription: "description de l'hyperlien",
|
16
|
+
linkdialog: "<p><b>Insérer un hyperlien</b></p><p>http://example.com/ \"titre optionnel\"</p>",
|
17
|
+
|
18
|
+
quote: "Citation <blockquote> Ctrl+Q",
|
19
|
+
quoteexample: "Citation",
|
20
|
+
|
21
|
+
code: "Extrait de code <pre><code> Ctrl+K",
|
22
|
+
codeexample: "votre extrait de code",
|
23
|
+
|
24
|
+
image: "Image <img> Ctrl+G",
|
25
|
+
imagedescription: "description de l'image",
|
26
|
+
imagedialog: "<p><b>Insérer une image</b></p><p>http://example.com/images/diagram.jpg \"titre optionnel\"<br><br><a href='http://www.google.com/search?q=free+image+hosting' target='_blank'>Vous chercher un hébergement d'image grauit ?</a></p>",
|
27
|
+
|
28
|
+
olist: "Liste numérotée <ol> Ctrl+O",
|
29
|
+
ulist: "Liste à point <ul> Ctrl+U",
|
30
|
+
litem: "Elément de liste",
|
31
|
+
|
32
|
+
heading: "Titre <h1>/<h2> Ctrl+H",
|
33
|
+
headingexample: "Titre",
|
34
|
+
|
35
|
+
hr: "Trait horizontal <hr> Ctrl+R",
|
36
|
+
|
37
|
+
undo: "Annuler - Ctrl+Z",
|
38
|
+
redo: "Refaire - Ctrl+Y",
|
39
|
+
redomac: "Refaire - Ctrl+Shift+Z",
|
40
|
+
|
41
|
+
help: "Aide sur Markdown"
|
42
|
+
};
|
43
|
+
})();
|
@@ -0,0 +1,12 @@
|
|
1
|
+
{
|
2
|
+
"name": "pagedown",
|
3
|
+
"version": "1.0.0",
|
4
|
+
"description": "markdown converter, based on showdown",
|
5
|
+
"repository": { "type": "hg", "url": "https://code.google.com/p/pagedown/" },
|
6
|
+
"keywords": ["markdown"],
|
7
|
+
"license": "MIT",
|
8
|
+
"files": ["Markdown.Converter.js", "Markdown.Sanitizer.js", "node-pagedown.js"],
|
9
|
+
"main": "node-pagedown.js",
|
10
|
+
"bugs": "http://code.google.com/p/pagedown/issues/list",
|
11
|
+
"homepage": "http://code.google.com/p/pagedown/wiki/PageDown"
|
12
|
+
}
|
Binary file
|
Binary file
|
@@ -0,0 +1,17 @@
|
|
1
|
+
// SASS variable overrides must be declared before loading up Active Admin's styles.
|
2
|
+
//
|
3
|
+
// To view the variables that Active Admin provides, take a look at
|
4
|
+
// `app/assets/stylesheets/active_admin/mixins/_variables.css.scss` in the
|
5
|
+
// Active Admin source.
|
6
|
+
//
|
7
|
+
// For example, to change the sidebar width:
|
8
|
+
// $sidebar-width: 242px;
|
9
|
+
|
10
|
+
// Active Admin's got SASS!
|
11
|
+
@import "active_admin/mixins";
|
12
|
+
@import "active_admin/base";
|
13
|
+
|
14
|
+
// Overriding any non-variable SASS must be done after the fact.
|
15
|
+
// For example, to change the default status-tag color:
|
16
|
+
//
|
17
|
+
// .status_tag { background: #6090DB; }
|