@meowdown/core 0.25.0 → 0.26.0
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.
- package/dist/index.d.ts +4 -4
- package/dist/index.js +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -12,10 +12,10 @@ import { VirtualElement } from "@floating-ui/dom";
|
|
|
12
12
|
/**
|
|
13
13
|
* How faithfully markdown survives a parse-then-serialize round trip:
|
|
14
14
|
* - `exact`: byte-identical (modulo the trailing newline).
|
|
15
|
-
* - `normalizing`:
|
|
16
|
-
* blank
|
|
17
|
-
*
|
|
18
|
-
* - `lossy`: a non-blank line
|
|
15
|
+
* - `normalizing`: bytes differ, but only as layout the parser collapses back -
|
|
16
|
+
* no non-blank line content is lost and re-parsing the output yields the same
|
|
17
|
+
* doc (e.g. a lazy continuation re-indented to its canonical column).
|
|
18
|
+
* - `lossy`: content changed - a non-blank line differs, or the re-parsed doc does.
|
|
19
19
|
*/
|
|
20
20
|
type RoundTripFidelity = 'exact' | 'normalizing' | 'lossy';
|
|
21
21
|
/** Options for {@link checkRoundTrip}. */
|
package/dist/index.js
CHANGED
|
@@ -19,7 +19,7 @@ import{Priority as e,Priority as t,createMarkBuilders as n,createNodeBuilders as
|
|
|
19
19
|
`),t.write(Si(r[e],i)));t.closeBlock()}function Si(e,t){let n=`|`;for(let r=0;r<t;r++)n+=` `+(e[r]??``)+` |`;return n}function Ci(e){let t=e.textContent.trim();return!t.includes(`|`)&&!t.includes(`
|
|
20
20
|
`)?t:t.replaceAll(`|`,String.raw`\|`).replaceAll(`
|
|
21
21
|
`,` `)}function wi(e){return e.replace(/\n+$/u,``)}function Ti(e){return/^[\s>]*$/u.test(e)}function Ei(e){return e.split(`
|
|
22
|
-
`).filter(e=>!Ti(e))}function Di(e,t={}){let n=Q(G(e,{frontmatter:t.frontmatter}),{frontmatter:t.frontmatter});if(wi(n)===wi(e))return`exact`;let r=Ei(e),i=Ei(n);return r.length===i.length&&r.every((e,t)=>e.
|
|
22
|
+
`).filter(e=>!Ti(e))}function Di(e,t={}){let n=Q(G(e,{frontmatter:t.frontmatter}),{frontmatter:t.frontmatter});if(wi(n)===wi(e))return`exact`;let r=Ei(e),i=Ei(n);return r.length===i.length&&r.every((e,t)=>e.trim()===i[t].trim())?`normalizing`:`lossy`}const Oi=(e,t)=>{let{$from:n,empty:r}=e.selection;if(!r||n.depth!==1||n.index(0)!==0||n.parent.type.name!==`heading`||n.parentOffset!==n.parent.content.size)return!1;if(t){let r=te(e.schema,`list`),i=te(e.schema,`paragraph`),a=r.create({kind:`bullet`},i.create()),o=n.after(),s=e.tr.insert(o,a);s.setSelection(S.create(s.doc,o+2)),t(s.scrollIntoView())}return!0};function ki(){return v(l({Enter:Oi}),t.high)}const Ai=new Set([`MscGen`,`Xù`,`MsGenny`,`Angular Template`,`Brainfuck`,`Esper`,`Oz`,`Factor`,`Squirrel`,`Yacas`,`mIRC`,`FCL`,`ECL`,`MUMPS`,`Pig`,`Asterisk`,`Z80`]),ji=Se.map(e=>e.name).filter(e=>!Ai.has(e)).map(e=>({label:e,value:e.toLowerCase()})).concat({label:`Plain text`,value:``}).sort((e,t)=>e.label.localeCompare(t.label));function Mi(){return typeof window>`u`?!1:window.matchMedia(`(prefers-color-scheme: dark)`).matches}const Ni=/^(?:www\.|mobile\.)?(?:twitter\.com|x\.com)$/i,Pi=/\/status(?:es)?\/(\d+)/;function Fi(e){let t;try{t=new URL(e)}catch{return}if(Ni.test(t.hostname))return Pi.exec(t.pathname)?.[1]}const Ii=e=>{let t=Fi(e);if(!t)return;let n=Mi()?`dark`:`light`;return{kind:`tweet`,key:`tweet:${t}`,src:`https://platform.twitter.com/embed/Tweet.html?id=${t}&theme=${n}&dnt=true`,title:`Tweet`,className:`md-embed md-embed-tweet`,testid:`tweet-embed`}};function Li(e){let t=t=>{if(t.source===e.contentWindow)try{let n=t.data?.[`twttr.embed`]?.params?.[0]?.height;typeof n==`number`&&(e.style.height=`${n}px`)}catch(e){console.warn(`[meowdown] failed to parse tweet resize message:`,e)}};window.addEventListener(`message`,t);let n=!1,r=()=>{n||(n=!0,window.removeEventListener(`message`,t),i.disconnect())},i=new MutationObserver(()=>{e.isConnected||r()});return i.observe(document.body,{childList:!0,subtree:!0}),r}const Ri=/^(?:www\.|m\.)?(?:youtube\.com|youtube-nocookie\.com)$/i,zi=/^(?:www\.)?youtu\.be$/i,Bi=/^[\w-]{11}$/;function Vi(e){let t;try{t=new URL(e)}catch{return}let n=null;if(zi.test(t.hostname))n=t.pathname.slice(1);else if(Ri.test(t.hostname)){let[,e,r]=t.pathname.split(`/`);t.pathname===`/watch`?n=t.searchParams.get(`v`):(e===`shorts`||e===`embed`||e===`live`)&&(n=r??null)}if(!n||!Bi.test(n))return;let r=t.searchParams.get(`start`)??t.searchParams.get(`t`),i=r?Hi(r):void 0;return{videoId:n,startSeconds:i}}function Hi(e){if(/^\d+$/.test(e))return Number(e);let t=/^(?:(\d+)h)?(?:(\d+)m)?(?:(\d+)s)?$/.exec(e);if(!(!t||!t[1]&&!t[2]&&!t[3]))return Number(t[1]??0)*3600+Number(t[2]??0)*60+Number(t[3]??0)}const Ui=[e=>{let t=Vi(e);if(!t)return;let n=t.startSeconds?`?start=${t.startSeconds}`:``;return{kind:`youtube`,key:`youtube:${t.videoId}:${t.startSeconds??0}`,src:`https://www.youtube-nocookie.com/embed/${t.videoId}${n}`,title:`YouTube video`,className:`md-embed md-embed-youtube`,testid:`youtube-embed`,allow:`accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen`,allowFullscreen:!0}},Ii];function Wi(e){for(let t of Ui){let n=t(e);if(n)return n}}const Gi=new x(`meowdown-embed-paste`);function Ki(e){let t=e.trim();if(!(!t||/\s/.test(t)))return Wi(t)?t:void 0}function qi(e,t){return e.clipboardData?.getData(`text/plain`)||t.content.textBetween(0,t.content.size,`
|
|
23
23
|
`)}function Ji(e,t){let{from:n,to:r}=e.state.selection;e.dispatch(nt(e.state.tr.insertText(t,n,r)));let i=e.state.tr.insertText(``,n,n+t.length);e.dispatch(nt(i))}function Yi(){return m(new b({key:Gi,props:{handlePaste:(e,t,n)=>{let r=e.state.selection.$from.parent;if(!r.inlineContent||r.type.spec.code)return!1;let i=qi(t,n);if(!i)return!1;let a=Ki(i);return a?(Ji(e,a),!0):!1}}}))}const Xi=new x(`meowdown-exit-boundary`);function Zi(e,t){let{$anchor:n,$head:r}=e.selection,i=t>0?n.max(r):n.min(r),a=i.parent.inlineContent?i.depth?e.doc.resolve(t>0?i.after():i.before()):void 0:i;return!!(a&&ye.findFrom(a,t))}function Qi(e,t){let{state:n}=e,{selection:r}=n;return g(r)&&!r.empty||ne(r)||r.$from.parent.inlineContent&&!e.endOfTextblock(t<0?`up`:`down`)?!0:Zi(n,t)}function $i(e){return new b({key:Xi,props:{handleKeyDown:(t,n)=>{if(n.shiftKey||n.altKey||n.ctrlKey||n.metaKey)return!1;let r=n.key===`ArrowUp`?-1:n.key===`ArrowDown`?1:void 0;return!(!r||Qi(t,r)||e({direction:r<0?`up`:`down`,event:n})===!1)}}})}function ea(e){return v(m($i(e)),t.low)}const ta=(e,t)=>{let n={type:`highlight`,children:e.all(t)};return e.patch(t,n),n},na=(e,t,n,r)=>{let i=e,a=n.createTracker(r),o=a.move(`==`);return o+=a.move(n.containerPhrasing(i,{...a.current(),before:o,after:`=`})),o+=a.move(`==`),o};function ra(){return st().use(rt).use(it,{handlers:{mark:ta}}).use(at).use(ot,{bullet:`-`,emphasis:`*`,strong:`*`,fence:"`",fences:!0,rule:`-`,ruleRepetition:3,listItemIndent:`one`,handlers:{highlight:na}}).freeze()}const ia=y(ra);function aa(e){return String(ia().processSync(e))}const oa=new x(`meowdown-html-paste`);function sa(){return m(new b({key:oa,props:{transformPastedHTML:(e,t)=>{if(e.includes(`data-pm-slice`))return e;let n=t.state.selection.$from.parent;if(!n.inlineContent||n.type.spec.code)return e;let r=aa(e);if(!r.trim())return e;let i=G(r,{nodes:Zr(t.state.schema)}),a=Pe.fromSchema(t.state.schema),o=document.createElement(`div`);return o.append(a.serializeFragment(i.content)),o.innerHTML}}}))}const ca=new x(`meowdown-image-click`);function la(e,t){let n=E(e,t,`mdImageSource`);if(!n)return;let{src:r,alt:i}=n.mark.attrs;return{from:n.from,to:n.to,src:r,alt:i}}function ua(e){return m(new b({key:ca,props:{handleClick:(t,n,r)=>{let i=r.target?.closest?.(`.md-image-preview`);if(!i)return!1;let a=i.closest(`.md-image-view`)?.querySelector(`.md-image-view-content`);if(!a)return!1;let o=la(t.state,t.posAtDOM(a,0));return o?(e({src:o.src,alt:o.alt,event:r}),!0):!1}}}))}function da(e){return/^https?:\/\//i.test(e)?e:void 0}function fa(e){let t=document.createElement(`iframe`);return t.src=e.src,t.title=e.title,t.className=e.className,t.dataset.testid=e.testid,t.loading=`lazy`,t.referrerPolicy=`strict-origin-when-cross-origin`,t.setAttribute(`frameborder`,`0`),e.allow&&(t.allow=e.allow),e.allowFullscreen&&(t.allowFullscreen=!0),e.kind===`tweet`&&Li(t),t}function pa(e,t,n){let r=Wi(e);if(r){let e=document.createElement(`span`);return e.className=`md-image-preview md-image-preview-embed`,e.appendChild(fa(r)),e}let i=(n.resolveImageUrl??da)(e);if(!i)return;let a=document.createElement(`span`);a.className=`md-image-preview md-image-preview-img`,a.dataset.testid=`image-preview`;let o=document.createElement(`img`);return o.src=i,o.alt=t,o.draggable=!1,a.appendChild(o),a}function ma(e){return t=>{let n=t.attrs,r=document.createElement(`span`);r.className=`md-image-view`;let i=document.createElement(`span`);i.className=`md-image-view-content`,r.appendChild(i);let a=pa(n.src,n.alt,e);return a&&(a.contentEditable=`false`,r.appendChild(a)),{dom:r,contentDOM:i,ignoreMutation:e=>!i.contains(e.target)}}}function ha(e){return e?Array.from(e.files).filter(e=>e.type.startsWith(`image/`)):[]}const ga=e=>{console.error(`[meowdown] failed to save pasted image:`,e)};async function _a(e,t,n,r=ga,i){let a=i;for(let i of t){let t;try{t=await n(i)}catch(e){r(e,i);continue}if(!t||e.isDestroyed)continue;let o=``,s=a==null?e.state.tr.insertText(o):e.state.tr.insertText(o,a);e.dispatch(s),a!=null&&(a+=o.length)}}function va(e){return new b({key:new x(`image-input`),props:{handlePaste:(t,n)=>{let r=ha(n.clipboardData),{onImagePaste:i,onImageSaveError:a}=e;return r.length===0||!i?!1:(_a(t,r,i,a),!0)},handleDrop:(t,n)=>{let r=ha(n.dataTransfer),{onImagePaste:i,onImageSaveError:a}=e;return r.length===0||!i?!1:(_a(t,r,i,a,t.posAtCoords({left:n.clientX,top:n.clientY})?.pos),!0)}}})}function ya(e={}){return _(d({name:`mdImageView`,constructor:ma(e)}),v(m(va(e)),t.high))}const ba={"Mod-b":`Bold`,"Mod-i":`Italic`,"Mod-e":`Inline code`,"Mod-Shift-x":`Strikethrough`,"Mod-Shift-h":`Highlight`,"Mod-k":`Link`,"Mod-1":`Heading 1`,"Mod-2":`Heading 2`,"Mod-3":`Heading 3`,"Mod-4":`Heading 4`,"Mod-5":`Heading 5`,"Mod-6":`Heading 6`};function xa(e){return m(new b({key:e.key,props:{handleClick:(t,n,r)=>{if(!r.target?.closest?.(e.selector))return!1;let i=e.findPayloadAt(t.state,n);return i==null?!1:(e.preventDefault&&r.preventDefault(),e.onClick(i,r),!0)}}}))}const Sa=new x(`meowdown-link-click`);function Ca(e){return xa({key:Sa,selector:`.md-link`,preventDefault:!0,findPayloadAt:(e,t)=>W(e,t)?.href,onClick:(t,n)=>e({href:t,event:n})})}function wa(e){let t,n=(n,r)=>{let i=r.target;if(!i||!ue(i))return;let a=i.closest(e.selector);if(!a||a===t)return;let o=n.posAtDOM(a,0),s=e.findPayloadAt(n.state,o);s!=null&&(t=a,e.onHoverChange({payload:s,element:a}))},r=n=>{if(!t)return;let r=n.relatedTarget;r&&t.contains(r)||(t=void 0,e.onHoverChange(void 0))};return _(s(`mouseover`,(e,t)=>n(e,t)),s(`mouseout`,(e,t)=>r(t)))}function Ta(e){return wa({selector:`.md-link`,findPayloadAt:(e,t)=>W(e,t),onHoverChange:e})}const Ea=new x(`meowdown-markdown-copy`);function Da(){return m(new b({key:Ea,props:{clipboardTextSerializer:(e,t)=>{let n=e.content,r;try{r=t.state.schema.topNodeType.createAndFill(void 0,n)??void 0}catch{r=void 0}return r?Q(r).replace(/\n+$/,``):n.textBetween(0,n.size,`
|
|
24
24
|
`,`
|
|
25
25
|
`)}}}))}const Oa=new x(`meowdown-tag-click`);function ka(e,t){let n=E(e,t,`mdTag`);if(!n)return;let r=e.doc.textBetween(n.from,n.to),i=r.startsWith(`#`)?r.slice(1):r;return{from:n.from,to:n.to,tag:i}}function Aa(e){return xa({key:Oa,selector:`.md-tag`,preventDefault:!1,findPayloadAt:(e,t)=>ka(e,t)?.tag,onClick:(t,n)=>e({tag:t,event:n})})}const ja=new x(`meowdown-wikilink-click`);function Ma(e,t){let n=E(e,t,`mdWikilinkSource`);if(!n)return;let{target:r}=n.mark.attrs;return{from:n.from,to:n.to,target:r}}function Na(e){return xa({key:ja,selector:`.md-wikilink-label, .md-wikilink-source`,preventDefault:!1,findPayloadAt:(e,t)=>Ma(e,t)?.target,onClick:(t,n)=>e({target:t,event:n})})}const Pa=(e,t)=>{let{selection:n}=e;if(!n.empty&&!n.$head.sameParent(n.$anchor))return!1;let r=e.doc.textBetween(n.from,n.to);if(r.startsWith(`[[`))return!1;r.startsWith(`[`)&&(r=r.slice(1));let i=`[[`+r;if(t){let r=e.tr.insertText(i,n.from,n.to);r.setSelection(S.create(r.doc,n.from+i.length)),ct(r),t(r.scrollIntoView())}return!0};function Fa(){return l({"Mod-Shift-k":Pa})}function Ia(e,t){let n=()=>{let n=e.coordsAtPos(t.from),r=e.coordsAtPos(t.to),i=Math.min(n.left,r.left),a=Math.max(n.right,r.right),o=Math.min(n.top,r.top),s=Math.max(n.bottom,r.bottom);return new DOMRect(i,o,a-i,s-o)};return{getBoundingClientRect:n,getClientRects:()=>[n()]}}export{ba as EDITOR_KEY_BINDINGS,e as Priority,Di as checkRoundTrip,ji as codeBlockLanguages,da as defaultResolveImageUrl,ki as defineBulletAfterHeading,kt as defineCodeBlockSyntaxHighlight,Wr as defineEditorExtension,Yi as defineEmbedPaste,ea as defineExitBoundaryHandler,Ut as defineHTMLComment,sa as defineHTMLPaste,ya as defineImage,ua as defineImageClickHandler,Ca as defineLinkClickHandler,xr as defineLinkCommands,Cr as defineLinkEditKeymap,Ta as defineLinkHoverHandler,pt as defineMarkMode,Da as defineMarkdownCopy,ce as definePlaceholder,le as defineReadonly,Aa as defineTagClickHandler,Na as defineWikilinkClickHandler,Fa as defineWikilinkTrigger,Q as docToMarkdown,jt as getCodeTokens,W as getLinkUnitAt,qr as getMarkBuilders,Ia as getVirtualElementFromRange,yn as inlineTextToMarkChunks,vr as insertLink,Li as listenForTweetHeight,G as markdownToDoc,Wi as matchEmbed,br as removeLink,yr as updateLink,oe as withPriority};
|