Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
李少辉-开发者
gitlab-foss
提交
ebb9c46c
G
gitlab-foss
项目概览
李少辉-开发者
/
gitlab-foss
通知
15
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
G
gitlab-foss
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
ebb9c46c
编写于
8月 28, 2020
作者:
G
GitLab Bot
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Add latest changes from gitlab-org/gitlab@master
上级
261c9668
变更
18
隐藏空白更改
内联
并排
Showing
18 changed file
with
237 addition
and
121 deletion
+237
-121
app/assets/javascripts/vue_shared/components/rich_content_editor/services/build_custom_renderer.js
...nts/rich_content_editor/services/build_custom_renderer.js
+9
-6
app/assets/javascripts/vue_shared/components/rich_content_editor/services/build_html_to_markdown_renderer.js
...ontent_editor/services/build_html_to_markdown_renderer.js
+10
-1
app/assets/javascripts/vue_shared/components/rich_content_editor/services/renderers/render_attribute_definition.js
..._editor/services/renderers/render_attribute_definition.js
+7
-0
app/assets/javascripts/vue_shared/components/rich_content_editor/services/renderers/render_heading.js
.../rich_content_editor/services/renderers/render_heading.js
+6
-0
app/assets/javascripts/vue_shared/components/rich_content_editor/services/renderers/render_kramdown_list.js
...content_editor/services/renderers/render_kramdown_list.js
+0
-24
app/assets/javascripts/vue_shared/components/rich_content_editor/services/renderers/render_kramdown_text.js
...content_editor/services/renderers/render_kramdown_text.js
+0
-9
app/assets/javascripts/vue_shared/components/rich_content_editor/services/renderers/render_list_item.js
...ich_content_editor/services/renderers/render_list_item.js
+6
-0
app/assets/javascripts/vue_shared/components/rich_content_editor/services/renderers/render_utils.js
...ts/rich_content_editor/services/renderers/render_utils.js
+28
-0
changelogs/unreleased/render-attribute-definitions.yml
changelogs/unreleased/render-attribute-definitions.yml
+5
-0
spec/frontend/vue_shared/components/rich_content_editor/services/build_custom_renderer_spec.js
...ich_content_editor/services/build_custom_renderer_spec.js
+6
-3
spec/frontend/vue_shared/components/rich_content_editor/services/build_html_to_markdown_renderer_spec.js
...t_editor/services/build_html_to_markdown_renderer_spec.js
+41
-14
spec/frontend/vue_shared/components/rich_content_editor/services/renderers/mock_data.js
...nents/rich_content_editor/services/renderers/mock_data.js
+2
-0
spec/frontend/vue_shared/components/rich_content_editor/services/renderers/render_attribute_definition_spec.js
...or/services/renderers/render_attribute_definition_spec.js
+25
-0
spec/frontend/vue_shared/components/rich_content_editor/services/renderers/render_heading_spec.js
..._content_editor/services/renderers/render_heading_spec.js
+12
-0
spec/frontend/vue_shared/components/rich_content_editor/services/renderers/render_kramdown_list_spec.js
...nt_editor/services/renderers/render_kramdown_list_spec.js
+0
-38
spec/frontend/vue_shared/components/rich_content_editor/services/renderers/render_kramdown_text_spec.js
...nt_editor/services/renderers/render_kramdown_text_spec.js
+0
-24
spec/frontend/vue_shared/components/rich_content_editor/services/renderers/render_list_item_spec.js
...ontent_editor/services/renderers/render_list_item_spec.js
+12
-0
spec/frontend/vue_shared/components/rich_content_editor/services/renderers/render_utils_spec.js
...ch_content_editor/services/renderers/render_utils_spec.js
+68
-2
未找到文件。
app/assets/javascripts/vue_shared/components/rich_content_editor/services/build_custom_renderer.js
浏览文件 @
ebb9c46c
import
{
union
,
mapValues
}
from
'
lodash
'
;
import
renderBlockHtml
from
'
./renderers/render_html_block
'
;
import
renderKramdownList
from
'
./renderers/render_kramdown_list
'
;
import
renderKramdownText
from
'
./renderers/render_kramdown_text
'
;
import
renderHeading
from
'
./renderers/render_heading
'
;
import
renderIdentifierInstanceText
from
'
./renderers/render_identifier_instance_text
'
;
import
renderIdentifierParagraph
from
'
./renderers/render_identifier_paragraph
'
;
import
renderFontAwesomeHtmlInline
from
'
./renderers/render_font_awesome_html_inline
'
;
import
renderSoftbreak
from
'
./renderers/render_softbreak
'
;
import
renderAttributeDefinition
from
'
./renderers/render_attribute_definition
'
;
import
renderListItem
from
'
./renderers/render_list_item
'
;
const
htmlInlineRenderers
=
[
renderFontAwesomeHtmlInline
];
const
htmlBlockRenderers
=
[
renderBlockHtml
];
const
listRenderers
=
[
renderKramdownList
];
const
paragraphRenderers
=
[
renderIdentifierParagraph
];
const
textRenderers
=
[
renderKramdownText
,
renderIdentifierInstanceText
];
const
headingRenderers
=
[
renderHeading
];
const
paragraphRenderers
=
[
renderIdentifierParagraph
,
renderBlockHtml
];
const
textRenderers
=
[
renderIdentifierInstanceText
,
renderAttributeDefinition
];
const
listItemRenderers
=
[
renderListItem
];
const
softbreakRenderers
=
[
renderSoftbreak
];
const
executeRenderer
=
(
renderers
,
node
,
context
)
=>
{
...
...
@@ -25,7 +27,8 @@ const buildCustomHTMLRenderer = customRenderers => {
...
customRenderers
,
htmlBlock
:
union
(
htmlBlockRenderers
,
customRenderers
?.
htmlBlock
),
htmlInline
:
union
(
htmlInlineRenderers
,
customRenderers
?.
htmlInline
),
list
:
union
(
listRenderers
,
customRenderers
?.
list
),
heading
:
union
(
headingRenderers
,
customRenderers
?.
heading
),
item
:
union
(
listItemRenderers
,
customRenderers
?.
listItem
),
paragraph
:
union
(
paragraphRenderers
,
customRenderers
?.
paragraph
),
text
:
union
(
textRenderers
,
customRenderers
?.
text
),
softbreak
:
union
(
softbreakRenderers
,
customRenderers
?.
softbreak
),
...
...
app/assets/javascripts/vue_shared/components/rich_content_editor/services/build_html_to_markdown_renderer.js
浏览文件 @
ebb9c46c
...
...
@@ -28,6 +28,7 @@ const buildHTMLToMarkdownRender = (baseRenderer, formattingPreferences = {}) =>
const
orderedListItemNode
=
'
OL LI
'
;
const
emphasisNode
=
'
EM, I
'
;
const
strongNode
=
'
STRONG, B
'
;
const
headingNode
=
'
H1, H2, H3, H4, H5, H6
'
;
return
{
TEXT_NODE
(
node
)
{
...
...
@@ -63,8 +64,10 @@ const buildHTMLToMarkdownRender = (baseRenderer, formattingPreferences = {}) =>
},
[
unorderedListItemNode
](
node
,
subContent
)
{
const
baseResult
=
baseRenderer
.
convert
(
node
,
subContent
);
const
formatted
=
baseResult
.
replace
(
/^
(\s
*
)([
*|-
])
/
,
`$1
${
unorderedListBulletChar
}
`
);
const
{
attributeDefinition
}
=
node
.
dataset
;
return
baseResult
.
replace
(
/^
(\s
*
)([
*|-
])
/
,
`$1
${
unorderedListBulletChar
}
`
)
;
return
attributeDefinition
?
`
${
formatted
.
trimRight
()}
\n
${
attributeDefinition
}
\n`
:
formatted
;
},
[
orderedListItemNode
](
node
,
subContent
)
{
const
baseResult
=
baseRenderer
.
convert
(
node
,
subContent
);
...
...
@@ -82,6 +85,12 @@ const buildHTMLToMarkdownRender = (baseRenderer, formattingPreferences = {}) =>
return
result
.
replace
(
/^
[
*_
]{2}
/
,
strongSyntax
).
replace
(
/
[
*_
]{2}
$/
,
strongSyntax
);
},
[
headingNode
](
node
,
subContent
)
{
const
result
=
baseRenderer
.
convert
(
node
,
subContent
);
const
{
attributeDefinition
}
=
node
.
dataset
;
return
attributeDefinition
?
`
${
result
.
trimRight
()}
\n
${
attributeDefinition
}
\n\n`
:
result
;
},
};
};
...
...
app/assets/javascripts/vue_shared/components/rich_content_editor/services/renderers/render_attribute_definition.js
0 → 100644
浏览文件 @
ebb9c46c
import
{
isAttributeDefinition
}
from
'
./render_utils
'
;
const
canRender
=
({
literal
})
=>
isAttributeDefinition
(
literal
);
const
render
=
()
=>
({
type
:
'
html
'
,
content
:
'
<!-- sse-attribute-definition -->
'
});
export
default
{
canRender
,
render
};
app/assets/javascripts/vue_shared/components/rich_content_editor/services/renderers/render_heading.js
0 → 100644
浏览文件 @
ebb9c46c
import
{
renderWithAttributeDefinitions
as
render
,
willAlwaysRender
as
canRender
,
}
from
'
./render_utils
'
;
export
default
{
render
,
canRender
};
app/assets/javascripts/vue_shared/components/rich_content_editor/services/renderers/render_kramdown_list.js
已删除
100644 → 0
浏览文件 @
261c9668
import
{
renderUneditableBranch
as
render
}
from
'
./render_utils
'
;
const
isKramdownTOC
=
({
type
,
literal
})
=>
type
===
'
text
'
&&
literal
===
'
TOC
'
;
const
canRender
=
node
=>
{
let
targetNode
=
node
;
while
(
targetNode
!==
null
)
{
const
{
firstChild
}
=
targetNode
;
const
isLeaf
=
firstChild
===
null
;
if
(
isLeaf
)
{
if
(
isKramdownTOC
(
targetNode
))
{
return
true
;
}
break
;
}
targetNode
=
targetNode
.
firstChild
;
}
return
false
;
};
export
default
{
canRender
,
render
};
app/assets/javascripts/vue_shared/components/rich_content_editor/services/renderers/render_kramdown_text.js
已删除
100644 → 0
浏览文件 @
261c9668
import
{
renderUneditableLeaf
as
render
}
from
'
./render_utils
'
;
const
kramdownRegex
=
/
(
^{:.+}$
)
/
;
const
canRender
=
({
literal
})
=>
{
return
kramdownRegex
.
test
(
literal
);
};
export
default
{
canRender
,
render
};
app/assets/javascripts/vue_shared/components/rich_content_editor/services/renderers/render_list_item.js
0 → 100644
浏览文件 @
ebb9c46c
import
{
renderWithAttributeDefinitions
as
render
,
willAlwaysRender
as
canRender
,
}
from
'
./render_utils
'
;
export
default
{
render
,
canRender
};
app/assets/javascripts/vue_shared/components/rich_content_editor/services/renderers/render_utils.js
浏览文件 @
ebb9c46c
...
...
@@ -8,3 +8,31 @@ export const renderUneditableLeaf = (_, { origin }) => buildUneditableBlockToken
export
const
renderUneditableBranch
=
(
_
,
{
entering
,
origin
})
=>
entering
?
buildUneditableOpenTokens
(
origin
())
:
buildUneditableCloseToken
();
const
attributeDefinitionRegexp
=
/
(
^{:.+}$
)
/
;
export
const
isAttributeDefinition
=
text
=>
attributeDefinitionRegexp
.
test
(
text
);
const
findAttributeDefinition
=
node
=>
{
const
literal
=
node
?.
next
?.
firstChild
?.
literal
||
node
?.
firstChild
?.
firstChild
?.
next
?.
next
?.
literal
;
// for headings // for list items;
return
isAttributeDefinition
(
literal
)
?
literal
:
null
;
};
export
const
renderWithAttributeDefinitions
=
(
node
,
{
origin
})
=>
{
const
attributes
=
findAttributeDefinition
(
node
);
const
token
=
origin
();
if
(
token
.
type
===
'
openTag
'
&&
attributes
)
{
Object
.
assign
(
token
,
{
attributes
:
{
'
data-attribute-definition
'
:
attributes
,
},
});
}
return
token
;
};
export
const
willAlwaysRender
=
()
=>
true
;
changelogs/unreleased/render-attribute-definitions.yml
0 → 100644
浏览文件 @
ebb9c46c
---
title
:
Render markdown attribute definitions as tooltips
merge_request
:
40541
author
:
type
:
changed
spec/frontend/vue_shared/components/rich_content_editor/services/build_custom_renderer_spec.js
浏览文件 @
ebb9c46c
...
...
@@ -5,8 +5,13 @@ describe('Build Custom Renderer Service', () => {
it
(
'
should return an object with the default renderer functions when lacking arguments
'
,
()
=>
{
expect
(
buildCustomHTMLRenderer
()).
toEqual
(
expect
.
objectContaining
({
list
:
expect
.
any
(
Function
),
htmlBlock
:
expect
.
any
(
Function
),
htmlInline
:
expect
.
any
(
Function
),
heading
:
expect
.
any
(
Function
),
item
:
expect
.
any
(
Function
),
paragraph
:
expect
.
any
(
Function
),
text
:
expect
.
any
(
Function
),
softbreak
:
expect
.
any
(
Function
),
}),
);
});
...
...
@@ -20,8 +25,6 @@ describe('Build Custom Renderer Service', () => {
expect
(
buildCustomHTMLRenderer
(
customRenderers
)).
toEqual
(
expect
.
objectContaining
({
html
:
expect
.
any
(
Function
),
list
:
expect
.
any
(
Function
),
text
:
expect
.
any
(
Function
),
}),
);
});
...
...
spec/frontend/vue_shared/components/rich_content_editor/services/build_html_to_markdown_renderer_spec.js
浏览文件 @
ebb9c46c
import
buildHTMLToMarkdownRenderer
from
'
~/vue_shared/components/rich_content_editor/services/build_html_to_markdown_renderer
'
;
import
{
attributeDefinition
}
from
'
./renderers/mock_data
'
;
describe
(
'
HTMLToMarkdownR
enderer
'
,
()
=>
{
describe
(
'
rich_content_editor/services/html_to_markdown_r
enderer
'
,
()
=>
{
let
baseRenderer
;
let
htmlToMarkdownRenderer
;
const
NODE
=
{
nodeValue
:
'
mock_node
'
}
;
let
fakeNode
;
beforeEach
(()
=>
{
baseRenderer
=
{
...
...
@@ -12,14 +13,16 @@ describe('HTMLToMarkdownRenderer', () => {
getSpaceControlled
:
jest
.
fn
(
input
=>
`space controlled
${
input
}
`
),
convert
:
jest
.
fn
(),
};
fakeNode
=
{
nodeValue
:
'
mock_node
'
,
dataset
:
{}
};
});
describe
(
'
TEXT_NODE visitor
'
,
()
=>
{
it
(
'
composes getSpaceControlled, getSpaceCollapsedText, and trim services
'
,
()
=>
{
htmlToMarkdownRenderer
=
buildHTMLToMarkdownRenderer
(
baseRenderer
);
expect
(
htmlToMarkdownRenderer
.
TEXT_NODE
(
NODE
)).
toBe
(
`space controlled trimmed space collapsed
${
NODE
.
nodeValue
}
`
,
expect
(
htmlToMarkdownRenderer
.
TEXT_NODE
(
fakeNode
)).
toBe
(
`space controlled trimmed space collapsed
${
fakeNode
.
nodeValue
}
`
,
);
});
});
...
...
@@ -43,8 +46,8 @@ describe('HTMLToMarkdownRenderer', () => {
baseRenderer
.
convert
.
mockReturnValueOnce
(
list
);
expect
(
htmlToMarkdownRenderer
[
'
LI OL, LI UL
'
](
NODE
,
list
)).
toBe
(
result
);
expect
(
baseRenderer
.
convert
).
toHaveBeenCalledWith
(
NODE
,
list
);
expect
(
htmlToMarkdownRenderer
[
'
LI OL, LI UL
'
](
fakeNode
,
list
)).
toBe
(
result
);
expect
(
baseRenderer
.
convert
).
toHaveBeenCalledWith
(
fakeNode
,
list
);
});
});
...
...
@@ -62,10 +65,21 @@ describe('HTMLToMarkdownRenderer', () => {
});
baseRenderer
.
convert
.
mockReturnValueOnce
(
listItem
);
expect
(
htmlToMarkdownRenderer
[
'
UL LI
'
](
NODE
,
listItem
)).
toBe
(
result
);
expect
(
baseRenderer
.
convert
).
toHaveBeenCalledWith
(
NODE
,
listItem
);
expect
(
htmlToMarkdownRenderer
[
'
UL LI
'
](
fakeNode
,
listItem
)).
toBe
(
result
);
expect
(
baseRenderer
.
convert
).
toHaveBeenCalledWith
(
fakeNode
,
listItem
);
},
);
it
(
'
detects attribute definitions and attaches them to the list item
'
,
()
=>
{
const
listItem
=
'
- list item
'
;
const
result
=
`
${
listItem
}
\n
${
attributeDefinition
}
\n`
;
fakeNode
.
dataset
.
attributeDefinition
=
attributeDefinition
;
htmlToMarkdownRenderer
=
buildHTMLToMarkdownRenderer
(
baseRenderer
);
baseRenderer
.
convert
.
mockReturnValueOnce
(
`
${
listItem
}
\n`
);
expect
(
htmlToMarkdownRenderer
[
'
UL LI
'
](
fakeNode
,
listItem
)).
toBe
(
result
);
});
});
describe
(
'
OL LI visitor
'
,
()
=>
{
...
...
@@ -85,8 +99,8 @@ describe('HTMLToMarkdownRenderer', () => {
});
baseRenderer
.
convert
.
mockReturnValueOnce
(
listItem
);
expect
(
htmlToMarkdownRenderer
[
'
OL LI
'
](
NODE
,
subContent
)).
toBe
(
result
);
expect
(
baseRenderer
.
convert
).
toHaveBeenCalledWith
(
NODE
,
subContent
);
expect
(
htmlToMarkdownRenderer
[
'
OL LI
'
](
fakeNode
,
subContent
)).
toBe
(
result
);
expect
(
baseRenderer
.
convert
).
toHaveBeenCalledWith
(
fakeNode
,
subContent
);
},
);
});
...
...
@@ -105,8 +119,8 @@ describe('HTMLToMarkdownRenderer', () => {
baseRenderer
.
convert
.
mockReturnValueOnce
(
input
);
expect
(
htmlToMarkdownRenderer
[
'
STRONG, B
'
](
NODE
,
input
)).
toBe
(
result
);
expect
(
baseRenderer
.
convert
).
toHaveBeenCalledWith
(
NODE
,
input
);
expect
(
htmlToMarkdownRenderer
[
'
STRONG, B
'
](
fakeNode
,
input
)).
toBe
(
result
);
expect
(
baseRenderer
.
convert
).
toHaveBeenCalledWith
(
fakeNode
,
input
);
},
);
});
...
...
@@ -125,9 +139,22 @@ describe('HTMLToMarkdownRenderer', () => {
baseRenderer
.
convert
.
mockReturnValueOnce
(
input
);
expect
(
htmlToMarkdownRenderer
[
'
EM, I
'
](
NODE
,
input
)).
toBe
(
result
);
expect
(
baseRenderer
.
convert
).
toHaveBeenCalledWith
(
NODE
,
input
);
expect
(
htmlToMarkdownRenderer
[
'
EM, I
'
](
fakeNode
,
input
)).
toBe
(
result
);
expect
(
baseRenderer
.
convert
).
toHaveBeenCalledWith
(
fakeNode
,
input
);
},
);
});
describe
(
'
H1, H2, H3, H4, H5, H6 visitor
'
,
()
=>
{
it
(
'
detects attribute definitions and attaches them to the heading
'
,
()
=>
{
const
heading
=
'
heading text
'
;
const
result
=
`
${
heading
.
trimRight
()}
\n
${
attributeDefinition
}
\n\n`
;
fakeNode
.
dataset
.
attributeDefinition
=
attributeDefinition
;
htmlToMarkdownRenderer
=
buildHTMLToMarkdownRenderer
(
baseRenderer
);
baseRenderer
.
convert
.
mockReturnValueOnce
(
`
${
heading
}
\n\n`
);
expect
(
htmlToMarkdownRenderer
[
'
H1, H2, H3, H4, H5, H6
'
](
fakeNode
,
heading
)).
toBe
(
result
);
});
});
});
spec/frontend/vue_shared/components/rich_content_editor/services/renderers/mock_data.js
浏览文件 @
ebb9c46c
...
...
@@ -56,3 +56,5 @@ export const uneditableBlockTokens = [
},
buildMockUneditableCloseToken
(
'
div
'
),
];
export
const
attributeDefinition
=
'
{:.no_toc .hidden-md .hidden-lg}
'
;
spec/frontend/vue_shared/components/rich_content_editor/services/renderers/render_attribute_definition_spec.js
0 → 100644
浏览文件 @
ebb9c46c
import
renderer
from
'
~/vue_shared/components/rich_content_editor/services/renderers/render_attribute_definition
'
;
import
{
attributeDefinition
}
from
'
./mock_data
'
;
describe
(
'
rich_content_editor/renderers/render_attribute_definition
'
,
()
=>
{
describe
(
'
canRender
'
,
()
=>
{
it
.
each
`
input | result
${{
literal
:
attributeDefinition
}
} |
${
true
}
${{
literal
:
`FOO
${
attributeDefinition
}
`
}
} |
${
false
}
${{
literal
:
`
${
attributeDefinition
}
BAR`
}
} |
${
false
}
${{
literal
:
'
foobar
'
}
} |
${
false
}
`
(
'
returns $result when input is $input
'
,
({
input
,
result
})
=>
{
expect
(
renderer
.
canRender
(
input
)).
toBe
(
result
);
});
});
describe
(
'
render
'
,
()
=>
{
it
(
'
returns an empty HTML comment
'
,
()
=>
{
expect
(
renderer
.
render
()).
toEqual
({
type
:
'
html
'
,
content
:
'
<!-- sse-attribute-definition -->
'
,
});
});
});
});
spec/frontend/vue_shared/components/rich_content_editor/services/renderers/render_heading_spec.js
0 → 100644
浏览文件 @
ebb9c46c
import
renderer
from
'
~/vue_shared/components/rich_content_editor/services/renderers/render_heading
'
;
import
*
as
renderUtils
from
'
~/vue_shared/components/rich_content_editor/services/renderers/render_utils
'
;
describe
(
'
rich_content_editor/renderers/render_heading
'
,
()
=>
{
it
(
'
canRender delegates to renderUtils.willAlwaysRender
'
,
()
=>
{
expect
(
renderer
.
canRender
).
toBe
(
renderUtils
.
willAlwaysRender
);
});
it
(
'
render delegates to renderUtils.renderWithAttributeDefinitions
'
,
()
=>
{
expect
(
renderer
.
render
).
toBe
(
renderUtils
.
renderWithAttributeDefinitions
);
});
});
spec/frontend/vue_shared/components/rich_content_editor/services/renderers/render_kramdown_list_spec.js
已删除
100644 → 0
浏览文件 @
261c9668
import
renderer
from
'
~/vue_shared/components/rich_content_editor/services/renderers/render_kramdown_list
'
;
import
{
renderUneditableBranch
}
from
'
~/vue_shared/components/rich_content_editor/services/renderers/render_utils
'
;
import
{
buildMockTextNode
}
from
'
./mock_data
'
;
const
buildMockListNode
=
literal
=>
{
return
{
firstChild
:
{
firstChild
:
{
firstChild
:
buildMockTextNode
(
literal
),
type
:
'
paragraph
'
,
},
type
:
'
item
'
,
},
type
:
'
list
'
,
};
};
const
normalListNode
=
buildMockListNode
(
'
Just another bullet point
'
);
const
kramdownListNode
=
buildMockListNode
(
'
TOC
'
);
describe
(
'
Render Kramdown List renderer
'
,
()
=>
{
describe
(
'
canRender
'
,
()
=>
{
it
(
'
should return true when the argument is a special kramdown TOC ordered/unordered list
'
,
()
=>
{
expect
(
renderer
.
canRender
(
kramdownListNode
)).
toBe
(
true
);
});
it
(
'
should return false when the argument is a normal ordered/unordered list
'
,
()
=>
{
expect
(
renderer
.
canRender
(
normalListNode
)).
toBe
(
false
);
});
});
describe
(
'
render
'
,
()
=>
{
it
(
'
should delegate rendering to the renderUneditableBranch util
'
,
()
=>
{
expect
(
renderer
.
render
).
toBe
(
renderUneditableBranch
);
});
});
});
spec/frontend/vue_shared/components/rich_content_editor/services/renderers/render_kramdown_text_spec.js
已删除
100644 → 0
浏览文件 @
261c9668
import
renderer
from
'
~/vue_shared/components/rich_content_editor/services/renderers/render_kramdown_text
'
;
import
{
renderUneditableLeaf
}
from
'
~/vue_shared/components/rich_content_editor/services/renderers/render_utils
'
;
import
{
buildMockTextNode
,
normalTextNode
}
from
'
./mock_data
'
;
const
kramdownTextNode
=
buildMockTextNode
(
'
{:toc}
'
);
describe
(
'
Render Kramdown Text renderer
'
,
()
=>
{
describe
(
'
canRender
'
,
()
=>
{
it
(
'
should return true when the argument `literal` has kramdown syntax
'
,
()
=>
{
expect
(
renderer
.
canRender
(
kramdownTextNode
)).
toBe
(
true
);
});
it
(
'
should return false when the argument `literal` lacks kramdown syntax
'
,
()
=>
{
expect
(
renderer
.
canRender
(
normalTextNode
)).
toBe
(
false
);
});
});
describe
(
'
render
'
,
()
=>
{
it
(
'
should delegate rendering to the renderUneditableLeaf util
'
,
()
=>
{
expect
(
renderer
.
render
).
toBe
(
renderUneditableLeaf
);
});
});
});
spec/frontend/vue_shared/components/rich_content_editor/services/renderers/render_list_item_spec.js
0 → 100644
浏览文件 @
ebb9c46c
import
renderer
from
'
~/vue_shared/components/rich_content_editor/services/renderers/render_list_item
'
;
import
*
as
renderUtils
from
'
~/vue_shared/components/rich_content_editor/services/renderers/render_utils
'
;
describe
(
'
rich_content_editor/renderers/render_list_item
'
,
()
=>
{
it
(
'
canRender delegates to renderUtils.willAlwaysRender
'
,
()
=>
{
expect
(
renderer
.
canRender
).
toBe
(
renderUtils
.
willAlwaysRender
);
});
it
(
'
render delegates to renderUtils.renderWithAttributeDefinitions
'
,
()
=>
{
expect
(
renderer
.
render
).
toBe
(
renderUtils
.
renderWithAttributeDefinitions
);
});
});
spec/frontend/vue_shared/components/rich_content_editor/services/renderers/render_utils_spec.js
浏览文件 @
ebb9c46c
import
{
renderUneditableLeaf
,
renderUneditableBranch
,
renderWithAttributeDefinitions
,
willAlwaysRender
,
}
from
'
~/vue_shared/components/rich_content_editor/services/renderers/render_utils
'
;
import
{
...
...
@@ -8,9 +10,9 @@ import {
buildUneditableOpenTokens
,
}
from
'
~/vue_shared/components/rich_content_editor/services/renderers/build_uneditable_token
'
;
import
{
originToken
,
uneditableCloseToken
}
from
'
./mock_data
'
;
import
{
originToken
,
uneditableCloseToken
,
attributeDefinition
}
from
'
./mock_data
'
;
describe
(
'
Render
utils
'
,
()
=>
{
describe
(
'
rich_content_editor/renderers/render_
utils
'
,
()
=>
{
describe
(
'
renderUneditableLeaf
'
,
()
=>
{
it
(
'
should return uneditable block tokens around an origin token
'
,
()
=>
{
const
context
=
{
origin
:
jest
.
fn
().
mockReturnValueOnce
(
originToken
)
};
...
...
@@ -41,4 +43,68 @@ describe('Render utils', () => {
expect
(
result
).
toStrictEqual
(
uneditableCloseToken
);
});
});
describe
(
'
willAlwaysRender
'
,
()
=>
{
it
(
'
always returns true
'
,
()
=>
{
expect
(
willAlwaysRender
()).
toBe
(
true
);
});
});
describe
(
'
renderWithAttributeDefinitions
'
,
()
=>
{
let
openTagToken
;
let
closeTagToken
;
let
node
;
const
attributes
=
{
'
data-attribute-definition
'
:
attributeDefinition
,
};
beforeEach
(()
=>
{
openTagToken
=
{
type
:
'
openTag
'
};
closeTagToken
=
{
type
:
'
closeTag
'
};
node
=
{
next
:
{
firstChild
:
{
literal
:
attributeDefinition
,
},
},
};
});
describe
(
'
when token type is openTag
'
,
()
=>
{
it
(
'
attaches attributes when attributes exist in the node’s next sibling
'
,
()
=>
{
const
context
=
{
origin
:
()
=>
openTagToken
};
expect
(
renderWithAttributeDefinitions
(
node
,
context
)).
toEqual
({
...
openTagToken
,
attributes
,
});
});
it
(
'
attaches attributes when attributes exist in the node’s children
'
,
()
=>
{
const
context
=
{
origin
:
()
=>
openTagToken
};
node
=
{
firstChild
:
{
firstChild
:
{
next
:
{
next
:
{
literal
:
attributeDefinition
,
},
},
},
},
};
expect
(
renderWithAttributeDefinitions
(
node
,
context
)).
toEqual
({
...
openTagToken
,
attributes
,
});
});
});
it
(
'
does not attach attributes when token type is "closeTag"
'
,
()
=>
{
const
context
=
{
origin
:
()
=>
closeTagToken
};
expect
(
renderWithAttributeDefinitions
({},
context
)).
toBe
(
closeTagToken
);
});
});
});
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录