rapier-markdown-kit 1.2.29 → 1.2.31

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.
@@ -1,7 +1,7 @@
1
1
  # The conformance kit
2
2
 
3
3
  Thirteen small documents, each covering one placement fact from [the Markdown
4
- standard](https://rapier.website/markdown-standard): inline (no layout comment), width/x/align, `wrap=around`
4
+ standard](https://github.com/jackskip22/rapier/blob/main/docs/markdown-standard.md): inline (no layout comment), width/x/align, `wrap=around`
5
5
  with a real alpha silhouette, `wrap=box`, `behind`, `front`, `rotate=` on a plain raster, a foreign
6
6
  SVG "drawing" already turned in its own bytes, a ring drawing whose unfilled interior takes a line of
7
7
  text, both-sides wrapping around a centred picture, the neighbour search skipping a second, unrelated
@@ -1054,6 +1054,8 @@ function _rapierRemoveCalloutMarker(first) {
1054
1054
  );
1055
1055
  }
1056
1056
 
1057
+ const mathSource = /^\$\$[\s\S]+\$\$$|^\$[^$\n]+\$$/;
1058
+
1057
1059
  function _rapierMathSource(node) {
1058
1060
  if (!node) return '';
1059
1061
  const carrier = node.matches && node.matches('[data-math-src]')
@@ -1404,7 +1406,7 @@ function* _rapierPortableInlineTextSteps(node, options) {
1404
1406
  }
1405
1407
  if (tag === 'CODE' && !opts.inPre) {
1406
1408
  const source = String(node.textContent || '');
1407
- return opts.visible ? source : source ? '`' + source + '`' : '';
1409
+ return opts.visible || mathSource.test(source) ? source : source ? '`' + source + '`' : '';
1408
1410
  }
1409
1411
  const parts = [];
1410
1412
  for (let child = node.firstChild; child; child = child.nextSibling) parts.push(yield* _rapierPortableInlineTextSteps(child, opts));
@@ -171,6 +171,31 @@ function _rapierPrintWillPageCss() {
171
171
 
172
172
  const CAPTURE_EDGE = 4096, CAPTURE_PIXELS = 4 * 1024 * 1024;
173
173
 
174
+ function wrapMasks(main) {
175
+ const doc = main.ownerDocument;
176
+ for (const float of main.querySelectorAll('.rapier-wrap-picture')) {
177
+ const image = float.querySelector('img'), layout = decodeURIComponent(image?.getAttribute('data-rapier-image-layout') || '');
178
+ if (!image || !/\bwrap=around\b/.test(layout) || /\b(rotate|y)=/.test(layout) || image.dataset.rapierContour?.endsWith('-box')) continue;
179
+ if (/^(inset|polygon)\(/.test(float.style.getPropertyValue('shape-outside'))) continue;
180
+ const bounds = image.getBoundingClientRect(), width = Math.ceil(bounds.width), height = Math.ceil(bounds.height);
181
+ float.style.removeProperty('shape-outside');
182
+ if (!(width > 0 && height > 0) || width * height > 4e6) continue;
183
+ const canvas = doc.createElement('canvas');
184
+ canvas.width = width; canvas.height = height;
185
+ try {
186
+ const context = canvas.getContext('2d', {willReadFrequently: true});
187
+ context.drawImage(image, 0, 0, width, height);
188
+ const alpha = context.getImageData(0, 0, width, height).data;
189
+ let clear = false;
190
+ for (let index = 3; index < alpha.length && !clear; index += 4) clear = alpha[index] < 250;
191
+ if (!clear) continue;
192
+ float.style.setProperty('shape-outside', 'url("' + canvas.toDataURL('image/png') + '")');
193
+ float.style.setProperty('shape-image-threshold', '0.1');
194
+ float.style.setProperty('shape-margin', '1rem');
195
+ } catch (_) { }
196
+ }
197
+ }
198
+
174
199
  async function _rapierWritePrintPdf({root, css, fontCss = '', canonical, bom = false, filename, title, settings, templatePage = null}, {capture, signal, current, maxBytes = 8 * 1024 * 1024, film, ink} = {}) {
175
200
  const refuse = code => { throw Object.assign(new Error(code), {code}); };
176
201
  const check = () => {
@@ -240,6 +265,7 @@ async function _rapierWritePrintPdf({root, css, fontCss = '', canonical, bom = f
240
265
  if (fontCss) await step(waitForFonts(main, {fontCss, css, settings}));
241
266
  await step(into.fonts.ready);
242
267
  for (const image of main.querySelectorAll('img')) { image.loading = 'eager'; await step(image.decode()); }
268
+ wrapMasks(main);
243
269
  check();
244
270
  for (const node of [main, ...main.querySelectorAll('*')]) {
245
271
  const style = into.defaultView.getComputedStyle(node);
@@ -16,7 +16,7 @@ body{
16
16
  --color-text-subtle:var(--md-color-text-subtle);--color-accent-text:var(--md-color-accent-text);
17
17
  margin:0;background:var(--md-color-bg);color:var(--md-color-text);font-family:var(--md-font-sans);-webkit-font-smoothing:antialiased
18
18
  }
19
- .rapier-page{width:min(100%,calc(var(--md-measure,39.6rem) + 32px));margin:0 auto;padding:48px 16px 72px}
19
+ .rapier-page{width:min(100%,calc(var(--md-measure,39.6rem) + 32px));margin:0 auto;padding:48px 16px 72px;isolation:isolate}
20
20
  .rapier-page [id]{scroll-margin-top:var(--md-space-8)}
21
21
  .artifact-flat{margin:0;white-space:pre-wrap;overflow-wrap:anywhere;tab-size:2}
22
22
  .artifact-flat--text{font:var(--md-fw-regular) 1rem/1.7 var(--md-font-sans)}
@@ -763,7 +763,7 @@ function* _rapierSharedPageLayoutSteps(root) {
763
763
  if (layout.width != null || image.getAttribute('width')) image.style.width = '100%';
764
764
  }
765
765
  if (layout.rotate) { image.style.transform = 'rotate(' + layout.rotate + 'deg)'; image.style.transformOrigin = '50% 50%'; }
766
- if (layout.wrap === 'around' && !layout.rotate && !layout.y && !image.dataset.rapierContour?.endsWith('-box')) {
766
+ if (layout.wrap === 'around' && !layout.rotate && !layout.y && layout.width == null && !image.dataset.rapierContour?.endsWith('-box')) {
767
767
  const src = image.getAttribute('src');
768
768
  if (src) {
769
769
  paragraph.style.setProperty('shape-outside', 'url("' + src + '")');
@@ -515,9 +515,10 @@ export function retireDeletedImageDefinitions(before, after, splices, factory) {
515
515
  return retired.sort((a, b) => b.start - a.start).map(row => {
516
516
  const gap = /(?:\r\n\r\n|\n\n|\r\r)$/.exec(after.slice(Math.max(0, row.start - 4), row.start));
517
517
  let tail = after.slice(row.end);
518
+ const last = /^(?:\r\n|\n|\r)?$/.test(tail);
518
519
  for (const other of retired) if (other.start >= row.end) tail = tail.replace(other.source, '');
519
520
  const whole = gap && !/\S/.test(tail) && row.start - gap[0].length > markdownBodyOffset(after);
520
- return whole ? {pos: row.start - gap[0].length, removed: gap[0] + row.source, inserted: ''} : {pos: row.start, removed: row.source, inserted: ''};
521
+ return whole ? {pos: row.start - gap[0].length, removed: gap[0] + row.source + (last ? after.slice(row.end) : ''), inserted: ''} : {pos: row.start, removed: row.source, inserted: ''};
521
522
  });
522
523
  } catch (_) { return []; }
523
524
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rapier-markdown-kit",
3
- "version": "1.2.29",
3
+ "version": "1.2.31",
4
4
  "description": "Read, render and write Self-contained Markdown: one .md file that carries its pictures, drawings and layout, and that any Markdown app can read. HTML renderer, stylesheet, text layout, Will/1 agent permissions, and an edit history with authorship and offline merge. MIT, no dependencies.",
5
5
  "keywords": [
6
6
  "markdown",
package/style.css CHANGED
@@ -335,8 +335,10 @@
335
335
  depend on it would go wrong quietly. */
336
336
  color: inherit;
337
337
  position: relative;
338
- left: calc(-1 * var(--md-space-5) - 16px);
339
- margin: -16px calc(var(--md-space-1) - 16px) -16px 0;
338
+ /* The 48px target overhangs the drawn box by 16px on every side; the overhangs take no room in the line, so the words
339
+ stand where they stood beside the box before the target grew (the left overhang in the line pushed them 16px on). */
340
+ left: calc(-1 * var(--md-space-5));
341
+ margin: -16px calc(var(--md-space-1) - 16px) -16px -16px;
340
342
  width: 48px; height: 48px;
341
343
  font: inherit;
342
344
  -webkit-appearance: none; appearance: none;