UNPKG

mfm-marked-extension

Version:

An MFM (Misskey-Flavored Markup) extension for marked

111 lines (110 loc) 4.82 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.mfmMention = exports.mfmFn = void 0; const token_1 = require("./token"); /** * MFM class Fn ($[...]) tokenizer and renderer */ exports.mfmFn = { name: 'mfmFn', level: 'block', start(src) { var _a; return (_a = src.match(/\$\[/)) === null || _a === void 0 ? void 0 : _a.index; }, tokenizer: (src, tokens) => { var _a, _b; const rule = /^\$\[([a-z0-9_]+)(?:.([A-Za-z0-9_=,]+))? ([\S\s]+)\]/i; const match = rule.exec(src); if (match) { let ruby = undefined; if (match[0] === 'ruby') { const ruleRuby = /([\S]+) ([\S])/; ruby = ruleRuby.exec(match[2]); } let style = undefined; if (match[1]) { const ruleFnClass = /([\w]+)(?:=[\w.]+)?(?:,([\w]+)(?:=[\w.]+)?)*/i; style = ruleFnClass.exec(match[1]); } const token = { type: 'mfmFn', fullRaw: src, raw: match[2], style: match[0], styleClasses: style, rubyBody: (_a = ruby === null || ruby === void 0 ? void 0 : ruby[0]) !== null && _a !== void 0 ? _a : '', rubyRb: (_b = ruby === null || ruby === void 0 ? void 0 : ruby[1]) !== null && _b !== void 0 ? _b : '', tokens: [], }; if (!ruby) this.lexer.inline(token.raw, token.tokens); return token; } return {}; }, renderer(token) { //TODO bake token.styleClasses into library const _styleClass = {}; if (token.styleClass) { for (let i = 0; i++; i < token.styleClass.size) { const parseStyle = /([\w]+)(?:=([\w]+))?/i; const parsedStyle = parseStyle.exec(token.styleClass[i]); if ((parsedStyle === null || parsedStyle === void 0 ? void 0 : parsedStyle[0]) == undefined) continue; if (parsedStyle === null || parsedStyle === void 0 ? void 0 : parsedStyle[1]) _styleClass[parsedStyle[0]] = parsedStyle[1]; else _styleClass[parsedStyle[0]] = true; } } switch (token.style) { //TODO renderer function // TIP: declaritive object case 'tada': return token_1.mfmFnToken.tada(token.raw, _styleClass); case 'jelly': return token_1.mfmFnToken.jelly(token.raw, _styleClass); case 'twitch': return token_1.mfmFnToken.twitch(token.raw, _styleClass); case 'shake': return token_1.mfmFnToken.shake(token.raw, _styleClass); case 'spin': return token_1.mfmFnToken.spin(token.raw, _styleClass); case 'jump': return token_1.mfmFnToken.jump(token.raw, _styleClass); case 'bounce': return token_1.mfmFnToken.bounce(token.raw, _styleClass); case 'rainbow': return token_1.mfmFnToken.rainbow(token.raw, _styleClass); case 'flip': return token_1.mfmFnToken.flip(token.raw, _styleClass); case 'x2': return token_1.mfmFnToken.xN(token.raw, 2); case 'x3': return token_1.mfmFnToken.xN(token.raw, 3); case 'x4': return token_1.mfmFnToken.xN(token.raw, 4); case 'scale': return token_1.mfmFnToken.scale(token.raw, _styleClass); case 'fg': return token_1.mfmFnToken.color(token.raw, true, _styleClass); case 'bg': return token_1.mfmFnToken.color(token.raw, false, _styleClass); case 'border': return token_1.mfmFnToken.border(token.raw, _styleClass); case 'blur': return token_1.mfmFnToken.blur(token.raw); case 'rotate': return token_1.mfmFnToken.rotate(token.raw, _styleClass); case 'ruby': return token_1.mfmFnToken.ruby(token.rubyBody, token.rubyRb); default: return token.fullRaw; } // not executed but return token.fullRaw; } }; /** * MFM class `@mention` tokenizer and renderer */ exports.mfmMention = { name: 'mfmMention', level: 'inline', start(src) { var _a; return (_a = src.match(/@/)) === null || _a === void 0 ? void 0 : _a.index; }, tokenizer: (src, tokens) => { const rule = /^@([a-z0-9._-]+)@([a-z0-9._-]+)/; const match = rule.exec(src); if (match) { const token = { type: 'mfmMention', raw: src, userId: match[0], userInstance: match[1], }; return token; } return {}; }, renderer(token) { return token_1.mfmMentionToken.mentionFediverse(token.userId, token.userInstance); } };