UNPKG

ngx-editor

Version:

Rich Text Editor for angular using ProseMirror

117 lines 18.3 kB
import { keymap } from 'prosemirror-keymap'; import { toggleMark, baseKeymap, chainCommands, exitCode } from 'prosemirror-commands'; import { splitListItem, liftListItem, sinkListItem } from 'prosemirror-schema-list'; import { history, undo, redo } from 'prosemirror-history'; import { inputRules, wrappingInputRule, textblockTypeInputRule, smartQuotes, emDash, ellipsis, } from 'prosemirror-inputrules'; import { markInputRule } from 'ngx-editor/helpers'; const isMacOs = typeof navigator !== 'undefined' ? (/Mac/).test(navigator.platform) : false; // Input rules ref: https://github.com/ProseMirror/prosemirror-example-setup/ // : (NodeType) → InputRule // Given a blockquote node type, returns an input rule that turns `"> "` // at the start of a textblock into a blockquote. const blockQuoteRule = (nodeType) => { return wrappingInputRule(/^\s*>\s$/, nodeType); }; // : (NodeType) → InputRule // Given a list node type, returns an input rule that turns a number // followed by a dot at the start of a textblock into an ordered list. const orderedListRule = (nodeType) => { return wrappingInputRule(/^(?:\d+)\.\s$/, nodeType, (match) => ({ order: Number(match[1]) }), (match, node) => node.childCount + node.attrs['order'] === Number(match[1])); }; // : (NodeType) → InputRule // Given a list node type, returns an input rule that turns a bullet // (dash, plush, or asterisk) at the start of a textblock into a // bullet list. const bulletListRule = (nodeType) => { return wrappingInputRule(/^\s*(?:[-+*])\s$/, nodeType); }; // : (NodeType) → InputRule // Given a code block node type, returns an input rule that turns a // textblock starting with three backticks into a code block. const codeBlockRule = (nodeType) => { return textblockTypeInputRule(/^```$/, nodeType); }; // : (NodeType, number) → InputRule // Given a node type and a maximum level, creates an input rule that // turns up to that number of `#` characters followed by a space at // the start of a textblock into a heading whose level corresponds to // the number of `#` signs. const headingRule = (nodeType, maxLevel) => { return textblockTypeInputRule(new RegExp(`^(#{1,${maxLevel}})\\s$`), nodeType, (match) => ({ level: match[1].length })); }; // : (MarkType) → InputRule // Wraps matching text with bold mark const boldRule = (markType) => { return markInputRule(/(?:^|\s)(?:(?:\*\*|__)(?:(?:[^*_]+))(?:\*\*|__))$/, markType); }; // : (MarkType) → InputRule // Wraps matching text with em mark const emRule = (markType) => { return markInputRule(/(?:^|\s)(?:(?:\*|_)(?:(?:[^*_]+))(?:\*|_))$/, markType); }; // : (Schema) → Plugin // A set of input rules for creating the basic block quotes, lists, // code blocks, and heading. const buildInputRules = (schema) => { const rules = smartQuotes.concat(ellipsis, emDash); rules.push(boldRule(schema.marks['strong'])); rules.push(emRule(schema.marks['em'])); rules.push(blockQuoteRule(schema.nodes['blockquote'])); rules.push(orderedListRule(schema.nodes['ordered_list'])); rules.push(bulletListRule(schema.nodes['bullet_list'])); rules.push(codeBlockRule(schema.nodes['code_block'])); rules.push(headingRule(schema.nodes['heading'], 6)); return inputRules({ rules }); }; const getKeyboardShortcuts = (schema, options) => { const historyKeyMap = {}; historyKeyMap['Mod-z'] = undo; if (isMacOs) { historyKeyMap['Shift-Mod-z'] = redo; } else { historyKeyMap['Mod-y'] = redo; } const plugins = [ keymap({ 'Mod-b': toggleMark(schema.marks['strong']), 'Mod-i': toggleMark(schema.marks['em']), 'Mod-u': toggleMark(schema.marks['u']), 'Mod-`': toggleMark(schema.marks['code']), }), keymap({ 'Enter': splitListItem(schema.nodes['list_item']), 'Shift-Enter': chainCommands(exitCode, (state, dispatch) => { const { tr } = state; const br = schema.nodes['hard_break']; dispatch(tr.replaceSelectionWith(br.create()).scrollIntoView()); return true; }), 'Mod-[': liftListItem(schema.nodes['list_item']), 'Mod-]': sinkListItem(schema.nodes['list_item']), 'Tab': sinkListItem(schema.nodes['list_item']), }), keymap(baseKeymap), ]; if (options.history) { plugins.push(keymap(historyKeyMap)); } return plugins; }; const getDefaultPlugins = (schema, options) => { const plugins = []; if (options.keyboardShortcuts) { plugins.push(...getKeyboardShortcuts(schema, { history: options.history })); } if (options.history) { plugins.push(history()); } if (options.inputRules) { plugins.push(buildInputRules(schema)); } return plugins; }; export default getDefaultPlugins; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdFBsdWdpbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZWRpdG9yL3NyYy9saWIvZGVmYXVsdFBsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN2RixPQUFPLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNwRixPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMxRCxPQUFPLEVBQ0wsVUFBVSxFQUFFLGlCQUFpQixFQUFFLHNCQUFzQixFQUNyRCxXQUFXLEVBQUUsTUFBTSxFQUFFLFFBQVEsR0FDOUIsTUFBTSx3QkFBd0IsQ0FBQztBQUVoQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFZbkQsTUFBTSxPQUFPLEdBQUcsT0FBTyxTQUFTLEtBQUssV0FBVztJQUM5QyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQztJQUNsQyxDQUFDLENBQUMsS0FBSyxDQUFDO0FBRVYsNkVBQTZFO0FBRTdFLDJCQUEyQjtBQUMzQix3RUFBd0U7QUFDeEUsaURBQWlEO0FBQ2pELE1BQU0sY0FBYyxHQUFHLENBQUMsUUFBa0IsRUFBYSxFQUFFO0lBQ3ZELE9BQU8saUJBQWlCLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ2pELENBQUMsQ0FBQztBQUVGLDJCQUEyQjtBQUMzQixvRUFBb0U7QUFDcEUsc0VBQXNFO0FBQ3RFLE1BQU0sZUFBZSxHQUFHLENBQUMsUUFBa0IsRUFBYSxF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SUFFRCxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDLENBQUM7QUFFRixlQUFlLGlCQUFpQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTWFya1R5cGUsIE5vZGVUeXBlLCBTY2hlbWEgfSBmcm9tICdwcm9zZW1pcnJvci1tb2RlbCc7XG5pbXBvcnQgeyBQbHVnaW4gfSBmcm9tICdwcm9zZW1pcnJvci1zdGF0ZSc7XG5pbXBvcnQgeyBrZXltYXAgfSBmcm9tICdwcm9zZW1pcnJvci1rZXltYXAnO1xuaW1wb3J0IHsgdG9nZ2xlTWFyaywgYmFzZUtleW1hcCwgY2hhaW5Db21tYW5kcywgZXhpdENvZGUgfSBmcm9tICdwcm9zZW1pcnJvci1jb21tYW5kcyc7XG5pbXBvcnQgeyBzcGxpdExpc3RJdGVtLCBsaWZ0TGlzdEl0ZW0sIHNpbmtMaXN0SXRlbSB9IGZyb20gJ3Byb3NlbWlycm9yLXNjaGVtYS1saXN0JztcbmltcG9ydCB7IGhpc3RvcnksIHVuZG8sIHJlZG8gfSBmcm9tICdwcm9zZW1pcnJvci1oaXN0b3J5JztcbmltcG9ydCB7XG4gIGlucHV0UnVsZXMsIHdyYXBwaW5nSW5wdXRSdWxlLCB0ZXh0YmxvY2tUeXBlSW5wdXRSdWxlLFxuICBzbWFydFF1b3RlcywgZW1EYXNoLCBlbGxpcHNpcywgSW5wdXRSdWxlLFxufSBmcm9tICdwcm9zZW1pcnJvci1pbnB1dHJ1bGVzJztcblxuaW1wb3J0IHsgbWFya0lucHV0UnVsZSB9IGZyb20gJ25neC1lZGl0b3IvaGVscGVycyc7XG5cbmludGVyZmFjZSBPcHRpb25zIHtcbiAgaGlzdG9yeTogYm9vbGVhbjtcbiAga2V5Ym9hcmRTaG9ydGN1dHM6IGJvb2xlYW47XG4gIGlucHV0UnVsZXM6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBTaG9ydGN1dE9wdGlvbnMge1xuICBoaXN0b3J5OiBib29sZWFuO1xufVxuXG5jb25zdCBpc01hY09zID0gdHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCdcbiAgPyAoL01hYy8pLnRlc3QobmF2aWdhdG9yLnBsYXRmb3JtKVxuICA6IGZhbHNlO1xuXG4vLyBJbnB1dCBydWxlcyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9Qcm9zZU1pcnJvci9wcm9zZW1pcnJvci1leGFtcGxlLXNldHVwL1xuXG4vLyA6IChOb2RlVHlwZSkg4oaSIElucHV0UnVsZVxuLy8gR2l2ZW4gYSBibG9ja3F1b3RlIG5vZGUgdHlwZSwgcmV0dXJucyBhbiBpbnB1dCBydWxlIHRoYXQgdHVybnMgYFwiPiBcImBcbi8vIGF0IHRoZSBzdGFydCBvZiBhIHRleHRibG9jayBpbnRvIGEgYmxvY2txdW90ZS5cbmNvbnN0IGJsb2NrUXVvdGVSdWxlID0gKG5vZGVUeXBlOiBOb2RlVHlwZSk6IElucHV0UnVsZSA9PiB7XG4gIHJldHVybiB3cmFwcGluZ0lucHV0UnVsZSgvXlxccyo+XFxzJC8sIG5vZGVUeXBlKTtcbn07XG5cbi8vIDogKE5vZGVUeXBlKSDihpIgSW5wdXRSdWxlXG4vLyBHaXZlbiBhIGxpc3Qgbm9kZSB0eXBlLCByZXR1cm5zIGFuIGlucHV0IHJ1bGUgdGhhdCB0dXJucyBhIG51bWJlclxuLy8gZm9sbG93ZWQgYnkgYSBkb3QgYXQgdGhlIHN0YXJ0IG9mIGEgdGV4dGJsb2NrIGludG8gYW4gb3JkZXJlZCBsaXN0LlxuY29uc3Qgb3JkZXJlZExpc3RSdWxlID0gKG5vZGVUeXBlOiBOb2RlVHlwZSk6IElucHV0UnVsZSA9PiB7XG4gIHJldHVybiB3cmFwcGluZ0lucHV0UnVsZShcbiAgICAvXig/OlxcZCspXFwuXFxzJC8sXG4gICAgbm9kZVR5cGUsXG4gICAgKG1hdGNoKSA9PiAoeyBvcmRlcjogTnVtYmVyKG1hdGNoWzFdKSB9KSxcbiAgICAobWF0Y2gsIG5vZGUpID0+IG5vZGUuY2hpbGRDb3VudCArIG5vZGUuYXR0cnNbJ29yZGVyJ10gPT09IE51bWJlcihtYXRjaFsxXSksXG4gICk7XG59O1xuXG4vLyA6IChOb2RlVHlwZSkg4oaSIElucHV0UnVsZVxuLy8gR2l2ZW4gYSBsaXN0IG5vZGUgdHlwZSwgcmV0dXJucyBhbiBpbnB1dCBydWxlIHRoYXQgdHVybnMgYSBidWxsZXRcbi8vIChkYXNoLCBwbHVzaCwgb3IgYXN0ZXJpc2spIGF0IHRoZSBzdGFydCBvZiBhIHRleHRibG9jayBpbnRvIGFcbi8vIGJ1bGxldCBsaXN0LlxuY29uc3QgYnVsbGV0TGlzdFJ1bGUgPSAobm9kZVR5cGU6IE5vZGVUeXBlKTogSW5wdXRSdWxlID0+IHtcbiAgcmV0dXJuIHdyYXBwaW5nSW5wdXRSdWxlKC9eXFxzKig/OlstKypdKVxccyQvLCBub2RlVHlwZSk7XG59O1xuXG4vLyA6IChOb2RlVHlwZSkg4oaSIElucHV0UnVsZVxuLy8gR2l2ZW4gYSBjb2RlIGJsb2NrIG5vZGUgdHlwZSwgcmV0dXJucyBhbiBpbnB1dCBydWxlIHRoYXQgdHVybnMgYVxuLy8gdGV4dGJsb2NrIHN0YXJ0aW5nIHdpdGggdGhyZWUgYmFja3RpY2tzIGludG8gYSBjb2RlIGJsb2NrLlxuY29uc3QgY29kZUJsb2NrUnVsZSA9IChub2RlVHlwZTogTm9kZVR5cGUpOiBJbnB1dFJ1bGUgPT4ge1xuICByZXR1cm4gdGV4dGJsb2NrVHlwZUlucHV0UnVsZSgvXmBgYCQvLCBub2RlVHlwZSk7XG59O1xuXG4vLyA6IChOb2RlVHlwZSwgbnVtYmVyKSDihpIgSW5wdXRSdWxlXG4vLyBHaXZlbiBhIG5vZGUgdHlwZSBhbmQgYSBtYXhpbXVtIGxldmVsLCBjcmVhdGVzIGFuIGlucHV0IHJ1bGUgdGhhdFxuLy8gdHVybnMgdXAgdG8gdGhhdCBudW1iZXIgb2YgYCNgIGNoYXJhY3RlcnMgZm9sbG93ZWQgYnkgYSBzcGFjZSBhdFxuLy8gdGhlIHN0YXJ0IG9mIGEgdGV4dGJsb2NrIGludG8gYSBoZWFkaW5nIHdob3NlIGxldmVsIGNvcnJlc3BvbmRzIHRvXG4vLyB0aGUgbnVtYmVyIG9mIGAjYCBzaWducy5cbmNvbnN0IGhlYWRpbmdSdWxlID0gKG5vZGVUeXBlOiBOb2RlVHlwZSwgbWF4TGV2ZWw6IG51bWJlcik6IElucHV0UnVsZSA9PiB7XG4gIHJldHVybiB0ZXh0YmxvY2tUeXBlSW5wdXRSdWxlKFxuICAgIG5ldyBSZWdFeHAoYF4oI3sxLCR7bWF4TGV2ZWx9fSlcXFxccyRgKSxcbiAgICBub2RlVHlwZSxcbiAgICAobWF0Y2gpID0+ICh7IGxldmVsOiBtYXRjaFsxXS5sZW5ndGggfSksXG4gICk7XG59O1xuXG4vLyA6IChNYXJrVHlwZSkg4oaSIElucHV0UnVsZVxuLy8gV3JhcHMgbWF0Y2hpbmcgdGV4dCB3aXRoIGJvbGQgbWFya1xuY29uc3QgYm9sZFJ1bGUgPSAobWFya1R5cGU6IE1hcmtUeXBlKTogSW5wdXRSdWxlID0+IHtcbiAgcmV0dXJuIG1hcmtJbnB1dFJ1bGUoLyg/Ol58XFxzKSg/Oig/OlxcKlxcKnxfXykoPzooPzpbXipfXSspKSg/OlxcKlxcKnxfXykpJC8sIG1hcmtUeXBlKTtcbn07XG5cbi8vIDogKE1hcmtUeXBlKSDihpIgSW5wdXRSdWxlXG4vLyBXcmFwcyBtYXRjaGluZyB0ZXh0IHdpdGggZW0gbWFya1xuY29uc3QgZW1SdWxlID0gKG1hcmtUeXBlOiBNYXJrVHlwZSk6IElucHV0UnVsZSA9PiB7XG4gIHJldHVybiBtYXJrSW5wdXRSdWxlKC8oPzpefFxccykoPzooPzpcXCp8XykoPzooPzpbXipfXSspKSg/OlxcKnxfKSkkLywgbWFya1R5cGUpO1xufTtcblxuLy8gOiAoU2NoZW1hKSDihpIgUGx1Z2luXG4vLyBBIHNldCBvZiBpbnB1dCBydWxlcyBmb3IgY3JlYXRpbmcgdGhlIGJhc2ljIGJsb2NrIHF1b3RlcywgbGlzdHMsXG4vLyBjb2RlIGJsb2NrcywgYW5kIGhlYWRpbmcuXG5jb25zdCBidWlsZElucHV0UnVsZXMgPSAoc2NoZW1hOiBTY2hlbWEpOiBQbHVnaW4gPT4ge1xuICBjb25zdCBydWxlcyA9IHNtYXJ0UXVvdGVzLmNvbmNhdChlbGxpcHNpcywgZW1EYXNoKTtcblxuICBydWxlcy5wdXNoKGJvbGRSdWxlKHNjaGVtYS5tYXJrc1snc3Ryb25nJ10pKTtcbiAgcnVsZXMucHVzaChlbVJ1bGUoc2NoZW1hLm1hcmtzWydlbSddKSk7XG4gIHJ1bGVzLnB1c2goYmxvY2tRdW90ZVJ1bGUoc2NoZW1hLm5vZGVzWydibG9ja3F1b3RlJ10pKTtcbiAgcnVsZXMucHVzaChvcmRlcmVkTGlzdFJ1bGUoc2NoZW1hLm5vZGVzWydvcmRlcmVkX2xpc3QnXSkpO1xuICBydWxlcy5wdXNoKGJ1bGxldExpc3RSdWxlKHNjaGVtYS5ub2Rlc1snYnVsbGV0X2xpc3QnXSkpO1xuICBydWxlcy5wdXNoKGNvZGVCbG9ja1J1bGUoc2NoZW1hLm5vZGVzWydjb2RlX2Jsb2NrJ10pKTtcbiAgcnVsZXMucHVzaChoZWFkaW5nUnVsZShzY2hlbWEubm9kZXNbJ2hlYWRpbmcnXSwgNikpO1xuXG4gIHJldHVybiBpbnB1dFJ1bGVzKHsgcnVsZXMgfSk7XG59O1xuXG5jb25zdCBnZXRLZXlib2FyZFNob3J0Y3V0cyA9IChzY2hlbWE6IFNjaGVtYSwgb3B0aW9uczogU2hvcnRjdXRPcHRpb25zKSA9PiB7XG4gIGNvbnN0IGhpc3RvcnlLZXlNYXA6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcblxuICBoaXN0b3J5S2V5TWFwWydNb2QteiddID0gdW5kbztcbiAgaWYgKGlzTWFjT3MpIHtcbiAgICBoaXN0b3J5S2V5TWFwWydTaGlmdC1Nb2QteiddID0gcmVkbztcbiAgfSBlbHNlIHtcbiAgICBoaXN0b3J5S2V5TWFwWydNb2QteSddID0gcmVkbztcbiAgfVxuXG4gIGNvbnN0IHBsdWdpbnMgPSBbXG4gICAga2V5bWFwKHtcbiAgICAgICdNb2QtYic6IHRvZ2dsZU1hcmsoc2NoZW1hLm1hcmtzWydzdHJvbmcnXSksXG4gICAgICAnTW9kLWknOiB0b2dnbGVNYXJrKHNjaGVtYS5tYXJrc1snZW0nXSksXG4gICAgICAnTW9kLXUnOiB0b2dnbGVNYXJrKHNjaGVtYS5tYXJrc1sndSddKSxcbiAgICAgICdNb2QtYCc6IHRvZ2dsZU1hcmsoc2NoZW1hLm1hcmtzWydjb2RlJ10pLFxuICAgIH0pLFxuICAgIGtleW1hcCh7XG4gICAgICAnRW50ZXInOiBzcGxpdExpc3RJdGVtKHNjaGVtYS5ub2Rlc1snbGlzdF9pdGVtJ10pLFxuICAgICAgJ1NoaWZ0LUVudGVyJzogY2hhaW5Db21tYW5kcyhleGl0Q29kZSwgKHN0YXRlLCBkaXNwYXRjaCkgPT4ge1xuICAgICAgICBjb25zdCB7IHRyIH0gPSBzdGF0ZTtcbiAgICAgICAgY29uc3QgYnIgPSBzY2hlbWEubm9kZXNbJ2hhcmRfYnJlYWsnXTtcbiAgICAgICAgZGlzcGF0Y2godHIucmVwbGFjZVNlbGVjdGlvbldpdGgoYnIuY3JlYXRlKCkpLnNjcm9sbEludG9WaWV3KCkpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0pLFxuICAgICAgJ01vZC1bJzogbGlmdExpc3RJdGVtKHNjaGVtYS5ub2Rlc1snbGlzdF9pdGVtJ10pLFxuICAgICAgJ01vZC1dJzogc2lua0xpc3RJdGVtKHNjaGVtYS5ub2Rlc1snbGlzdF9pdGVtJ10pLFxuICAgICAgJ1RhYic6IHNpbmtMaXN0SXRlbShzY2hlbWEubm9kZXNbJ2xpc3RfaXRlbSddKSxcbiAgICB9KSxcbiAgICBrZXltYXAoYmFzZUtleW1hcCksXG4gIF07XG5cbiAgaWYgKG9wdGlvbnMuaGlzdG9yeSkge1xuICAgIHBsdWdpbnMucHVzaChrZXltYXAoaGlzdG9yeUtleU1hcCkpO1xuICB9XG5cbiAgcmV0dXJuIHBsdWdpbnM7XG59O1xuXG5jb25zdCBnZXREZWZhdWx0UGx1Z2lucyA9IChzY2hlbWE6IFNjaGVtYSwgb3B0aW9uczogT3B0aW9ucyk6IFBsdWdpbltdID0+IHtcbiAgY29uc3QgcGx1Z2luczogUGx1Z2luW10gPSBbXTtcblxuICBpZiAob3B0aW9ucy5rZXlib2FyZFNob3J0Y3V0cykge1xuICAgIHBsdWdpbnMucHVzaCguLi5nZXRLZXlib2FyZFNob3J0Y3V0cyhzY2hlbWEsIHsgaGlzdG9yeTogb3B0aW9ucy5oaXN0b3J5IH0pKTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLmhpc3RvcnkpIHtcbiAgICBwbHVnaW5zLnB1c2goaGlzdG9yeSgpKTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLmlucHV0UnVsZXMpIHtcbiAgICBwbHVnaW5zLnB1c2goYnVpbGRJbnB1dFJ1bGVzKHNjaGVtYSkpO1xuICB9XG5cbiAgcmV0dXJuIHBsdWdpbnM7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBnZXREZWZhdWx0UGx1Z2lucztcbiJdfQ==