mfm-marked-extension
Version:
An MFM (Misskey-Flavored Markup) extension for marked
261 lines (260 loc) • 9.66 kB
JavaScript
;
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 = {}));