diff --git a/src/components/ContextMenu/DropdownMenu.js b/src/components/ContextMenu/DropdownMenu.js index cb249f03..f2855473 100644 --- a/src/components/ContextMenu/DropdownMenu.js +++ b/src/components/ContextMenu/DropdownMenu.js @@ -134,6 +134,12 @@ export const DropdownMenu = ({ {selEnabled && ( + + {i18n("cmenu_addToBlacklist")} + + + {i18n("cmenu_removeFromBlacklist")} + {i18n("cmenu_quickSearch")}{" "} diff --git a/src/components/ContextMenu/PrefModal.js b/src/components/ContextMenu/PrefModal.js index 711d61cc..ffec9204 100644 --- a/src/components/ContextMenu/PrefModal.js +++ b/src/components/ContextMenu/PrefModal.js @@ -46,7 +46,10 @@ const DEFAULT_PREFS = { fontSize: 20, termSize: { cols: 80, rows: 24 }, termSizeMode: "fixed-term-size", - bbsMargin: 0 + bbsMargin: 0, + + // blacklist + blacklist: [] }; const PREF_STORAGE_KEY = "pttchrome.pref.v1"; @@ -64,7 +67,7 @@ export const readValuesWithDefault = () => { } }; -const writeValues = values => { +export const writeValues = values => { try { window.localStorage.setItem( PREF_STORAGE_KEY, diff --git a/src/components/ContextMenu/index.js b/src/components/ContextMenu/index.js index ffbc1934..64fe9222 100644 --- a/src/components/ContextMenu/index.js +++ b/src/components/ContextMenu/index.js @@ -23,6 +23,10 @@ const menuHandlerByEventKey = { copy: (pttchrome, { selectedText }) => pttchrome.doCopy(selectedText), copyAnsi: pttchrome => pttchrome.doCopyAnsi(), paste: pttchrome => pttchrome.doPaste(), + addToBlacklist: (pttchrome, { selectedText }) => + pttchrome.doAddToBlacklist(selectedText), + removeFromBlacklist: (pttchrome, { selectedText }) => + pttchrome.doRemoveFromBlacklist(selectedText), searchGoogle: (pttchrome, { selectedText }) => pttchrome.doSearchGoogle(selectedText), openUrlNewTab: (pttchrome, { aElement }) => diff --git a/src/js/en_US_messages.js b/src/js/en_US_messages.js index f1336726..b2fc8edd 100644 --- a/src/js/en_US_messages.js +++ b/src/js/en_US_messages.js @@ -41,6 +41,12 @@ export const en_US = { "cmenu_selectAll": { "message": "Select all" }, + "cmenu_addToBlacklist": { + "message": "Add ID to blacklist" + }, + "cmenu_removeFromBlacklist": { + "message": "Remove ID from blacklist" + }, "cmenu_searchGoogle": { "message": "Search Google for" }, diff --git a/src/js/pttchrome.js b/src/js/pttchrome.js index c4329bb3..11565975 100644 --- a/src/js/pttchrome.js +++ b/src/js/pttchrome.js @@ -14,6 +14,7 @@ import { setTimer } from './util'; import PasteShortcutAlert from '../components/PasteShortcutAlert'; import ConnectionAlert from '../components/ConnectionAlert'; import ContextMenu from '../components/ContextMenu'; +import { readValuesWithDefault, writeValues } from "../components/ContextMenu/PrefModal"; function noop() {} @@ -352,6 +353,20 @@ App.prototype.switchToEasyReadingMode = function(doSwitch) { this.view.conn.send(unescapeStr('^L')); }; +App.prototype.doAddToBlacklist = function(str) { + const values = readValuesWithDefault() + values.blacklist = [...new Set([...values.blacklist, str.trim()])]; + writeValues(values); + console.log('add to blacklist', str); +}; + +App.prototype.doRemoveFromBlacklist = function(str) { + const values = readValuesWithDefault() + values.blacklist = values.blacklist.filter((user) => user !== str.trim()); + writeValues(values); + console.log('remove from blacklist', str); +}; + App.prototype.doCopy = function(str) { if (str.indexOf('\x1b') < 0) { str = str.replace(/\r\n/g, '\r'); diff --git a/src/js/term_buf.js b/src/js/term_buf.js index 445e80d0..a9ec6efb 100644 --- a/src/js/term_buf.js +++ b/src/js/term_buf.js @@ -3,6 +3,7 @@ import { Event } from './event'; import { ColorState } from './term_ui'; import { u2b, b2u, parseStatusRow, parseListRow } from './string_util'; +import { readValuesWithDefault } from '../components/ContextMenu/PrefModal'; const termColors = [ // dark @@ -360,6 +361,41 @@ TermBuf.prototype = { this.queueUpdate(); }, + + filterBlacklist: function() { + const { blacklist } = readValuesWithDefault(); + + var cols = this.cols; + var rows = this.rows; + var lines = this.lines; + for (var row = 0; row < rows; ++row) { + var line = lines[row]; + // search comment blacklist + if (line[2].ch === ' ') { + const idText = line + .filter((ch) => ch.bg === 0 && ch.fg === 3 && ch.bright) + .map((ch) => ch.ch).join('').trim(); + + if (!idText) continue; + if (blacklist.includes(idText)) { + for (var col = 0; col < cols; ++col) { + const ch = line[col]; + // set id to red + if (ch.bg === 0 && ch.fg === 3 && ch.bright) { + ch.fg = 1; + ch.needUpdate = true; + } + // set text to ' ' + if (ch.bg === 0 && ch.fg === 3 && !ch.bright) { + ch.ch = ' '; + ch.needUpdate = true; + } + } + } + } + } + }, + updateCharAttr: function() { var cols = this.cols; var rows = this.rows; @@ -787,6 +823,8 @@ TermBuf.prototype = { clearTimeout(this.timerUpdate); this.timerUpdate = null; + this.filterBlacklist(); + if (this.changed) { // content changed this.updateCharAttr(); diff --git a/src/js/zh_TW_messages.js b/src/js/zh_TW_messages.js index b4a3d301..7e430c9d 100644 --- a/src/js/zh_TW_messages.js +++ b/src/js/zh_TW_messages.js @@ -38,6 +38,12 @@ "cmenu_paste": { "message": "貼上" }, + "cmenu_addToBlacklist": { + "message": "ID 加到黑名單" + }, + "cmenu_removeFromBlacklist": { + "message": "從黑名單移除 ID" + }, "cmenu_selectAll": { "message": "全選" },