aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorbob <bcz@cs.brown.edu>2019-12-09 10:16:55 -0500
committerbob <bcz@cs.brown.edu>2019-12-09 10:16:55 -0500
commite5ca273b70c2c41f953ad2a534afabdb313f3e99 (patch)
tree05a92122a5bac7dabe8cf8171a64b94fae0bbf8d /src
parentfef12d4ca96d35c230a3a5e7c053b9b90eb38243 (diff)
changed styles to allow multi-character names using %. switched default "styles" of todo, ignore, etc to use % style notation
Diffstat (limited to 'src')
-rw-r--r--src/client/util/RichTextRules.ts25
-rw-r--r--src/client/util/RichTextSchema.tsx1
-rw-r--r--src/client/views/nodes/FormattedTextBox.tsx13
3 files changed, 30 insertions, 9 deletions
diff --git a/src/client/util/RichTextRules.ts b/src/client/util/RichTextRules.ts
index cd4bfdc63..c9414fb0b 100644
--- a/src/client/util/RichTextRules.ts
+++ b/src/client/util/RichTextRules.ts
@@ -73,18 +73,23 @@ export const inpRules = {
return state.tr.deleteRange(start, end).addStoredMark(schema.marks.pFontSize.create({ fontSize: size }));
}),
new InputRule(
- new RegExp(/%[a-z]*\s$/),
+ new RegExp(/%[a-z]+$/),
(state, match, start, end) => {
- const color = match[0].substring(1, match[0].length - 1);
+ const color = match[0].substring(1, match[0].length);
let marks = TooltipTextMenuManager.Instance._brushMap.get(color);
if (marks) {
let tr = state.tr.deleteRange(start, end);
return marks ? Array.from(marks).reduce((tr, m) => tr.addStoredMark(m), tr) : tr;
}
- if (color) {
+ let isValidColor = (strColor: string) => {
+ var s = new Option().style;
+ s.color = strColor;
+ return s.color == strColor.toLowerCase(); // 'false' if color wasn't assigned
+ }
+ if (isValidColor(color)) {
return state.tr.deleteRange(start, end).addStoredMark(schema.marks.pFontColor.create({ color: color }));
}
- return state.tr.deleteRange(start, end);
+ return null;
}),
new InputRule(
new RegExp(/%%$/),
@@ -96,29 +101,33 @@ export const inpRules = {
new InputRule(
new RegExp(/t$/),
(state, match, start, end) => {
- if (state.selection.to === state.selection.from) return null;
+ if (state.selection.to === state.selection.from && !(state as any).EnteringStyle) return null;
const node = (state.doc.resolve(start) as any).nodeAfter;
+ if (node?.marks.findIndex((m: any) => m.type === schema.marks.user_tag) !== -1) return state.tr.removeMark(start, end, schema.marks.user_tag);
return node ? state.tr.addMark(start, end, schema.marks.user_tag.create({ userid: Doc.CurrentUserEmail, tag: "todo", modified: Math.round(Date.now() / 1000 / 60) })) : state.tr;
}),
new InputRule(
new RegExp(/i$/),
(state, match, start, end) => {
- if (state.selection.to === state.selection.from) return null;
+ if (state.selection.to === state.selection.from && !(state as any).EnteringStyle) return null;
const node = (state.doc.resolve(start) as any).nodeAfter;
+ if (node?.marks.findIndex((m: any) => m.type === schema.marks.user_tag) !== -1) return state.tr.removeMark(start, end, schema.marks.user_tag);
return node ? state.tr.addMark(start, end, schema.marks.user_tag.create({ userid: Doc.CurrentUserEmail, tag: "ignore", modified: Math.round(Date.now() / 1000 / 60) })) : state.tr;
}),
new InputRule(
new RegExp(/!$/),
(state, match, start, end) => {
- if (state.selection.to === state.selection.from) return null;
+ if (state.selection.to === state.selection.from && !(state as any).EnteringStyle) return null;
const node = (state.doc.resolve(start) as any).nodeAfter;
+ if (node?.marks.findIndex((m: any) => m.type === schema.marks.user_tag) !== -1) return state.tr.removeMark(start, end, schema.marks.user_tag);
return node ? state.tr.addMark(start, end, schema.marks.user_tag.create({ userid: Doc.CurrentUserEmail, tag: "important", modified: Math.round(Date.now() / 1000 / 60) })) : state.tr;
}),
new InputRule(
new RegExp(/x$/),
(state, match, start, end) => {
- if (state.selection.to === state.selection.from) return null;
+ if (state.selection.to === state.selection.from && !(state as any).EnteringStyle) return null;
const node = (state.doc.resolve(start) as any).nodeAfter;
+ if (node?.marks.findIndex((m: any) => m.type === schema.marks.user_tag) !== -1) return state.tr.removeMark(start, end, schema.marks.user_tag);
return node ? state.tr.addMark(start, end, schema.marks.user_tag.create({ userid: Doc.CurrentUserEmail, tag: "disagree", modified: Math.round(Date.now() / 1000 / 60) })) : state.tr;
}),
new InputRule(
diff --git a/src/client/util/RichTextSchema.tsx b/src/client/util/RichTextSchema.tsx
index 8c74c3f68..2102ea85b 100644
--- a/src/client/util/RichTextSchema.tsx
+++ b/src/client/util/RichTextSchema.tsx
@@ -514,6 +514,7 @@ export const marks: { [index: string]: MarkSpec } = {
tag: { default: "" }
},
group: "inline",
+ inclusive: false,
toDOM(node: any) {
const uid = node.attrs.userid.replace(".", "").replace("@", "");
return node.attrs.opened ?
diff --git a/src/client/views/nodes/FormattedTextBox.tsx b/src/client/views/nodes/FormattedTextBox.tsx
index 3302d2e54..11fececd7 100644
--- a/src/client/views/nodes/FormattedTextBox.tsx
+++ b/src/client/views/nodes/FormattedTextBox.tsx
@@ -351,7 +351,7 @@ export class FormattedTextBox extends DocAnnotatableComponent<(FieldViewProps &
addStyleSheetRule(FormattedTextBox._userStyleSheet, "userTag-" + "disagree", { "text-decoration": "line-through" });
}
if (FormattedTextBox._highlights.indexOf("Ignore Items") !== -1) {
- addStyleSheetRule(FormattedTextBox._userStyleSheet, "userTag-" + "ignore", { "font-size": "0" });
+ addStyleSheetRule(FormattedTextBox._userStyleSheet, "userTag-" + "ignore", { "font-size": "1" });
}
if (FormattedTextBox._highlights.indexOf("By Recent Minute") !== -1) {
addStyleSheetRule(FormattedTextBox._userStyleSheet, "userMark-" + Doc.CurrentUserEmail.replace(".", "").replace("@", ""), { opacity: "0.1" });
@@ -1040,7 +1040,18 @@ export class FormattedTextBox extends DocAnnotatableComponent<(FieldViewProps &
}
this.doLinkOnDeselect();
}
+
onKeyPress = (e: React.KeyboardEvent) => {
+ if (!this._editorView!.state.selection.empty && e.key === "%") {
+ (this._editorView!.state as any).EnteringStyle = true;
+ e.preventDefault();
+ e.stopPropagation();
+ return;
+ }
+
+ if (this._editorView!.state.selection.empty || !(this._editorView!.state as any).EnteringStyle) {
+ (this._editorView!.state as any).EnteringStyle = false;
+ }
if (e.key === "Escape") {
SelectionManager.DeselectAll();
}