mirror of
https://github.com/discourse/discourse.git
synced 2025-03-21 15:19:46 +08:00
FIX: multi option poll not working (new engine)
This commit is contained in:
parent
1c917cc391
commit
5d139e461c
@ -11,6 +11,8 @@ function trailingSpaceOnly(src, start, max) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const ATTR_REGEX = /(([a-z0-9]*)\s*=)/ig;
|
||||||
|
|
||||||
// parse a tag [test a=1 b=2] to a data structure
|
// parse a tag [test a=1 b=2] to a data structure
|
||||||
// {tag: "test", attrs={a: "1", b: "2"}
|
// {tag: "test", attrs={a: "1", b: "2"}
|
||||||
export function parseBBCodeTag(src, start, max, multiline) {
|
export function parseBBCodeTag(src, start, max, multiline) {
|
||||||
@ -71,31 +73,23 @@ export function parseBBCodeTag(src, start, max, multiline) {
|
|||||||
// trivial parser that is going to have to be rewritten at some point
|
// trivial parser that is going to have to be rewritten at some point
|
||||||
if (raw) {
|
if (raw) {
|
||||||
|
|
||||||
// reading a key 0, reading a val = 1
|
let match, key, val;
|
||||||
let readingKey = true;
|
|
||||||
let startSplit = 0;
|
|
||||||
let key;
|
|
||||||
|
|
||||||
for(i=0; i<raw.length; i++) {
|
while(match = ATTR_REGEX.exec(raw)) {
|
||||||
if (raw[i] === '=' || i === (raw.length-1)) {
|
if (key) {
|
||||||
// one more offset to allow room to capture last
|
val = raw.slice(attrs[key],match.index) || '';
|
||||||
if (raw[i] !== '=' || i === (raw.length-1)) {
|
val = val.trim();
|
||||||
i+=1;
|
val = val.replace(/^["'](.*)["']$/, '$1');
|
||||||
}
|
attrs[key] = val;
|
||||||
|
|
||||||
let cur = raw.slice(startSplit, i).trim();
|
|
||||||
if (readingKey) {
|
|
||||||
key = cur || '_default';
|
|
||||||
} else {
|
|
||||||
let val = raw.slice(startSplit, i).trim();
|
|
||||||
if (val && val.length > 0) {
|
|
||||||
val = val.replace(/^["'](.*)["']$/, '$1');
|
|
||||||
attrs[key] = val;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
readingKey = !readingKey;
|
|
||||||
startSplit = i+1;
|
|
||||||
}
|
}
|
||||||
|
key = match[2] || '_default';
|
||||||
|
attrs[key] = match.index + match[0].length;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (key) {
|
||||||
|
val = raw.slice(attrs[key]);
|
||||||
|
val = val.replace(/^["'](.*)["']$/, '$1');
|
||||||
|
attrs[key] = val;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -127,7 +127,7 @@ const rule = {
|
|||||||
|
|
||||||
WHITELISTED_ATTRIBUTES.forEach(name => {
|
WHITELISTED_ATTRIBUTES.forEach(name => {
|
||||||
if (attrs[name]) {
|
if (attrs[name]) {
|
||||||
attributes[DATA_PREFIX + name] = attrs[name];
|
attributes.push([DATA_PREFIX + name, attrs[name]]);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -136,9 +136,9 @@ const rule = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// we might need these values later...
|
// we might need these values later...
|
||||||
let min = parseInt(attributes[DATA_PREFIX + "min"], 10);
|
let min = parseInt(attrs["min"], 10);
|
||||||
let max = parseInt(attributes[DATA_PREFIX + "max"], 10);
|
let max = parseInt(attrs["max"], 10);
|
||||||
let step = parseInt(attributes[DATA_PREFIX + "step"], 10);
|
let step = parseInt(attrs["step"], 10);
|
||||||
|
|
||||||
let header = [];
|
let header = [];
|
||||||
|
|
||||||
@ -157,7 +157,7 @@ const rule = {
|
|||||||
header.push(token);
|
header.push(token);
|
||||||
|
|
||||||
// generate the options when the type is "number"
|
// generate the options when the type is "number"
|
||||||
if (attributes[DATA_PREFIX + "type"] === "number") {
|
if (attrs["type"] === "number") {
|
||||||
// default values
|
// default values
|
||||||
if (isNaN(min)) { min = 1; }
|
if (isNaN(min)) { min = 1; }
|
||||||
if (isNaN(max)) { max = md.options.discourse.pollMaximumOptions; }
|
if (isNaN(max)) { max = md.options.discourse.pollMaximumOptions; }
|
||||||
@ -172,7 +172,7 @@ const rule = {
|
|||||||
header.push(token);
|
header.push(token);
|
||||||
|
|
||||||
for (let o = min; o <= max; o += step) {
|
for (let o = min; o <= max; o += step) {
|
||||||
token = new state.Token('list_item_open', '', 1);
|
token = new state.Token('list_item_open', 'li', 1);
|
||||||
items.push([token, String(o)]);
|
items.push([token, String(o)]);
|
||||||
header.push(token);
|
header.push(token);
|
||||||
|
|
||||||
@ -180,7 +180,7 @@ const rule = {
|
|||||||
token.content = String(o);
|
token.content = String(o);
|
||||||
header.push(token);
|
header.push(token);
|
||||||
|
|
||||||
token = new state.Token('list_item_close', '', -1);
|
token = new state.Token('list_item_close', 'li', -1);
|
||||||
header.push(token);
|
header.push(token);
|
||||||
}
|
}
|
||||||
token = new state.Token('bullet_item_close', '', -1);
|
token = new state.Token('bullet_item_close', '', -1);
|
||||||
|
@ -12,6 +12,34 @@ describe PrettyText do
|
|||||||
SiteSetting.enable_experimental_markdown_it = true
|
SiteSetting.enable_experimental_markdown_it = true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it 'supports multi choice polls' do
|
||||||
|
cooked = PrettyText.cook <<~MD
|
||||||
|
[poll type=multiple min=1 max=3 public=true]
|
||||||
|
* option 1
|
||||||
|
* option 2
|
||||||
|
* option 3
|
||||||
|
[/poll]
|
||||||
|
MD
|
||||||
|
|
||||||
|
expect(cooked).to include('class="poll"')
|
||||||
|
expect(cooked).to include('data-poll-status="open"')
|
||||||
|
expect(cooked).to include('data-poll-name="poll"')
|
||||||
|
expect(cooked).to include('data-poll-type="multiple"')
|
||||||
|
expect(cooked).to include('data-poll-min="1"')
|
||||||
|
expect(cooked).to include('data-poll-max="3"')
|
||||||
|
expect(cooked).to include('data-poll-public="true"')
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'can dynamically generate a poll' do
|
||||||
|
|
||||||
|
cooked = PrettyText.cook <<~MD
|
||||||
|
[poll type=number min=1 max=20 step=1]
|
||||||
|
[/poll]
|
||||||
|
MD
|
||||||
|
|
||||||
|
expect(cooked.scan('<li').length).to eq(20)
|
||||||
|
end
|
||||||
|
|
||||||
it 'can properly bake 2 polls' do
|
it 'can properly bake 2 polls' do
|
||||||
md = <<~MD
|
md = <<~MD
|
||||||
this is a test
|
this is a test
|
||||||
@ -88,7 +116,7 @@ describe PrettyText do
|
|||||||
cooked = PrettyText.cook md
|
cooked = PrettyText.cook md
|
||||||
|
|
||||||
expected = <<~MD
|
expected = <<~MD
|
||||||
<div class="poll" data-poll-status="open" data-poll-name="poll">
|
<div class="poll" data-poll-status="open" data-poll-name="poll" data-poll-type="multiple">
|
||||||
<div>
|
<div>
|
||||||
<div class="poll-container">
|
<div class="poll-container">
|
||||||
<ol>
|
<ol>
|
||||||
|
@ -908,7 +908,6 @@ HTML
|
|||||||
<img src="http://png.com/my.png" alt="stuff"><br>
|
<img src="http://png.com/my.png" alt="stuff"><br>
|
||||||
<img src="http://png.com/my.png" alt width="110" height="50"></p>
|
<img src="http://png.com/my.png" alt width="110" height="50"></p>
|
||||||
HTML
|
HTML
|
||||||
puts cooked
|
|
||||||
|
|
||||||
expect(cooked).to eq(html.strip)
|
expect(cooked).to eq(html.strip)
|
||||||
end
|
end
|
||||||
|
Loading…
x
Reference in New Issue
Block a user