FEATURE: support image dimensions via Markdown image
This commit is contained in:
parent
1163c086a3
commit
3f950a756a
|
@ -99,6 +99,50 @@ function setupHoister(md) {
|
||||||
md.renderer.rules.html_raw = renderHoisted;
|
md.renderer.rules.html_raw = renderHoisted;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const IMG_SIZE_REGEX = /^([1-9]+[0-9]*)x([1-9]+[0-9]*)(,([1-9][0-9]?)%)?$/;
|
||||||
|
function renderImage(tokens, idx, options, env, slf) {
|
||||||
|
var token = tokens[idx];
|
||||||
|
|
||||||
|
let alt = slf.renderInlineAsText(token.children, options, env);
|
||||||
|
|
||||||
|
let split = alt.split('|');
|
||||||
|
if (split.length > 1) {
|
||||||
|
let match;
|
||||||
|
let info = split.splice(split.length-1)[0];
|
||||||
|
|
||||||
|
if (match = info.match(IMG_SIZE_REGEX)) {
|
||||||
|
if (match[1] && match[2]) {
|
||||||
|
alt = split.join('|');
|
||||||
|
|
||||||
|
let width = match[1];
|
||||||
|
let height = match[2];
|
||||||
|
|
||||||
|
if (match[4]) {
|
||||||
|
let percent = parseFloat(match[4]) / 100.0;
|
||||||
|
width = parseInt(width * percent);
|
||||||
|
height = parseInt(height * percent);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (token.attrIndex('width') === -1) {
|
||||||
|
token.attrs.push(['width', width]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (token.attrIndex('height') === -1) {
|
||||||
|
token.attrs.push(['height', height]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
token.attrs[token.attrIndex('alt')][1] = alt;
|
||||||
|
return slf.renderToken(tokens, idx, options);
|
||||||
|
}
|
||||||
|
|
||||||
|
function setupImageDimensions(md) {
|
||||||
|
md.renderer.rules.image = renderImage;
|
||||||
|
}
|
||||||
|
|
||||||
export function setup(opts, siteSettings, state) {
|
export function setup(opts, siteSettings, state) {
|
||||||
if (opts.setup) {
|
if (opts.setup) {
|
||||||
return;
|
return;
|
||||||
|
@ -160,6 +204,7 @@ export function setup(opts, siteSettings, state) {
|
||||||
|
|
||||||
setupUrlDecoding(opts.engine);
|
setupUrlDecoding(opts.engine);
|
||||||
setupHoister(opts.engine);
|
setupHoister(opts.engine);
|
||||||
|
setupImageDimensions(opts.engine);
|
||||||
setupBlockBBCode(opts.engine);
|
setupBlockBBCode(opts.engine);
|
||||||
setupInlineBBCode(opts.engine);
|
setupInlineBBCode(opts.engine);
|
||||||
|
|
||||||
|
|
|
@ -890,5 +890,29 @@ HTML
|
||||||
expect(PrettyText.cook("<script>alert(42)</script>")).to eq ""
|
expect(PrettyText.cook("<script>alert(42)</script>")).to eq ""
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# custom rule used to specify image dimensions via alt tags
|
||||||
|
describe "image dimensions" do
|
||||||
|
it "allows title plus dimensions" do
|
||||||
|
cooked = PrettyText.cook <<~MD
|
||||||
|
![title with | title|220x100](http://png.com/my.png)
|
||||||
|
![](http://png.com/my.png)
|
||||||
|
![|220x100](http://png.com/my.png)
|
||||||
|
![stuff](http://png.com/my.png)
|
||||||
|
![|220x100,50%](http://png.com/my.png)
|
||||||
|
MD
|
||||||
|
|
||||||
|
html = <<~HTML
|
||||||
|
<p><img src="http://png.com/my.png" alt="title with | title" width="220" height="100"><br>
|
||||||
|
<img src="http://png.com/my.png" alt><br>
|
||||||
|
<img src="http://png.com/my.png" alt width="220" height="100"><br>
|
||||||
|
<img src="http://png.com/my.png" alt="stuff"><br>
|
||||||
|
<img src="http://png.com/my.png" alt width="110" height="50"></p>
|
||||||
|
HTML
|
||||||
|
puts cooked
|
||||||
|
|
||||||
|
expect(cooked).to eq(html.strip)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue