Initial commit
This commit is contained in:
commit
003d398450
10 changed files with 10840 additions and 0 deletions
9
.editorconfig
Normal file
9
.editorconfig
Normal file
|
@ -0,0 +1,9 @@
|
|||
root = true
|
||||
|
||||
[*]
|
||||
charset = utf-8
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
end_of_line = lf
|
||||
insert_final_newline = true
|
||||
trim_trailing_whitespace = true
|
13
.eslintrc.cjs
Normal file
13
.eslintrc.cjs
Normal file
|
@ -0,0 +1,13 @@
|
|||
module.exports = {
|
||||
root: true,
|
||||
plugins: ['jest'],
|
||||
extends: ['standard'],
|
||||
rules: {
|
||||
'comma-dangle': ['error', 'always-multiline'],
|
||||
'arrow-parens': 0,
|
||||
'no-tabs': 0,
|
||||
},
|
||||
env: {
|
||||
'jest/globals': true,
|
||||
},
|
||||
}
|
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
node_modules/
|
55
LICENSE
Normal file
55
LICENSE
Normal file
|
@ -0,0 +1,55 @@
|
|||
# Blue Oak Model License
|
||||
|
||||
Version 1.0.0
|
||||
|
||||
## Purpose
|
||||
|
||||
This license gives everyone as much permission to work with
|
||||
this software as possible, while protecting contributors
|
||||
from liability.
|
||||
|
||||
## Acceptance
|
||||
|
||||
In order to receive this license, you must agree to its
|
||||
rules. The rules of this license are both obligations
|
||||
under that agreement and conditions to your license.
|
||||
You must not do anything with this software that triggers
|
||||
a rule that you cannot or will not follow.
|
||||
|
||||
## Copyright
|
||||
|
||||
Each contributor licenses you to do everything with this
|
||||
software that would otherwise infringe that contributor's
|
||||
copyright in it.
|
||||
|
||||
## Notices
|
||||
|
||||
You must ensure that everyone who gets a copy of
|
||||
any part of this software from you, with or without
|
||||
changes, also gets the text of this license or a link to
|
||||
<https://blueoakcouncil.org/license/1.0.0>.
|
||||
|
||||
## Excuse
|
||||
|
||||
If anyone notifies you in writing that you have not
|
||||
complied with [Notices](#notices), you can keep your
|
||||
license by taking all practical steps to comply within 30
|
||||
days after the notice. If you do not do so, your license
|
||||
ends immediately.
|
||||
|
||||
## Patent
|
||||
|
||||
Each contributor licenses you to do everything with this
|
||||
software that would otherwise infringe any patent claims
|
||||
they can license or become able to license.
|
||||
|
||||
## Reliability
|
||||
|
||||
No contributor can revoke this license.
|
||||
|
||||
## No Liability
|
||||
|
||||
***As far as the law allows, this software comes as is,
|
||||
without any warranty or condition, and no contributor
|
||||
will be liable to anyone for any damages related to this
|
||||
software or this license, under any kind of legal claim.***
|
3
babel.config.json
Normal file
3
babel.config.json
Normal file
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"presets": ["@babel/preset-env"]
|
||||
}
|
20
jest.config.js
Normal file
20
jest.config.js
Normal file
|
@ -0,0 +1,20 @@
|
|||
export default {
|
||||
restoreMocks: true,
|
||||
clearMocks: true,
|
||||
collectCoverageFrom: [
|
||||
'src/index.js',
|
||||
],
|
||||
coverageDirectory: 'coverage',
|
||||
coverageThreshold: {
|
||||
global: {
|
||||
branches: 100,
|
||||
functions: 100,
|
||||
lines: 100,
|
||||
statements: 100,
|
||||
},
|
||||
},
|
||||
testRegex: /\.test\.js$/.source,
|
||||
transform: {
|
||||
'\\.[jt]sx?$': 'babel-jest',
|
||||
},
|
||||
}
|
10648
package-lock.json
generated
Normal file
10648
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load diff
33
package.json
Normal file
33
package.json
Normal file
|
@ -0,0 +1,33 @@
|
|||
{
|
||||
"name": "marked-mfm",
|
||||
"version": "0.1.0",
|
||||
"description": "Marked.js extension for Misskey-flavored Markdown",
|
||||
"main": "./src/index.js",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"lint": "eslint .",
|
||||
"lint-fix": "eslint --fix .",
|
||||
"test": "jest --verbose"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://akkoma.dev/sfr/marked-mfm"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://akkoma.dev/sfr/marked-mfm/issues"
|
||||
},
|
||||
"author": "Sol Fisher Romanoff <sol@solfisher.com>",
|
||||
"license": "BlueOak-1.0.0",
|
||||
"peerDependencies": {
|
||||
"marked": "^4.0.17"
|
||||
},
|
||||
"dependencies": {
|
||||
"@babel/core": "^7.18.6",
|
||||
"@babel/preset-env": "^7.18.6",
|
||||
"babel-jest": "^28.1.2",
|
||||
"eslint": "^8.19.0",
|
||||
"eslint-config-standard": "^17.0.0",
|
||||
"eslint-plugin-jest": "^26.5.3",
|
||||
"jest-cli": "^28.1.2"
|
||||
}
|
||||
}
|
40
src/index.js
Normal file
40
src/index.js
Normal file
|
@ -0,0 +1,40 @@
|
|||
export default (options = {}) => ({
|
||||
extensions: [
|
||||
{
|
||||
name: 'mfm',
|
||||
level: 'inline',
|
||||
start(src) { return src.match(/\$\[/)?.index },
|
||||
tokenizer (src, tokens) {
|
||||
const rule = /^\$\[([\w\d]+) (.+)\]$/
|
||||
const match = rule.exec(src)
|
||||
if (match) {
|
||||
const token = {
|
||||
type: 'mfm',
|
||||
raw: match[0],
|
||||
markup: match[1],
|
||||
text: match[2],
|
||||
tokens: []
|
||||
}
|
||||
this.lexer.inline(token.text, token.tokens)
|
||||
return token
|
||||
}
|
||||
},
|
||||
renderer (token) {
|
||||
const el = tokenClass => `<span style="display: inline-block" class="${tokenClass}">${this.parser.parseInline(token.tokens)}</span>`
|
||||
switch (token.markup) {
|
||||
case 'x2':
|
||||
return el('x2')
|
||||
break
|
||||
case 'twitch':
|
||||
return el('twitch')
|
||||
break
|
||||
case 'sparkle':
|
||||
return el('sparkle')
|
||||
break
|
||||
default:
|
||||
return token.raw
|
||||
}
|
||||
},
|
||||
},
|
||||
]
|
||||
})
|
18
test/index.test.js
Normal file
18
test/index.test.js
Normal file
|
@ -0,0 +1,18 @@
|
|||
import { marked } from 'marked'
|
||||
import markedMfm from '../src/index.js'
|
||||
|
||||
describe('marked-mfm', () => {
|
||||
beforeEach(() => {
|
||||
marked.setOptions(marked.getDefaults())
|
||||
})
|
||||
|
||||
test('inline', () => {
|
||||
marked.use(markedMfm())
|
||||
expect(marked('$[x2 this text is bigger]')).toBe('<p><span style="display: inline-block" class="x2">this text is bigger</span></p>\n')
|
||||
})
|
||||
|
||||
test('nested', () => {
|
||||
marked.use(markedMfm())
|
||||
expect(marked('$[twitch twitch $[sparkle sparkle]]')).toBe('<p><span style="display: inline-block" class="twitch">twitch <span style="display: inline-block" class="sparkle">sparkle</span></span></p>\n')
|
||||
})
|
||||
})
|
Loading…
Reference in a new issue