Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xxadev
vscode
提交
8f5fc228
V
vscode
项目概览
xxadev
/
vscode
与 Fork 源项目一致
从无法访问的项目Fork
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
V
vscode
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
8f5fc228
编写于
6月 20, 2017
作者:
R
Ramya Achutha Rao
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Refactoring to support #28556 eventually
上级
bd74b632
变更
2
显示空白变更内容
内联
并排
Showing
2 changed file
with
72 addition
and
56 deletion
+72
-56
extensions/emmet/src/abbreviationActions.ts
extensions/emmet/src/abbreviationActions.ts
+27
-16
extensions/emmet/src/emmetCompletionProvider.ts
extensions/emmet/src/emmetCompletionProvider.ts
+45
-40
未找到文件。
extensions/emmet/src/abbreviationActions.ts
浏览文件 @
8f5fc228
...
...
@@ -51,7 +51,13 @@ export function expandAbbreviation() {
mappedSyntax
=
true
;
}
}
let
output
=
expandAbbreviationHelper
(
syntax
,
editor
.
document
,
editor
.
selection
,
mappedSyntax
);
if
(
!
mappedSyntax
)
{
syntax
=
syntaxHelper
(
syntax
,
editor
.
document
,
editor
.
selection
.
end
);
}
if
(
!
syntax
)
{
return
;
}
let
output
=
expandAbbreviationHelper
(
syntax
,
editor
.
document
,
editor
.
selection
);
if
(
output
)
{
editor
.
insertSnippet
(
new
vscode
.
SnippetString
(
output
.
expandedText
),
output
.
abbreviationRange
);
}
...
...
@@ -69,21 +75,8 @@ export interface ExpandAbbreviationHelperOutput {
* @param syntax string syntax to be used for expanding abbreviations
* @param document vscode.TextDocument
* @param abbreviationRange vscode.Range range of the abbreviation that needs to be expanded
* @param mappedSyntax Boolean Pass true if given document language was mapped to given syntax to get emmet abbreviation expansions.
* */
export
function
expandAbbreviationHelper
(
syntax
:
string
,
document
:
vscode
.
TextDocument
,
abbreviationRange
:
vscode
.
Range
,
mappedSyntax
:
boolean
):
ExpandAbbreviationHelperOutput
{
if
(
!
mappedSyntax
)
{
let
parseContent
=
isStyleSheet
(
syntax
)
?
parseStylesheet
:
parse
;
let
rootNode
:
Node
=
parseContent
(
new
DocumentStreamReader
(
document
));
let
currentNode
=
getNode
(
rootNode
,
abbreviationRange
.
end
);
if
(
forceCssSyntax
(
syntax
,
currentNode
,
abbreviationRange
.
end
))
{
syntax
=
'
css
'
;
}
else
if
(
!
isValidLocationForEmmetAbbreviation
(
currentNode
,
syntax
,
abbreviationRange
.
end
))
{
return
;
}
}
export
function
expandAbbreviationHelper
(
syntax
:
string
,
document
:
vscode
.
TextDocument
,
abbreviationRange
:
vscode
.
Range
):
ExpandAbbreviationHelperOutput
{
let
abbreviation
=
document
.
getText
(
abbreviationRange
);
if
(
abbreviationRange
.
isEmpty
)
{
[
abbreviationRange
,
abbreviation
]
=
extractAbbreviation
(
document
,
abbreviationRange
.
start
);
...
...
@@ -93,6 +86,24 @@ export function expandAbbreviationHelper(syntax: string, document: vscode.TextDo
return
{
expandedText
,
abbreviationRange
,
abbreviation
,
syntax
};
}
/**
* Checks whether given position is valid for emmet abbreviation and returns appropriate syntax
* @param syntax string language mode of current document
* @param document vscode.Textdocument
* @param position vscode.Position position of the abbreviation that needs to be expanded
*/
export
function
syntaxHelper
(
syntax
:
string
,
document
:
vscode
.
TextDocument
,
position
:
vscode
.
Position
):
string
{
let
parseContent
=
isStyleSheet
(
syntax
)
?
parseStylesheet
:
parse
;
let
rootNode
:
Node
=
parseContent
(
new
DocumentStreamReader
(
document
));
let
currentNode
=
getNode
(
rootNode
,
position
);
if
(
forceCssSyntax
(
syntax
,
currentNode
,
position
))
{
return
'
css
'
;
}
else
if
(
!
isValidLocationForEmmetAbbreviation
(
currentNode
,
syntax
,
position
))
{
return
;
}
}
/**
* Extracts abbreviation from the given position in the given document
*/
...
...
@@ -141,7 +152,7 @@ function isValidLocationForEmmetAbbreviation(currentNode: Node, syntax: string,
return
false
;
}
function
getExpandOptions
(
syntax
:
string
,
textToReplace
?:
string
)
{
export
function
getExpandOptions
(
syntax
:
string
,
textToReplace
?:
string
)
{
return
{
field
:
field
,
syntax
:
syntax
,
...
...
extensions/emmet/src/emmetCompletionProvider.ts
浏览文件 @
8f5fc228
...
...
@@ -7,10 +7,9 @@
import
*
as
vscode
from
'
vscode
'
;
import
{
expand
,
createSnippetsRegistry
}
from
'
@emmetio/expand-abbreviation
'
;
import
{
getSyntax
,
isStyleSheet
}
from
'
./util
'
;
import
{
expandAbbreviationHelper
,
ExpandAbbreviationHelperOutput
}
from
'
./abbreviationActions
'
;
import
{
syntaxHelper
,
expandAbbreviationHelper
,
ExpandAbbreviationHelperOutput
,
getExpandOptions
}
from
'
./abbreviationActions
'
;
const
field
=
(
index
,
placeholder
)
=>
`
\$
{
${
index
}${
placeholder
?
'
:
'
+
placeholder
:
''
}
}`
;
const
snippetCompletionsCache
=
new
Map
<
string
,
vscode
.
CompletionItem
[]
>
();
const
snippetKeyCache
=
new
Map
<
string
,
string
[]
>
();
export
class
EmmetCompletionItemProvider
implements
vscode
.
CompletionItemProvider
{
private
_mappedSyntax
=
false
;
...
...
@@ -21,64 +20,70 @@ export class EmmetCompletionItemProvider implements vscode.CompletionItemProvide
}
public
provideCompletionItems
(
document
:
vscode
.
TextDocument
,
position
:
vscode
.
Position
,
token
:
vscode
.
CancellationToken
):
Thenable
<
vscode
.
CompletionList
>
{
if
(
!
vscode
.
workspace
.
getConfiguration
(
'
emmet
'
)[
'
useNewEmmet
'
])
{
let
emmetConfig
=
vscode
.
workspace
.
getConfiguration
(
'
emmet
'
);
if
(
!
emmetConfig
[
'
useNewEmmet
'
]
||
!
emmetConfig
[
'
showExpandedAbbreviation
'
])
{
return
Promise
.
resolve
(
null
);
}
let
syntax
=
getSyntax
(
document
);
let
expandedAbbr
:
vscode
.
CompletionItem
;
if
(
vscode
.
workspace
.
getConfiguration
(
'
emmet
'
)[
'
showExpandedAbbreviation
'
])
{
let
output
:
ExpandAbbreviationHelperOutput
=
expandAbbreviationHelper
(
syntax
,
document
,
new
vscode
.
Range
(
position
,
position
),
this
.
_mappedSyntax
);
if
(
output
)
{
expandedAbbr
=
new
vscode
.
CompletionItem
(
output
.
abbreviation
);
let
abbreviationRange
=
new
vscode
.
Range
(
position
,
position
);
if
(
!
this
.
_mappedSyntax
)
{
syntax
=
syntaxHelper
(
syntax
,
document
,
position
);
}
let
output
:
ExpandAbbreviationHelperOutput
=
expandAbbreviationHelper
(
syntax
,
document
,
abbreviationRange
);
if
(
!
output
)
{
return
;
}
let
expandedAbbr
=
new
vscode
.
CompletionItem
(
output
.
abbreviation
);
expandedAbbr
.
insertText
=
new
vscode
.
SnippetString
(
output
.
expandedText
);
expandedAbbr
.
documentation
=
removeTabStops
(
output
.
expandedText
);
expandedAbbr
.
range
=
output
.
abbreviationRange
;
expandedAbbr
.
detail
=
'
Expand Emmet Abbreviation
'
;
syntax
=
output
.
syntax
;
}
}
let
completionItems
:
vscode
.
CompletionItem
[]
=
expandedAbbr
?
[
expandedAbbr
]
:
[];
if
(
!
isStyleSheet
(
syntax
))
{
if
(
expandedAbbr
)
{
// In non stylesheet like syntax, this extension returns expanded abbr plus posssible abbr completions
// To differentiate between the 2, the former is given CompletionItemKind.Value so that it gets a different icon
expandedAbbr
.
kind
=
vscode
.
CompletionItemKind
.
Value
;
}
let
currentWord
=
getCurrentWord
(
document
,
position
);
let
abbreviationSuggestions
=
this
.
getAbbreviationSuggestions
(
syntax
,
currentWord
,
(
expandedAbbr
&&
currentWord
===
expandedAbbr
.
label
));
let
abbreviationSuggestions
=
this
.
getAbbreviationSuggestions
(
syntax
,
currentWord
,
output
.
abbreviation
,
output
.
abbreviationRange
);
completionItems
=
completionItems
.
concat
(
abbreviationSuggestions
);
}
return
Promise
.
resolve
(
new
vscode
.
CompletionList
(
completionItems
,
true
));
}
getAbbreviationSuggestions
(
syntax
:
string
,
prefix
:
string
,
skipExactMatch
:
boolean
)
{
if
(
!
vscode
.
workspace
.
getConfiguration
(
'
emmet
'
)[
'
showAbbreviationSuggestions
'
]
||
!
prefix
)
{
getAbbreviationSuggestions
(
syntax
:
string
,
prefix
:
string
,
abbreviation
:
string
,
abbreviationRange
:
vscode
.
Range
):
vscode
.
CompletionItem
[]
{
if
(
!
vscode
.
workspace
.
getConfiguration
(
'
emmet
'
)[
'
showAbbreviationSuggestions
'
]
||
!
prefix
||
!
abbreviation
)
{
return
[];
}
if
(
!
snippet
Completions
Cache
.
has
(
syntax
))
{
if
(
!
snippet
Key
Cache
.
has
(
syntax
))
{
let
registry
=
createSnippetsRegistry
(
syntax
);
let
completions
:
vscode
.
CompletionItem
[]
=
registry
.
all
({
type
:
'
string
'
}).
map
(
snippet
=>
{
let
expandedWord
=
expand
(
snippet
.
value
,
{
field
:
field
,
syntax
:
syntax
let
snippetKeys
:
string
[]
=
registry
.
all
({
type
:
'
string
'
}).
map
(
snippet
=>
{
return
snippet
.
key
;
});
snippetKeyCache
.
set
(
syntax
,
snippetKeys
);
}
let
item
=
new
vscode
.
CompletionItem
(
snippet
.
key
);
item
.
documentation
=
removeTabStops
(
expandedWord
);
item
.
detail
=
'
Complete Emmet Abbreviation
'
;
item
.
insertText
=
snippet
.
key
;
return
item
;
});
snippetCompletionsCache
.
set
(
syntax
,
completions
);
let
skipExactMatch
=
prefix
===
abbreviation
;
let
snippetKeys
=
snippetKeyCache
.
get
(
syntax
);
let
snippetCompletions
=
[];
snippetKeys
.
forEach
(
snippetKey
=>
{
if
(
!
snippetKey
.
startsWith
(
prefix
)
||
(
snippetKey
===
prefix
)
||
(
skipExactMatch
&&
snippetKey
===
prefix
))
{
return
;
}
let
snippetCompletions
=
snippetCompletionsCache
.
get
(
syntax
);
let
currentAbbr
=
snippetKey
;
// For #28556: abbreviation + snippetKey.substr(prefix.length);
let
expandedAbbr
=
expand
(
currentAbbr
,
getExpandOptions
(
syntax
));
let
item
=
new
vscode
.
CompletionItem
(
snippetKey
);
item
.
documentation
=
removeTabStops
(
expandedAbbr
);
item
.
detail
=
'
Complete Emmet Abbreviation
'
;
item
.
insertText
=
snippetKey
;
// For #28556: new vscode.SnippetString(expandedAbbr);
snippetCompletions
=
snippetCompletions
.
filter
(
x
=>
x
.
label
.
startsWith
(
prefix
)
&&
(
!
skipExactMatch
||
x
.
label
!==
prefix
));
snippetCompletions
.
push
(
item
);
});
return
snippetCompletions
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录