Skip to content

Commit

Permalink
[#9] Fix emStrong bug
Browse files Browse the repository at this point in the history
  • Loading branch information
3jins committed Jul 31, 2021
1 parent ae26123 commit af9440f
Show file tree
Hide file tree
Showing 2 changed files with 108 additions and 0 deletions.
76 changes: 76 additions & 0 deletions backend/src/common/markdown/MarkedUtil.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,82 @@ export const renderContent = (rawContent: string) => {
};

const tokenizer: Tokenizer = {
/**
* emStrong
*
* - Little fix of Copy-and-paste from emStrong tokenizer code of `markedjs` library.
* - v2.1.3
* - https://github.com/markedjs/marked/blob/825a9f82af05448d85618bbac6ade8fbf9df286b/src/Tokenizer.js#L549-L609
* - https://github.com/markedjs/marked/blob/825a9f82af05448d85618bbac6ade8fbf9df286b/src/rules.js#L176-L182
* - Check this issue:
* - https://github.com/markedjs/marked/issues/2154#issuecomment-890300422
*/
// @ts-ignore
emStrong(src, maskedSrc, prevChar = '') {
/* eslint-disable */
const rules = {
lDelim: /^(?:\*+(?:([_])|[^\s*]))|^_+(?:([*])|([^\s_]))/,
rDelimAst: /__[^_*]*?\*[^_*]*?__|[_](\*+)(?=[\s]|$)|[^*_\s](\*+)(?=[_\s]|$)|[_\s](\*+)(?=[^*_\s])|[\s](\*+)(?=[_])|[_](\*+)(?=[_])|[^*_\s](\*+)(?=[^*_\s])/,
rDelimUnd: /\*\*[^_*]*?_[^_*]*?\*\*|[*](_+)(?=[\s]|$)|[^*_\s](_+)(?=[*\s]|$)|[*\s](_+)(?=[^*_\s])|[\s](_+)(?=[*])|[*](_+)(?=[*])/,
};

let match = rules.lDelim.exec(src);
if (!match) return;

if (match[3] && prevChar.match(/[\p{L}\p{N}]/u)) return;

const nextChar = match[1] || match[2] || '';

if (!nextChar || (nextChar && (prevChar === ''))) {
const lLength = match[0].length - 1;
let rDelim, rLength, delimTotal = lLength, midDelimTotal = 0;

const endReg = match[0][0] === '*' ? rules.rDelimAst : rules.rDelimUnd;
endReg.lastIndex = 0;

maskedSrc = maskedSrc.slice(-1 * src.length + lLength);

while ((match = endReg.exec(maskedSrc)) != null) {
rDelim = match[1] || match[2] || match[3] || match[4] || match[5] || match[6];
if (!rDelim) {
continue;
}

rLength = rDelim.length;

if (match[3] || match[4]) {
delimTotal += rLength;
continue;
}
if ((match[5] || match[6]) && (lLength % 3 && !((lLength + rLength) % 3))) {
midDelimTotal += rLength;
continue;
}

delimTotal -= rLength;

if (delimTotal > 0) continue;

rLength = Math.min(rLength, rLength + delimTotal + midDelimTotal);

if (Math.min(lLength, rLength) % 2) {
return {
type: 'em',
raw: src.slice(0, lLength + match.index + rLength + 1),
text: src.slice(1, lLength + match.index + rLength),
};
}

return {
type: 'strong',
raw: src.slice(0, lLength + match.index + rLength + 1),
text: src.slice(2, lLength + match.index + rLength - 1),
};
}
}
/* eslint-enable */
},

// @ts-ignore
inlineText(src) {
const cap = src.match(/(\s*)([^$\n]*)\$([^$\n]+)\$([^$\n]*)/);
Expand Down
32 changes: 32 additions & 0 deletions backend/test/data/gfm+.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,38 @@

### bold
Lilac 앨범은 **이지은(아이유, IU)**의 작품이다.
원래 **bold 문법**은 이렇게 쓰는 것이니 디버깅할 때 참고쓰.
그리고 **이렇게** 단독으로 떨어진 단어도 렌더링돼야 하니 확인쓰.

### italic
Lilac 앨범은 *이지은(아이유, IU)*의 작품이다.
원래 *italic 문법*은 이렇게 쓰는 것이니 디버깅할 때 참고쓰.
그리고 *이렇게* 단독으로 떨어진 단어도 렌더링돼야 하니 확인쓰.

### bold and italic
Lilac 앨범은 ***이지은(아이유, IU)***의 작품이다.
원래 ***bold and italic 문법***은 이렇게 쓰는 것이니 디버깅할 때 참고쓰.
그리고 ***이렇게*** 단독으로 떨어진 단어도 렌더링돼야 하니 확인쓰.

### strike-out
Lilac 앨범은 ~~이지금(아이유, IU)~~의 작품이다.
원래 ~~strike-out 문법~~은 이렇게 쓰는 것이니 디버깅할 때 참고쓰.
그리고 ~~이렇게~~ 단독으로 떨어진 단어도 렌더링돼야 하니 확인쓰.

### should be excluded in code blocks
```c
#include <stdio.h>

int main() {
/* C 놓은지 3년이 다 돼가서 포인터 이렇게 쓰는거 맞는지 모르겠음..;; */
int a = 1;
int* ptr = a;
return 0;
}
```

### should be excluded in inline code
Java에서 주석은 `/*이런 식으로*/` 사용하는데, 저게 이탤릭으로 렌더링되면 난감하다.

## Raw HTML

Expand Down

0 comments on commit af9440f

Please sign in to comment.