summaryrefslogtreecommitdiff
path: root/src/common
diff options
context:
space:
mode:
authorsyuilo <syuilotan@yahoo.co.jp>2017-03-18 20:05:11 +0900
committersyuilo <syuilotan@yahoo.co.jp>2017-03-18 20:05:11 +0900
commit45e8331e261244628b134a18e3d0fbe0ebb3a7dc (patch)
tree44ac1719fcea0a61c33698b23fb89400141e00d9 /src/common
parentBetter notification (diff)
downloadsharkey-45e8331e261244628b134a18e3d0fbe0ebb3a7dc.tar.gz
sharkey-45e8331e261244628b134a18e3d0fbe0ebb3a7dc.tar.bz2
sharkey-45e8331e261244628b134a18e3d0fbe0ebb3a7dc.zip
:sushi:
Closes #12, #227 and #58
Diffstat (limited to 'src/common')
-rw-r--r--src/common/text/core/syntax-highlighter.js332
-rw-r--r--src/common/text/elements/bold.js14
-rw-r--r--src/common/text/elements/code.js17
-rw-r--r--src/common/text/elements/emoji.js14
-rw-r--r--src/common/text/elements/hashtag.js19
-rw-r--r--src/common/text/elements/inline-code.js17
-rw-r--r--src/common/text/elements/link.js19
-rw-r--r--src/common/text/elements/mention.js14
-rw-r--r--src/common/text/elements/url.js14
-rw-r--r--src/common/text/index.js71
10 files changed, 0 insertions, 531 deletions
diff --git a/src/common/text/core/syntax-highlighter.js b/src/common/text/core/syntax-highlighter.js
deleted file mode 100644
index 06c59777e7..0000000000
--- a/src/common/text/core/syntax-highlighter.js
+++ /dev/null
@@ -1,332 +0,0 @@
-function escape(text) {
- return text
- .replace(/>/g, '&gt;')
- .replace(/</g, '&lt;');
-}
-
-// 文字数が多い順にソートします
-// そうしないと、「function」という文字列が与えられたときに「func」が先にマッチしてしまう可能性があるためです
-const _keywords = [
- 'true',
- 'false',
- 'null',
- 'nil',
- 'undefined',
- 'void',
- 'var',
- 'const',
- 'let',
- 'mut',
- 'dim',
- 'if',
- 'then',
- 'else',
- 'switch',
- 'match',
- 'case',
- 'default',
- 'for',
- 'each',
- 'in',
- 'while',
- 'loop',
- 'continue',
- 'break',
- 'do',
- 'goto',
- 'next',
- 'end',
- 'sub',
- 'throw',
- 'try',
- 'catch',
- 'finally',
- 'enum',
- 'delegate',
- 'function',
- 'func',
- 'fun',
- 'fn',
- 'return',
- 'yield',
- 'async',
- 'await',
- 'require',
- 'include',
- 'import',
- 'imports',
- 'export',
- 'exports',
- 'from',
- 'as',
- 'using',
- 'use',
- 'internal',
- 'module',
- 'namespace',
- 'where',
- 'select',
- 'struct',
- 'union',
- 'new',
- 'delete',
- 'this',
- 'super',
- 'base',
- 'class',
- 'interface',
- 'abstract',
- 'static',
- 'public',
- 'private',
- 'protected',
- 'virtual',
- 'partial',
- 'override',
- 'extends',
- 'implements',
- 'constructor'
-];
-
-const keywords = _keywords
- .concat(_keywords.map(k => k[0].toUpperCase() + k.substr(1)))
- .concat(_keywords.map(k => k.toUpperCase()))
- .sort((a, b) => b.length - a.length);
-
-const symbols = [
- '=',
- '+',
- '-',
- '*',
- '/',
- '%',
- '~',
- '^',
- '&',
- '|',
- '>',
- '<',
- '!',
- '?'
-];
-
-const elements = [
- // comment
- code => {
- if (code.substr(0, 2) != '//') return null;
- const match = code.match(/^\/\/(.+?)\n/);
- if (!match) return null;
- const comment = match[0];
- return {
- html: `<span class="comment">${escape(comment)}</span>`,
- next: comment.length
- };
- },
-
- // block comment
- code => {
- const match = code.match(/^\/\*([\s\S]+?)\*\//);
- if (!match) return null;
- return {
- html: `<span class="comment">${escape(match[0])}</span>`,
- next: match[0].length
- };
- },
-
- // string
- code => {
- if (!/^['"`]/.test(code)) return null;
- const begin = code[0];
- let str = begin;
- let thisIsNotAString = false;
- for (let i = 1; i < code.length; i++) {
- const char = code[i];
- if (char == '\\') {
- str += char;
- str += code[i + 1] || '';
- i++;
- continue;
- } else if (char == begin) {
- str += char;
- break;
- } else if (char == '\n' || i == (code.length - 1)) {
- thisIsNotAString = true;
- break;
- } else {
- str += char;
- }
- }
- if (thisIsNotAString) {
- return null;
- } else {
- return {
- html: `<span class="string">${escape(str)}</span>`,
- next: str.length
- };
- }
- },
-
- // regexp
- code => {
- if (code[0] != '/') return null;
- let regexp = '';
- let thisIsNotARegexp = false;
- for (let i = 1; i < code.length; i++) {
- const char = code[i];
- if (char == '\\') {
- regexp += char;
- regexp += code[i + 1] || '';
- i++;
- continue;
- } else if (char == '/') {
- break;
- } else if (char == '\n' || i == (code.length - 1)) {
- thisIsNotARegexp = true;
- break;
- } else {
- regexp += char;
- }
- }
-
- if (thisIsNotARegexp) return null;
- if (regexp == '') return null;
- if (regexp[0] == ' ' && regexp[regexp.length - 1] == ' ') return null;
-
- return {
- html: `<span class="regexp">/${escape(regexp)}/</span>`,
- next: regexp.length + 2
- };
- },
-
- // label
- code => {
- if (code[0] != '@') return null;
- const match = code.match(/^@([a-zA-Z_-]+?)\n/);
- if (!match) return null;
- const label = match[0];
- return {
- html: `<span class="label">${label}</span>`,
- next: label.length
- };
- },
-
- // number
- (code, i, source) => {
- const prev = source[i - 1];
- if (prev && /[a-zA-Z]/.test(prev)) return null;
- if (!/^[\-\+]?[0-9\.]+/.test(code)) return null;
- const match = code.match(/^[\-\+]?[0-9\.]+/)[0];
- if (match) {
- return {
- html: `<span class="number">${match}</span>`,
- next: match.length
- };
- } else {
- return null;
- }
- },
-
- // nan
- (code, i, source) => {
- const prev = source[i - 1];
- if (prev && /[a-zA-Z]/.test(prev)) return null;
- if (code.substr(0, 3) == 'NaN') {
- return {
- html: `<span class="nan">NaN</span>`,
- next: 3
- };
- } else {
- return null;
- }
- },
-
- // method
- code => {
- const match = code.match(/^([a-zA-Z_-]+?)\(/);
- if (!match) return null;
-
- if (match[1] == '-') return null;
-
- return {
- html: `<span class="method">${match[1]}</span>`,
- next: match[1].length
- };
- },
-
- // property
- (code, i, source) => {
- const prev = source[i - 1];
- if (prev != '.') return null;
-
- const match = code.match(/^[a-zA-Z0-9_-]+/);
- if (!match) return null;
-
- return {
- html: `<span class="property">${match[0]}</span>`,
- next: match[0].length
- };
- },
-
- // keyword
- (code, i, source) => {
- const prev = source[i - 1];
- if (prev && /[a-zA-Z]/.test(prev)) return null;
-
- const match = keywords.filter(k => code.substr(0, k.length) == k)[0];
- if (match) {
- if (/^[a-zA-Z]/.test(code.substr(match.length))) return null;
- return {
- html: `<span class="keyword ${match}">${match}</span>`,
- next: match.length
- };
- } else {
- return null;
- }
- },
-
- // symbol
- code => {
- const match = symbols.filter(s => code[0] == s)[0];
- if (match) {
- return {
- html: `<span class="symbol">${match}</span>`,
- next: 1
- };
- } else {
- return null;
- }
- }
-];
-
-// specify lang is todo
-module.exports = (source, lang) => {
- let code = source;
- let html = '';
-
- let i = 0;
-
- function push(token) {
- html += token.html;
- code = code.substr(token.next);
- i += token.next;
- }
-
- while (code != '') {
- const parsed = elements.some(el => {
- const e = el(code, i, source);
- if (e) {
- push(e);
- return true;
- }
- });
-
- if (!parsed) {
- push({
- html: escape(code[0]),
- next: 1
- });
- }
- }
-
- return html;
-};
diff --git a/src/common/text/elements/bold.js b/src/common/text/elements/bold.js
deleted file mode 100644
index ce25764457..0000000000
--- a/src/common/text/elements/bold.js
+++ /dev/null
@@ -1,14 +0,0 @@
-/**
- * Bold
- */
-
-module.exports = text => {
- const match = text.match(/^\*\*(.+?)\*\*/);
- if (!match) return null;
- const bold = match[0];
- return {
- type: 'bold',
- content: bold,
- bold: bold.substr(2, bold.length - 4)
- };
-};
diff --git a/src/common/text/elements/code.js b/src/common/text/elements/code.js
deleted file mode 100644
index 99fe6a183c..0000000000
--- a/src/common/text/elements/code.js
+++ /dev/null
@@ -1,17 +0,0 @@
-/**
- * Code (block)
- */
-
-const genHtml = require('../core/syntax-highlighter');
-
-module.exports = text => {
- const match = text.match(/^```([\s\S]+?)```/);
- if (!match) return null;
- const code = match[0];
- return {
- type: 'code',
- content: code,
- code: code.substr(3, code.length - 6).trim(),
- html: genHtml(code.substr(3, code.length - 6).trim())
- };
-};
diff --git a/src/common/text/elements/emoji.js b/src/common/text/elements/emoji.js
deleted file mode 100644
index e24231a223..0000000000
--- a/src/common/text/elements/emoji.js
+++ /dev/null
@@ -1,14 +0,0 @@
-/**
- * Emoji
- */
-
-module.exports = text => {
- const match = text.match(/^:[a-zA-Z0-9+-_]+:/);
- if (!match) return null;
- const emoji = match[0];
- return {
- type: 'emoji',
- content: emoji,
- emoji: emoji.substr(1, emoji.length - 2)
- };
-};
diff --git a/src/common/text/elements/hashtag.js b/src/common/text/elements/hashtag.js
deleted file mode 100644
index 048dbd8929..0000000000
--- a/src/common/text/elements/hashtag.js
+++ /dev/null
@@ -1,19 +0,0 @@
-/**
- * Hashtag
- */
-
-module.exports = (text, i) => {
- if (!(/^\s#[^\s]+/.test(text) || (i == 0 && /^#[^\s]+/.test(text)))) return null;
- const isHead = text[0] == '#';
- const hashtag = text.match(/^\s?#[^\s]+/)[0];
- const res = !isHead ? [{
- type: 'text',
- content: text[0]
- }] : [];
- res.push({
- type: 'hashtag',
- content: isHead ? hashtag : hashtag.substr(1),
- hashtag: isHead ? hashtag.substr(1) : hashtag.substr(2)
- });
- return res;
-};
diff --git a/src/common/text/elements/inline-code.js b/src/common/text/elements/inline-code.js
deleted file mode 100644
index 37e9b1a0ff..0000000000
--- a/src/common/text/elements/inline-code.js
+++ /dev/null
@@ -1,17 +0,0 @@
-/**
- * Code (inline)
- */
-
-const genHtml = require('../core/syntax-highlighter');
-
-module.exports = text => {
- const match = text.match(/^`(.+?)`/);
- if (!match) return null;
- const code = match[0];
- return {
- type: 'inline-code',
- content: code,
- code: code.substr(1, code.length - 2).trim(),
- html: genHtml(code.substr(1, code.length - 2).trim())
- };
-};
diff --git a/src/common/text/elements/link.js b/src/common/text/elements/link.js
deleted file mode 100644
index 35563ddc3d..0000000000
--- a/src/common/text/elements/link.js
+++ /dev/null
@@ -1,19 +0,0 @@
-/**
- * Link
- */
-
-module.exports = text => {
- const match = text.match(/^\??\[([^\[\]]+?)\]\((https?:\/\/[\w\/:%#@\$&\?!\(\)\[\]~\.=\+\-]+?)\)/);
- if (!match) return null;
- const silent = text[0] == '?';
- const link = match[0];
- const title = match[1];
- const url = match[2];
- return {
- type: 'link',
- content: link,
- title: title,
- url: url,
- silent: silent
- };
-};
diff --git a/src/common/text/elements/mention.js b/src/common/text/elements/mention.js
deleted file mode 100644
index e0fac4dd76..0000000000
--- a/src/common/text/elements/mention.js
+++ /dev/null
@@ -1,14 +0,0 @@
-/**
- * Mention
- */
-
-module.exports = text => {
- const match = text.match(/^@[a-zA-Z0-9\-]+/);
- if (!match) return null;
- const mention = match[0];
- return {
- type: 'mention',
- content: mention,
- username: mention.substr(1)
- };
-};
diff --git a/src/common/text/elements/url.js b/src/common/text/elements/url.js
deleted file mode 100644
index 1003aff9c3..0000000000
--- a/src/common/text/elements/url.js
+++ /dev/null
@@ -1,14 +0,0 @@
-/**
- * URL
- */
-
-module.exports = text => {
- const match = text.match(/^https?:\/\/[\w\/:%#@\$&\?!\(\)\[\]~\.=\+\-]+/);
- if (!match) return null;
- const url = match[0];
- return {
- type: 'url',
- content: url,
- url: url
- };
-};
diff --git a/src/common/text/index.js b/src/common/text/index.js
deleted file mode 100644
index ab1342230c..0000000000
--- a/src/common/text/index.js
+++ /dev/null
@@ -1,71 +0,0 @@
-/**
- * Misskey Text Analyzer
- */
-
-const elements = [
- require('./elements/bold'),
- require('./elements/url'),
- require('./elements/link'),
- require('./elements/mention'),
- require('./elements/hashtag'),
- require('./elements/code'),
- require('./elements/inline-code'),
- require('./elements/emoji')
-];
-
-function analyze(source) {
-
- if (source == '') {
- return null;
- }
-
- const tokens = [];
-
- function push(token) {
- if (token != null) {
- tokens.push(token);
- source = source.substr(token.content.length);
- }
- }
-
- let i = 0;
-
- // パース
- while (source != '') {
- const parsed = elements.some(el => {
- let tokens = el(source, i);
- if (tokens) {
- if (!Array.isArray(tokens)) {
- tokens = [tokens];
- }
- tokens.forEach(push);
- return true;
- }
- });
-
- if (!parsed) {
- push({
- type: 'text',
- content: source[0]
- });
- }
-
- i++;
- }
-
- // テキストを纏める
- tokens[0] = [tokens[0]];
- return tokens.reduce((a, b) => {
- if (a[a.length - 1].type == 'text' && b.type == 'text') {
- const tail = a.pop();
- return a.concat({
- type: 'text',
- content: tail.content + b.content
- });
- } else {
- return a.concat(b);
- }
- });
-}
-
-module.exports = analyze;