fix my git foo

This commit is contained in:
Régis Hanol 2015-03-07 02:36:35 +01:00
parent 12919f72fa
commit 9b9bd9c0a1
10 changed files with 74 additions and 87 deletions

View File

@ -1,11 +1,39 @@
import ModalFunctionality from 'discourse/mixins/modal-functionality';
const _buttons = [];
function addBulkButton(action, key) {
_buttons.push({ action: action, label: "topics.bulk." + key });
}
// Default buttons
addBulkButton('showChangeCategory', 'change_category');
addBulkButton('deleteTopics', 'delete');
addBulkButton('closeTopics', 'close_topics');
addBulkButton('archiveTopics', 'archive_topics');
addBulkButton('showNotificationLevel', 'notification_level');
addBulkButton('resetRead', 'reset_read');
// Modal for performing bulk actions on topics
export default Ember.ArrayController.extend(ModalFunctionality, {
needs: ['discovery/topics'],
buttonRows: null,
onShow: function() {
this.set('controllers.modal.modalClass', 'topic-bulk-actions-modal small');
const buttonRows = [];
let row = [];
_buttons.forEach(function(b) {
row.push(b);
if (row.length === 4) {
buttonRows.push(row);
row = [];
}
});
if (row.length) { buttonRows.push(row); }
this.set('buttonRows', buttonRows);
},
perform: function(operation) {
@ -89,3 +117,5 @@ export default Ember.ArrayController.extend(ModalFunctionality, {
}
}
});
export { addBulkButton };

View File

@ -10,7 +10,7 @@ var acceptableCodeClasses =
"perl", "php", "profile", "python", "r", "rib", "rsl", "ruby", "rust", "scala", "smalltalk", "sql",
"tex", "text", "vala", "vbscript", "vhdl"];
var textCodeClasses = ["text", "pre", "plain"];
var textCodeClasses = ["text", "pre"];
function flattenBlocks(blocks) {
var result = "";
@ -39,17 +39,6 @@ Discourse.Dialect.replaceBlock({
}
});
Discourse.Dialect.replaceBlock({
start: /(<pre[^\>]*\>)([\s\S]*)/igm,
stop: /<\/pre>/igm,
rawContents: true,
skipIfTradtionalLinebreaks: true,
emitter: function(blockContents) {
return ['p', ['pre', flattenBlocks(blockContents)]];
}
});
// Ensure that content in a code block is fully escaped. This way it's not white listed
// and we can use HTML and Javascript examples.
Discourse.Dialect.on('parseNode', function (event) {
@ -62,6 +51,7 @@ Discourse.Dialect.on('parseNode', function (event) {
if (path && path[path.length-1] && path[path.length-1][0] && path[path.length-1][0] === "pre") {
regexp = / +$/g;
} else {
regexp = /^ +| +$/g;
}
@ -69,6 +59,17 @@ Discourse.Dialect.on('parseNode', function (event) {
}
});
Discourse.Dialect.replaceBlock({
start: /(<pre[^\>]*\>)([\s\S]*)/igm,
stop: /<\/pre>/igm,
rawContents: true,
skipIfTradtionalLinebreaks: true,
emitter: function(blockContents) {
return ['p', ['pre', flattenBlocks(blockContents)]];
}
});
// Whitelist the language classes
var regexpSource = "^lang-(" + acceptableCodeClasses.join('|') + ")$";
Discourse.Markdown.whiteListTag('code', 'class', new RegExp(regexpSource, "i"));

View File

@ -12,8 +12,7 @@ var parser = window.BetterMarkdown,
initialized = false,
emitters = [],
hoisted,
preProcessors = [],
escape = Handlebars.Utils.escapeExpression;
preProcessors = [];
/**
Initialize our dialects for processing.
@ -163,10 +162,6 @@ function hoister(t, target, replacement) {
return t;
}
function outdent(t) {
return t.replace(/^[ ]{4}/gm, "");
}
/**
An object used for rendering our dialects.
@ -188,46 +183,14 @@ Discourse.Dialect = {
cook: function(text, opts) {
if (!initialized) { initializeDialects(); }
dialect.options = opts;
// Helps us hoist out HTML
hoisted = {};
// pre-hoist all code-blocks
// <pre>...</pre> blocks
text = text.replace(/(\n*)<pre>([\s\S]*?)<\/pre>/ig, function(_, before, m) {
var hash = md5(m);
hoisted[hash] = escape(m.trim());
return before + "<pre>" + hash + "</pre>";
});
// fenced blocks
text = text.replace(/(\n*)```([a-z0-9\-]*)\n([\s\S]*?)\n```/g, function(_, before, language, m) {
var hash = md5(m);
hoisted[hash] = escape(m.trim());
return before + "```" + language + "\n" + hash + "\n```";
});
// inline
text = text.replace(/(^|[^`])`([^`]*?)`([^`]|$)/g, function(_, before, m, after) {
var hash = md5(m);
hoisted[hash] = escape(m);
return before + "`" + hash + "`" + after;
});
// markdown blocks
text = text.replace(/(\n*)((?:(?:[ ]{4}).*\n+)+)/g, function(_, before, m) {
var hash = md5(m);
hoisted[hash] = escape(outdent(m).trim());
return before + " " + hash + "\n";
});
// pre-processors
preProcessors.forEach(function(p) {
text = p(text, hoister);
});
dialect.options = opts;
var tree = parser.toHTMLTree(text, 'Discourse'),
result = parser.renderJsonML(parseTree(tree));
@ -240,11 +203,12 @@ Discourse.Dialect = {
// If we hoisted out anything, put it back
var keys = Object.keys(hoisted);
if (keys.length) {
keys.forEach(function(key) {
result = result.replace(new RegExp(key, "g"), hoisted[key]);
keys.forEach(function(k) {
result = result.replace(new RegExp(k,"g"), hoisted[k]);
});
}
hoisted = {};
return result.trim();
},

View File

@ -1,10 +1,7 @@
<p>
<button class='btn' {{action "showChangeCategory"}}>{{i18n 'topics.bulk.change_category'}}</button>
<button class='btn' {{action "deleteTopics"}}>{{i18n 'topics.bulk.delete'}}</button>
<button class='btn' {{action "closeTopics"}}>{{i18n 'topics.bulk.close_topics'}}</button>
<button class='btn' {{action "archiveTopics"}}>{{i18n 'topics.bulk.archive_topics'}}</button>
</p>
<p>
<button class='btn' {{action "showNotificationLevel"}}>{{i18n 'topics.bulk.notification_level'}}</button>
<button class='btn' {{action "resetRead"}}>{{i18n 'topics.bulk.reset_read'}}</button>
</p>
{{#each row in buttonRows}}
<p>
{{#each button in row}}
{{d-button action=button.action label=button.label}}
{{/each}}
</p>
{{/each}}

View File

@ -1,10 +1,7 @@
<p>Choose the new category for the topics:</p>
<p>{{i18n "topics.bulk.choose_new_category"}}</p>
<p>{{category-chooser value=newCategoryId}}</p>
{{#if loading}}
<div class='loading'>{{i18n 'loading'}}</div>
{{else}}
<button class='btn' {{action "changeCategory"}}>Change Category</button>
{{/if}}
{{#loading-spinner condition=loading}}
{{d-button action="changeCategory" label="topics.bulk.change_category"}}
{{/loading-spinner}}

View File

@ -0,0 +1,4 @@
export default Discourse.ModalBodyView.extend({
templateName: 'modal/topic-bulk-actions',
title: I18n.t('topics.bulk.actions')
});

View File

@ -1,12 +0,0 @@
/**
Handles the view for the topic bulk actions modal
@class TopicBulkActionsView
@extends Discourse.ModalBodyView
@namespace Discourse
@module Discourse
**/
Discourse.TopicBulkActionsView = Discourse.ModalBodyView.extend({
templateName: 'modal/topic_bulk_actions',
title: I18n.t('topics.bulk.actions')
});

View File

@ -814,6 +814,7 @@ en:
close_topics: "Close Topics"
archive_topics: "Archive Topics"
notification_level: "Change Notification Level"
choose_new_category: "Choose the new category for the topics:"
selected:
one: "You have selected <b>1</b> topic."
other: "You have selected <b>{{count}}</b> topics."

View File

@ -8,7 +8,12 @@ class TopicsBulkAction
end
def self.operations
%w(change_category close archive change_notification_level reset_read dismiss_posts delete)
@operations ||= %w(change_category close archive change_notification_level reset_read dismiss_posts delete)
end
def self.register_operation(name, &block)
operations << name
define_method(name, &block)
end
def perform!

View File

@ -345,12 +345,12 @@ test("Code Blocks", function() {
"<p><pre><code class=\"lang-json\">{hello: &#x27;world&#x27;}</code></pre></p>\n\n<p>trailing</p>",
"It does not truncate text after a code block.");
cooked("```json\nline 1\n\nline 2\n\n\nline 3\n```",
"<p><pre><code class=\"lang-json\">line 1\n\nline 2\n\n\nline 3</code></pre></p>",
cooked("```json\nline 1\n\nline 2\n\n\nline3\n```",
"<p><pre><code class=\"lang-json\">line 1\n\nline 2\n\n\nline3</code></pre></p>",
"it maintains new lines inside a code block.");
cooked("hello\nworld\n```json\nline 1\n\nline 2\n\n\nline 3\n```",
"<p>hello<br/>world<br/></p>\n\n<p><pre><code class=\"lang-json\">line 1\n\nline 2\n\n\nline 3</code></pre></p>",
cooked("hello\nworld\n```json\nline 1\n\nline 2\n\n\nline3\n```",
"<p>hello<br/>world<br/></p>\n\n<p><pre><code class=\"lang-json\">line 1\n\nline 2\n\n\nline3</code></pre></p>",
"it maintains new lines inside a code block with leading content.");
cooked("```ruby\n<header>hello</header>\n```",