UNPKG

mfm-marked-extension

Version:

An MFM (Misskey-Flavored Markup) extension for marked

261 lines (260 loc) 9.66 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.mfmMentionToken = exports.mfmFnToken = void 0; /** * Token parser namespace for MFM Fn */ var mfmFnToken; (function (mfmFnToken) { function parseTime(timeText) { if (timeText.endsWith('s')) return timeText.replace('s', ''); if (timeText.endsWith('m')) return (Number(timeText.replace('m', '')) * 60).toString(); return '5'; } /** * Parse the MFM animation using speed and delay as its parameters * @param _class MFM animation class to be rendered. Can be extended with CSS. * @param raw RAW internal value * @param isLinear If the animation should be linear, let it `true`. Otherwise `false`. * @param style Animation parameters be set. \ * Only `speed` and `delay` are parsed in here, so you should parse externally if you want others be accepted. * @param additionalOptions Additional CSS style options will be in here. * @param additionalAnimationParam Additional CSS animation parameters be set here. */ function parseSpeedDelay(_class, raw, isLinear, style, additionalOptions, additionalAnimationParam) { let speed; let delay; speed = (style === null || style === void 0 ? void 0 : style['speed']) && style['speed'] !== true ? Number(parseTime(style['speed'])) : 5; delay = (style === null || style === void 0 ? void 0 : style['delay']) && style['delay'] !== true ? Number(parseTime(style['delay'])) : undefined; return `<span style="display: inline-block; ${additionalOptions} animation: ${speed}s ${isLinear ? 'linear' : ''} ${delay ? `${delay}s` : ''} infinite ${additionalAnimationParam} ${_class};">${raw}</span>`; } mfmFnToken.parseSpeedDelay = parseSpeedDelay; /** * MFM $[tada] * @param raw Internal raw value. * @param style Animation parameters. */ function tada(raw, style) { return parseSpeedDelay('global-tada', raw, true, style, 'font-size: 1.5rem;', 'both'); } mfmFnToken.tada = tada; /** * MFM $[jelly] * @param raw Internal raw value. * @param style Animation parameters. */ function jelly(raw, style) { return parseSpeedDelay('mfm-rubberBand', raw, true, style); } mfmFnToken.jelly = jelly; /** * MFM $[twitch] * @param raw Internal raw value. * @param style Animation parameters. */ function twitch(raw, style) { return parseSpeedDelay('mfm-twitch', raw, false, style); } mfmFnToken.twitch = twitch; /** * MFM $[shake] * @param raw Internal raw value. * @param style Animation parameters. */ function shake(raw, style) { return parseSpeedDelay('mfm-shake', raw, false, style); } mfmFnToken.shake = shake; /** * MFM $[spin] * @param raw Internal raw value. * @param style Animation parameters. */ function spin(raw, style) { let opt; if (style) { if (style['alternate']) opt = 'alternate'; if (style['left']) opt = 'left'; if (style['x']) opt = 'x'; if (style['y']) opt = 'y'; } return parseSpeedDelay('mfm-spin', raw, true, style, undefined, opt); } mfmFnToken.spin = spin; /** * MFM $[jump] * @param raw Internal raw value. * @param style Animation parameters. */ function jump(raw, style) { return parseSpeedDelay('mfm-jump', raw, true, style); } mfmFnToken.jump = jump; /** * MFM $[bounce] * @param raw Internal raw value. * @param style Animation parameters. */ function bounce(raw, style) { return parseSpeedDelay('mfm-bounce', raw, true, style, 'transform-origin: center bottom 0px;'); } mfmFnToken.bounce = bounce; /** * MFM $[rainbow] * @param raw Internal raw value. * @param style Animation parameters. */ function rainbow(raw, style) { return parseSpeedDelay('mfm-rainbow', raw, true, style); } mfmFnToken.rainbow = rainbow; /** * MFM $[flip] * @param raw Internal raw value. * @param style Animation parameters. */ function flip(raw, style) { let mode; if ((style === null || style === void 0 ? void 0 : style['h']) && (style === null || style === void 0 ? void 0 : style['y'])) mode = 'scale'; else if (!style || (style === null || style === void 0 ? void 0 : style['h'])) mode = 'scaleX'; else mode = 'scaleY'; return `<span style="display: inline-block; transform: ${mode}(-1);">${raw}</span>`; } mfmFnToken.flip = flip; /** * MFM $[x2], $[x3], $[x4] * @param raw Internal raw value. * @param times set this in {2..4} */ function xN(raw, times) { return `<span class="mfm-x${times}">${raw}</span>`; } mfmFnToken.xN = xN; /** * MFM $[scale] * @param raw Internal raw value. * @param style Scale value. Should be `string`, but should be able to parse into Number. * ```ts * { x: string, y: string } * ``` * Floats are accepted. Must be in between -5 and 5. */ function scale(raw, style) { // truncate let x; if (!(style === null || style === void 0 ? void 0 : style['x'])) x = 1; else try { x = Number(style['x']); } catch (_a) { x = 1; } if (x < -5) x = -5; if (x > 5) x = 5; let y; if (!(style === null || style === void 0 ? void 0 : style['y'])) y = 1; else try { y = Number(style['y']); } catch (_b) { y = 1; } if (y < -5) y = -5; if (y > 5) y = 5; return `<span style="display: inline-block; transform: scale(${x}, ${y});">${raw}</span>`; } mfmFnToken.scale = scale; /** * MFM $[fg] and $[bg] * @param raw Internal raw value. * @param isFg `true` if $[fg], `false` if $[bg] * @param style Color set. Value must be in CSS. \ * Casting `rgb()` or `rgba()` is accepted in this function, but doesn't in actual MFM. * ```ts * { color: string } * ``` */ function color(raw, isFg, style) { var _a; return `<span style="display: inline-block; ${isFg ? '' : 'background-'}color: ${(_a = style === null || style === void 0 ? void 0 : style['color']) !== null && _a !== void 0 ? _a : 'red'}; overflow-wrap: anywhere;>${raw}</span>`; } mfmFnToken.color = color; /** * MFM $[border] * @param raw Internal raw value. * @param style CSS Border style value set. If `noclip`, additional `overflow: clip;` is accepted. * ```ts * { width: string, color: string, style: string, radius: string, noclip: boolean } * // border: width color style radius; * ``` */ function border(raw, style) { var _a, _b, _c, _d; return `<span style="display: inline-block; border: ${(_a = style === null || style === void 0 ? void 0 : style['width']) !== null && _a !== void 0 ? _a : 1} ${(_b = style === null || style === void 0 ? void 0 : style['color']) !== null && _b !== void 0 ? _b : `var(--accent)`} ${(_c = style === null || style === void 0 ? void 0 : style['style']) !== null && _c !== void 0 ? _c : 'solid'} ${(_d = style === null || style === void 0 ? void 0 : style['radius']) !== null && _d !== void 0 ? _d : 1};${(style === null || style === void 0 ? void 0 : style['noclip']) ? ' overflow: clip;' : ''}">${raw}</span>`; } mfmFnToken.border = border; /** * MFM $[blur] * @param raw Internal raw value. */ function blur(raw) { return `<span class="_mfm_blur_">${raw}</span>`; } mfmFnToken.blur = blur; /** * MFM $[rotate] * @param raw Internal raw value. * @param style Transform options. `deg` should be string, but the value must be number. \ * Float-style is accepted. * ```ts * { deg: string } * ``` */ function rotate(raw, style) { var _a; return `<span style="display: inline-block; transform: rotate(${(_a = style === null || style === void 0 ? void 0 : style['deg']) !== null && _a !== void 0 ? _a : 90}deg); transform-origin: center center 0px;">${raw}</span>`; } mfmFnToken.rotate = rotate; /** * MFM $[ruby] * @param rbMain Main content that be ruby-ed * @param rbRt Content of ruby, the RubyText(`<rt>`) */ function ruby(rbMain, rbRt) { return `<ruby>${rbMain}<rt>${rbRt}</rt></ruby>`; } mfmFnToken.ruby = ruby; })(mfmFnToken || (exports.mfmFnToken = mfmFnToken = {})); ; /** * Token parser namespace for MFM mention */ var mfmMentionToken; (function (mfmMentionToken) { /** * MFM `@mention`. Since outta instance, instance URI should be provided. * @param account Account name of the fediverse ID. * @param instance Instance URI of the fediverse. */ function mentionFediverse(account, instance) { return `<a href="https://${instance}/${account}" title="@${account}@{instance}">@${account}<span style="opacity: 0.7; &:hover { opacity: 0.85; }">@${instance}</span></a>`; } mfmMentionToken.mentionFediverse = mentionFediverse; })(mfmMentionToken || (exports.mfmMentionToken = mfmMentionToken = {}));