diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-01-22 21:08:48 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-01-22 21:08:48 +0000 |
commit | b6ec12ceca58b12d974d46d0579742f4d3cdb9d7 (patch) | |
tree | c440d6195c651bac465cd37bc0d88fbd3ebefccc /app/assets/javascripts/behaviors | |
parent | 3832718d895bf8268f3e3aac85948e2792769345 (diff) | |
download | gitlab-ce-b6ec12ceca58b12d974d46d0579742f4d3cdb9d7.tar.gz |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app/assets/javascripts/behaviors')
12 files changed, 104 insertions, 108 deletions
diff --git a/app/assets/javascripts/behaviors/markdown/constants.js b/app/assets/javascripts/behaviors/markdown/constants.js new file mode 100644 index 00000000000..b4545d6c6c6 --- /dev/null +++ b/app/assets/javascripts/behaviors/markdown/constants.js @@ -0,0 +1,3 @@ +// https://prosemirror.net/docs/ref/#model.ParseRule.priority +export const DEFAULT_PARSE_RULE_PRIORITY = 50; +export const HIGHER_PARSE_RULE_PRIORITY = 1 + DEFAULT_PARSE_RULE_PRIORITY; diff --git a/app/assets/javascripts/behaviors/markdown/marks/math.js b/app/assets/javascripts/behaviors/markdown/marks/math.js index e582fb18f15..04441d5d710 100644 --- a/app/assets/javascripts/behaviors/markdown/marks/math.js +++ b/app/assets/javascripts/behaviors/markdown/marks/math.js @@ -2,6 +2,7 @@ import { Mark } from 'tiptap'; import { defaultMarkdownSerializer } from 'prosemirror-markdown'; +import { HIGHER_PARSE_RULE_PRIORITY } from '../constants'; // Transforms generated HTML back to GFM for Banzai::Filter::MathFilter export default class MathMark extends Mark { @@ -15,7 +16,7 @@ export default class MathMark extends Mark { // Matches HTML generated by Banzai::Filter::MathFilter { tag: 'code.code.math[data-math-style=inline]', - priority: 51, + priority: HIGHER_PARSE_RULE_PRIORITY, }, // Matches HTML after being transformed by app/assets/javascripts/behaviors/markdown/render_math.js { diff --git a/app/assets/javascripts/behaviors/markdown/nodes/audio.js b/app/assets/javascripts/behaviors/markdown/nodes/audio.js index 48ac408cf24..146349b118c 100644 --- a/app/assets/javascripts/behaviors/markdown/nodes/audio.js +++ b/app/assets/javascripts/behaviors/markdown/nodes/audio.js @@ -1,53 +1,9 @@ -/* eslint-disable class-methods-use-this */ - -import { Node } from 'tiptap'; -import { defaultMarkdownSerializer } from 'prosemirror-markdown'; +import Playable from './playable'; // Transforms generated HTML back to GFM for Banzai::Filter::AudioLinkFilter -export default class Audio extends Node { - get name() { - return 'audio'; - } - - get schema() { - return { - attrs: { - src: {}, - alt: { - default: null, - }, - }, - group: 'block', - draggable: true, - parseDOM: [ - { - tag: '.audio-container', - skip: true, - }, - { - tag: '.audio-container p', - priority: 51, - ignore: true, - }, - { - tag: 'audio[src]', - getAttrs: el => ({ src: el.getAttribute('src'), alt: el.dataset.title }), - }, - ], - toDOM: node => [ - 'audio', - { - src: node.attrs.src, - controls: true, - 'data-setup': '{}', - 'data-title': node.attrs.alt, - }, - ], - }; - } - - toMarkdown(state, node) { - defaultMarkdownSerializer.nodes.image(state, node); - state.closeBlock(node); +export default class Audio extends Playable { + constructor() { + super(); + this.mediaType = 'audio'; } } diff --git a/app/assets/javascripts/behaviors/markdown/nodes/image.js b/app/assets/javascripts/behaviors/markdown/nodes/image.js index e839396330e..b1983eebe15 100644 --- a/app/assets/javascripts/behaviors/markdown/nodes/image.js +++ b/app/assets/javascripts/behaviors/markdown/nodes/image.js @@ -3,6 +3,7 @@ import { Image as BaseImage } from 'tiptap-extensions'; import { defaultMarkdownSerializer } from 'prosemirror-markdown'; import { placeholderImage } from '~/lazy_loader'; +import { HIGHER_PARSE_RULE_PRIORITY } from '../constants'; export default class Image extends BaseImage { get schema() { @@ -23,7 +24,7 @@ export default class Image extends BaseImage { // Matches HTML generated by Banzai::Filter::ImageLinkFilter { tag: 'a.no-attachment-icon', - priority: 51, + priority: HIGHER_PARSE_RULE_PRIORITY, skip: true, }, // Matches HTML generated by Banzai::Filter::ImageLazyLoadFilter diff --git a/app/assets/javascripts/behaviors/markdown/nodes/ordered_task_list.js b/app/assets/javascripts/behaviors/markdown/nodes/ordered_task_list.js index 25c4976a1bc..a28d7be3758 100644 --- a/app/assets/javascripts/behaviors/markdown/nodes/ordered_task_list.js +++ b/app/assets/javascripts/behaviors/markdown/nodes/ordered_task_list.js @@ -1,6 +1,7 @@ /* eslint-disable class-methods-use-this */ import { Node } from 'tiptap'; +import { HIGHER_PARSE_RULE_PRIORITY } from '../constants'; // Transforms generated HTML back to GFM for Banzai::Filter::TaskListFilter export default class OrderedTaskList extends Node { @@ -14,7 +15,7 @@ export default class OrderedTaskList extends Node { content: '(task_list_item|list_item)+', parseDOM: [ { - priority: 51, + priority: HIGHER_PARSE_RULE_PRIORITY, tag: 'ol.task-list', }, ], diff --git a/app/assets/javascripts/behaviors/markdown/nodes/playable.js b/app/assets/javascripts/behaviors/markdown/nodes/playable.js new file mode 100644 index 00000000000..08539df1242 --- /dev/null +++ b/app/assets/javascripts/behaviors/markdown/nodes/playable.js @@ -0,0 +1,73 @@ +/* eslint-disable class-methods-use-this */ +/* eslint-disable @gitlab/i18n/no-non-i18n-strings */ + +import { Node } from 'tiptap'; +import { defaultMarkdownSerializer } from 'prosemirror-markdown'; +import { HIGHER_PARSE_RULE_PRIORITY } from '../constants'; + +/** + * Abstract base class for playable media, like video and audio. + * Must not be instantiated directly. Subclasses must set + * the `mediaType` property in their constructors. + * @abstract + */ +export default class Playable extends Node { + constructor() { + super(); + this.mediaType = ''; + this.extraElementAttrs = {}; + } + + get name() { + return this.mediaType; + } + + get schema() { + const attrs = { + src: {}, + alt: { + default: null, + }, + }; + + const parseDOM = [ + { + tag: `.${this.mediaType}-container`, + skip: true, + }, + { + tag: `.${this.mediaType}-container p`, + priority: HIGHER_PARSE_RULE_PRIORITY, + ignore: true, + }, + { + tag: `${this.mediaType}[src]`, + getAttrs: el => ({ src: el.getAttribute('src'), alt: el.dataset.title }), + }, + ]; + + const toDOM = node => [ + this.mediaType, + { + src: node.attrs.src, + controls: true, + 'data-setup': '{}', + 'data-title': node.attrs.alt, + ...this.extraElementAttrs, + }, + ]; + + return { + attrs, + group: 'block', + draggable: true, + parseDOM, + toDOM, + }; + } + + toMarkdown(state, node) { + defaultMarkdownSerializer.nodes.image(state, node); + state.closeBlock(node); + } +} diff --git a/app/assets/javascripts/behaviors/markdown/nodes/reference.js b/app/assets/javascripts/behaviors/markdown/nodes/reference.js index 5d6bbeca833..aa724798da6 100644 --- a/app/assets/javascripts/behaviors/markdown/nodes/reference.js +++ b/app/assets/javascripts/behaviors/markdown/nodes/reference.js @@ -1,6 +1,7 @@ /* eslint-disable class-methods-use-this */ import { Node } from 'tiptap'; +import { HIGHER_PARSE_RULE_PRIORITY } from '../constants'; // Transforms generated HTML back to GFM for Banzai::Filter::ReferenceFilter and subclasses export default class Reference extends Node { @@ -23,7 +24,7 @@ export default class Reference extends Node { parseDOM: [ { tag: 'a.gfm:not([data-link=true])', - priority: 51, + priority: HIGHER_PARSE_RULE_PRIORITY, getAttrs: el => ({ className: el.className, referenceType: el.dataset.referenceType, diff --git a/app/assets/javascripts/behaviors/markdown/nodes/table_header_row.js b/app/assets/javascripts/behaviors/markdown/nodes/table_header_row.js index e7eee636402..6e3c16f0a08 100644 --- a/app/assets/javascripts/behaviors/markdown/nodes/table_header_row.js +++ b/app/assets/javascripts/behaviors/markdown/nodes/table_header_row.js @@ -1,6 +1,7 @@ /* eslint-disable class-methods-use-this */ import TableRow from './table_row'; +import { HIGHER_PARSE_RULE_PRIORITY } from '../constants'; const CENTER_ALIGN = 'center'; @@ -16,7 +17,7 @@ export default class TableHeaderRow extends TableRow { parseDOM: [ { tag: 'thead tr', - priority: 51, + priority: HIGHER_PARSE_RULE_PRIORITY, }, ], toDOM: () => ['tr', 0], diff --git a/app/assets/javascripts/behaviors/markdown/nodes/table_of_contents.js b/app/assets/javascripts/behaviors/markdown/nodes/table_of_contents.js index 9a2e2c03213..db9072acc3a 100644 --- a/app/assets/javascripts/behaviors/markdown/nodes/table_of_contents.js +++ b/app/assets/javascripts/behaviors/markdown/nodes/table_of_contents.js @@ -2,6 +2,7 @@ import { Node } from 'tiptap'; import { __ } from '~/locale'; +import { HIGHER_PARSE_RULE_PRIORITY } from '../constants'; // Transforms generated HTML back to GFM for Banzai::Filter::TableOfContentsFilter export default class TableOfContents extends Node { @@ -16,11 +17,11 @@ export default class TableOfContents extends Node { parseDOM: [ { tag: 'ul.section-nav', - priority: 51, + priority: HIGHER_PARSE_RULE_PRIORITY, }, { tag: 'p.table-of-contents', - priority: 51, + priority: HIGHER_PARSE_RULE_PRIORITY, }, ], toDOM: () => ['p', { class: 'table-of-contents' }, __('Table of Contents')], diff --git a/app/assets/javascripts/behaviors/markdown/nodes/task_list.js b/app/assets/javascripts/behaviors/markdown/nodes/task_list.js index ab33bc21502..35ba2eb0674 100644 --- a/app/assets/javascripts/behaviors/markdown/nodes/task_list.js +++ b/app/assets/javascripts/behaviors/markdown/nodes/task_list.js @@ -1,6 +1,7 @@ /* eslint-disable class-methods-use-this */ import { Node } from 'tiptap'; +import { HIGHER_PARSE_RULE_PRIORITY } from '../constants'; // Transforms generated HTML back to GFM for Banzai::Filter::TaskListFilter export default class TaskList extends Node { @@ -14,7 +15,7 @@ export default class TaskList extends Node { content: '(task_list_item|list_item)+', parseDOM: [ { - priority: 51, + priority: HIGHER_PARSE_RULE_PRIORITY, tag: 'ul.task-list', }, ], diff --git a/app/assets/javascripts/behaviors/markdown/nodes/task_list_item.js b/app/assets/javascripts/behaviors/markdown/nodes/task_list_item.js index d0ee7333d5e..7bb56b4c406 100644 --- a/app/assets/javascripts/behaviors/markdown/nodes/task_list_item.js +++ b/app/assets/javascripts/behaviors/markdown/nodes/task_list_item.js @@ -1,6 +1,7 @@ /* eslint-disable class-methods-use-this */ import { Node } from 'tiptap'; +import { HIGHER_PARSE_RULE_PRIORITY } from '../constants'; // Transforms generated HTML back to GFM for Banzai::Filter::TaskListFilter export default class TaskListItem extends Node { @@ -20,7 +21,7 @@ export default class TaskListItem extends Node { content: 'paragraph block*', parseDOM: [ { - priority: 51, + priority: HIGHER_PARSE_RULE_PRIORITY, tag: 'li.task-list-item', getAttrs: el => { const checkbox = el.querySelector('input[type=checkbox].task-list-item-checkbox'); diff --git a/app/assets/javascripts/behaviors/markdown/nodes/video.js b/app/assets/javascripts/behaviors/markdown/nodes/video.js index 516f983397d..68085c2c416 100644 --- a/app/assets/javascripts/behaviors/markdown/nodes/video.js +++ b/app/assets/javascripts/behaviors/markdown/nodes/video.js @@ -1,54 +1,10 @@ -/* eslint-disable class-methods-use-this */ - -import { Node } from 'tiptap'; -import { defaultMarkdownSerializer } from 'prosemirror-markdown'; +import Playable from './playable'; // Transforms generated HTML back to GFM for Banzai::Filter::VideoLinkFilter -export default class Video extends Node { - get name() { - return 'video'; - } - - get schema() { - return { - attrs: { - src: {}, - alt: { - default: null, - }, - }, - group: 'block', - draggable: true, - parseDOM: [ - { - tag: '.video-container', - skip: true, - }, - { - tag: '.video-container p', - priority: 51, - ignore: true, - }, - { - tag: 'video[src]', - getAttrs: el => ({ src: el.getAttribute('src'), alt: el.dataset.title }), - }, - ], - toDOM: node => [ - 'video', - { - src: node.attrs.src, - width: '400', - controls: true, - 'data-setup': '{}', - 'data-title': node.attrs.alt, - }, - ], - }; - } - - toMarkdown(state, node) { - defaultMarkdownSerializer.nodes.image(state, node); - state.closeBlock(node); +export default class Video extends Playable { + constructor() { + super(); + this.mediaType = 'video'; + this.extraElementAttrs = { width: '400' }; } } |