Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
张文彪
/
employmentBusinessPc
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Settings
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
ae422217
authored
Nov 26, 2025
by
zwb
Browse files
Options
_('Browse Files')
Download
Email Patches
Plain Diff
招聘会演示平台搭建与简历导入
parent
5245b766
Show whitespace changes
Inline
Side-by-side
Showing
14 changed files
with
1011 additions
and
0 deletions
employmentBusiness-pc-api/src/main/java/com/bkty/system/api/model/XcxLoginUser.java
employmentBusiness-pc-auth/src/main/java/com/bkty/form/XcxLoginBody.java
employmentBusiness-pc-common/employmentBusiness-pc-common-core/src/main/java/org/dromara/common/core/factory/YmlPropertySourceFactory.java
employmentBusiness-pc-common/employmentBusiness-pc-common-core/src/main/java/org/dromara/common/core/xss/Xss.java
employmentBusiness-pc-common/employmentBusiness-pc-common-core/src/main/java/org/dromara/common/core/xss/XssValidator.java
employmentBusiness-pc-common/employmentBusiness-pc-common-web/src/main/java/org/dromara/common/web/config/properties/XssProperties.java
employmentBusiness-pc-common/employmentBusiness-pc-common-web/src/main/java/org/dromara/common/web/filter/XssFilter.java
employmentBusiness-pc-common/employmentBusiness-pc-common-web/src/main/java/org/dromara/common/web/filter/XssHttpServletRequestWrapper.java
employmentBusiness-pc-modules/employmentBusiness-pc-system/src/main/java/com/bkty/system/config/YyptUrlProperties.java
employmentBusiness-pc-nacos/src/main/java/com/alibaba/nacos/console/filter/XssFilter.java
employmentBusiness-pc-nacos/src/main/resources/static/console-ui/public/js/vs/base/worker/workerMain.js
employmentBusiness-pc-nacos/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/xml.js
employmentBusiness-pc-nacos/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/yaml.js
employmentBusiness-pc-nacos/src/main/resources/static/console-ui/public/js/xml.js
employmentBusiness-pc-api/src/main/java/com/bkty/system/api/model/XcxLoginUser.java
0 → 100644
View file @
ae422217
package
com
.
bkty
.
system
.
api
.
model
;
import
lombok.Data
;
import
lombok.EqualsAndHashCode
;
import
lombok.NoArgsConstructor
;
import
java.io.Serial
;
/**
* 小程序登录用户身份权限
*
* @author Lion Li
*/
@Data
@EqualsAndHashCode
(
callSuper
=
true
)
@NoArgsConstructor
public
class
XcxLoginUser
extends
LoginUser
{
@Serial
private
static
final
long
serialVersionUID
=
1L
;
/**
* openid
*/
private
String
openid
;
}
employmentBusiness-pc-auth/src/main/java/com/bkty/form/XcxLoginBody.java
0 → 100644
View file @
ae422217
package
com
.
bkty
.
form
;
import
jakarta.validation.constraints.NotBlank
;
import
lombok.Data
;
import
lombok.EqualsAndHashCode
;
import
org.dromara.common.core.domain.model.LoginBody
;
/**
* 三方登录对象
*
* @author Lion Li
*/
@Data
@EqualsAndHashCode
(
callSuper
=
true
)
public
class
XcxLoginBody
extends
LoginBody
{
/**
* 小程序id(多个小程序时使用)
*/
private
String
appid
;
/**
* 小程序code
*/
@NotBlank
(
message
=
"{xcx.code.not.blank}"
)
private
String
xcxCode
;
}
employmentBusiness-pc-common/employmentBusiness-pc-common-core/src/main/java/org/dromara/common/core/factory/YmlPropertySourceFactory.java
0 → 100644
View file @
ae422217
package
org
.
dromara
.
common
.
core
.
factory
;
import
org.dromara.common.core.utils.StringUtils
;
import
org.springframework.beans.factory.config.YamlPropertiesFactoryBean
;
import
org.springframework.core.env.PropertiesPropertySource
;
import
org.springframework.core.env.PropertySource
;
import
org.springframework.core.io.support.DefaultPropertySourceFactory
;
import
org.springframework.core.io.support.EncodedResource
;
import
java.io.IOException
;
/**
* yml 配置源工厂
*
* @author Lion Li
*/
public
class
YmlPropertySourceFactory
extends
DefaultPropertySourceFactory
{
@Override
public
PropertySource
<?>
createPropertySource
(
String
name
,
EncodedResource
resource
)
throws
IOException
{
String
sourceName
=
resource
.
getResource
().
getFilename
();
if
(
StringUtils
.
isNotBlank
(
sourceName
)
&&
StringUtils
.
endsWithAny
(
sourceName
,
".yml"
,
".yaml"
))
{
YamlPropertiesFactoryBean
factory
=
new
YamlPropertiesFactoryBean
();
factory
.
setResources
(
resource
.
getResource
());
factory
.
afterPropertiesSet
();
return
new
PropertiesPropertySource
(
sourceName
,
factory
.
getObject
());
}
return
super
.
createPropertySource
(
name
,
resource
);
}
}
employmentBusiness-pc-common/employmentBusiness-pc-common-core/src/main/java/org/dromara/common/core/xss/Xss.java
0 → 100644
View file @
ae422217
package
org
.
dromara
.
common
.
core
.
xss
;
import
jakarta.validation.Constraint
;
import
jakarta.validation.Payload
;
import
java.lang.annotation.ElementType
;
import
java.lang.annotation.Retention
;
import
java.lang.annotation.RetentionPolicy
;
import
java.lang.annotation.Target
;
/**
* 自定义xss校验注解
*
* @author Lion Li
*/
@Retention
(
RetentionPolicy
.
RUNTIME
)
@Target
(
value
=
{
ElementType
.
METHOD
,
ElementType
.
FIELD
,
ElementType
.
CONSTRUCTOR
,
ElementType
.
PARAMETER
})
@Constraint
(
validatedBy
=
{
XssValidator
.
class
})
public
@interface
Xss
{
String
message
()
default
"不允许任何脚本运行"
;
Class
<?>[]
groups
()
default
{};
Class
<?
extends
Payload
>[]
payload
()
default
{};
}
employmentBusiness-pc-common/employmentBusiness-pc-common-core/src/main/java/org/dromara/common/core/xss/XssValidator.java
0 → 100644
View file @
ae422217
package
org
.
dromara
.
common
.
core
.
xss
;
import
cn.hutool.core.util.ReUtil
;
import
cn.hutool.http.HtmlUtil
;
import
jakarta.validation.ConstraintValidator
;
import
jakarta.validation.ConstraintValidatorContext
;
/**
* 自定义xss校验注解实现
*
* @author Lion Li
*/
public
class
XssValidator
implements
ConstraintValidator
<
Xss
,
String
>
{
@Override
public
boolean
isValid
(
String
value
,
ConstraintValidatorContext
constraintValidatorContext
)
{
return
!
ReUtil
.
contains
(
HtmlUtil
.
RE_HTML_MARK
,
value
);
}
}
employmentBusiness-pc-common/employmentBusiness-pc-common-web/src/main/java/org/dromara/common/web/config/properties/XssProperties.java
0 → 100644
View file @
ae422217
package
org
.
dromara
.
common
.
web
.
config
.
properties
;
import
lombok.Data
;
import
org.springframework.boot.context.properties.ConfigurationProperties
;
import
org.springframework.cloud.context.config.annotation.RefreshScope
;
import
java.util.ArrayList
;
import
java.util.List
;
/**
* XSS跨站脚本配置
*
* @author Lion Li
*/
@Data
@RefreshScope
@ConfigurationProperties
(
prefix
=
"xss"
)
public
class
XssProperties
{
/**
* Xss开关
*/
private
Boolean
enabled
;
/**
* 排除路径
*/
private
List
<
String
>
excludeUrls
=
new
ArrayList
<>();
}
employmentBusiness-pc-common/employmentBusiness-pc-common-web/src/main/java/org/dromara/common/web/filter/XssFilter.java
0 → 100644
View file @
ae422217
package
org
.
dromara
.
common
.
web
.
filter
;
import
jakarta.servlet.*
;
import
jakarta.servlet.http.HttpServletRequest
;
import
jakarta.servlet.http.HttpServletResponse
;
import
org.dromara.common.core.utils.SpringUtils
;
import
org.dromara.common.core.utils.StringUtils
;
import
org.dromara.common.web.config.properties.XssProperties
;
import
org.springframework.http.HttpMethod
;
import
java.io.IOException
;
import
java.util.ArrayList
;
import
java.util.List
;
/**
* 防止XSS攻击的过滤器
*
* @author ruoyi
*/
public
class
XssFilter
implements
Filter
{
/**
* 排除链接
*/
public
List
<
String
>
excludes
=
new
ArrayList
<>();
@Override
public
void
init
(
FilterConfig
filterConfig
)
throws
ServletException
{
XssProperties
properties
=
SpringUtils
.
getBean
(
XssProperties
.
class
);
String
appName
=
SpringUtils
.
getApplicationName
();
String
appPath
=
"/"
+
StringUtils
.
substring
(
appName
,
appName
.
indexOf
(
"-"
)
+
1
);
List
<
String
>
excludeUrls
=
properties
.
getExcludeUrls
()
.
stream
()
.
filter
(
x
->
StringUtils
.
startsWith
(
x
,
appPath
))
.
map
(
x
->
x
.
replaceFirst
(
appPath
,
StringUtils
.
EMPTY
))
.
toList
();
excludes
.
addAll
(
excludeUrls
);
}
@Override
public
void
doFilter
(
ServletRequest
request
,
ServletResponse
response
,
FilterChain
chain
)
throws
IOException
,
ServletException
{
HttpServletRequest
req
=
(
HttpServletRequest
)
request
;
HttpServletResponse
resp
=
(
HttpServletResponse
)
response
;
if
(
handleExcludeURL
(
req
,
resp
))
{
chain
.
doFilter
(
request
,
response
);
return
;
}
XssHttpServletRequestWrapper
xssRequest
=
new
XssHttpServletRequestWrapper
((
HttpServletRequest
)
request
);
chain
.
doFilter
(
xssRequest
,
response
);
}
private
boolean
handleExcludeURL
(
HttpServletRequest
request
,
HttpServletResponse
response
)
{
String
url
=
request
.
getServletPath
();
String
method
=
request
.
getMethod
();
// GET DELETE 不过滤
if
(
method
==
null
||
HttpMethod
.
GET
.
matches
(
method
)
||
HttpMethod
.
DELETE
.
matches
(
method
))
{
return
true
;
}
return
StringUtils
.
matches
(
url
,
excludes
);
}
@Override
public
void
destroy
()
{
}
}
employmentBusiness-pc-common/employmentBusiness-pc-common-web/src/main/java/org/dromara/common/web/filter/XssHttpServletRequestWrapper.java
0 → 100644
View file @
ae422217
package
org
.
dromara
.
common
.
web
.
filter
;
import
cn.hutool.core.io.IoUtil
;
import
cn.hutool.core.map.MapUtil
;
import
cn.hutool.core.util.ArrayUtil
;
import
cn.hutool.core.util.StrUtil
;
import
cn.hutool.http.HtmlUtil
;
import
jakarta.servlet.ReadListener
;
import
jakarta.servlet.ServletInputStream
;
import
jakarta.servlet.http.HttpServletRequest
;
import
jakarta.servlet.http.HttpServletRequestWrapper
;
import
org.dromara.common.core.utils.StringUtils
;
import
org.springframework.http.HttpHeaders
;
import
org.springframework.http.MediaType
;
import
java.io.ByteArrayInputStream
;
import
java.io.IOException
;
import
java.nio.charset.StandardCharsets
;
import
java.util.HashMap
;
import
java.util.Map
;
/**
* XSS过滤处理
*
* @author ruoyi
*/
public
class
XssHttpServletRequestWrapper
extends
HttpServletRequestWrapper
{
/**
* @param request
*/
public
XssHttpServletRequestWrapper
(
HttpServletRequest
request
)
{
super
(
request
);
}
@Override
public
String
getParameter
(
String
name
)
{
String
value
=
super
.
getParameter
(
name
);
if
(
value
==
null
)
{
return
null
;
}
return
HtmlUtil
.
cleanHtmlTag
(
value
).
trim
();
}
@Override
public
Map
<
String
,
String
[]>
getParameterMap
()
{
Map
<
String
,
String
[]>
valueMap
=
super
.
getParameterMap
();
if
(
MapUtil
.
isEmpty
(
valueMap
))
{
return
valueMap
;
}
// 避免某些容器不允许改参数的情况 copy一份重新改
Map
<
String
,
String
[]>
map
=
new
HashMap
<>(
valueMap
.
size
());
map
.
putAll
(
valueMap
);
for
(
Map
.
Entry
<
String
,
String
[]>
entry
:
map
.
entrySet
())
{
String
[]
values
=
entry
.
getValue
();
if
(
values
!=
null
)
{
int
length
=
values
.
length
;
String
[]
escapseValues
=
new
String
[
length
];
for
(
int
i
=
0
;
i
<
length
;
i
++)
{
// 防xss攻击和过滤前后空格
escapseValues
[
i
]
=
HtmlUtil
.
cleanHtmlTag
(
values
[
i
]).
trim
();
}
map
.
put
(
entry
.
getKey
(),
escapseValues
);
}
}
return
map
;
}
@Override
public
String
[]
getParameterValues
(
String
name
)
{
String
[]
values
=
super
.
getParameterValues
(
name
);
if
(
ArrayUtil
.
isEmpty
(
values
))
{
return
values
;
}
int
length
=
values
.
length
;
String
[]
escapseValues
=
new
String
[
length
];
for
(
int
i
=
0
;
i
<
length
;
i
++)
{
// 防xss攻击和过滤前后空格
escapseValues
[
i
]
=
HtmlUtil
.
cleanHtmlTag
(
values
[
i
]).
trim
();
}
return
escapseValues
;
}
@Override
public
ServletInputStream
getInputStream
()
throws
IOException
{
// 非json类型,直接返回
if
(!
isJsonRequest
())
{
return
super
.
getInputStream
();
}
// 为空,直接返回
String
json
=
StrUtil
.
str
(
IoUtil
.
readBytes
(
super
.
getInputStream
(),
false
),
StandardCharsets
.
UTF_8
);
if
(
StringUtils
.
isEmpty
(
json
))
{
return
super
.
getInputStream
();
}
// xss过滤
json
=
HtmlUtil
.
cleanHtmlTag
(
json
).
trim
();
byte
[]
jsonBytes
=
json
.
getBytes
(
StandardCharsets
.
UTF_8
);
final
ByteArrayInputStream
bis
=
IoUtil
.
toStream
(
jsonBytes
);
return
new
ServletInputStream
()
{
@Override
public
boolean
isFinished
()
{
return
true
;
}
@Override
public
boolean
isReady
()
{
return
true
;
}
@Override
public
int
available
()
throws
IOException
{
return
jsonBytes
.
length
;
}
@Override
public
void
setReadListener
(
ReadListener
readListener
)
{
}
@Override
public
int
read
()
throws
IOException
{
return
bis
.
read
();
}
};
}
/**
* 是否是Json请求
*/
public
boolean
isJsonRequest
()
{
String
header
=
super
.
getHeader
(
HttpHeaders
.
CONTENT_TYPE
);
return
StringUtils
.
startsWithIgnoreCase
(
header
,
MediaType
.
APPLICATION_JSON_VALUE
);
}
}
employmentBusiness-pc-modules/employmentBusiness-pc-system/src/main/java/com/bkty/system/config/YyptUrlProperties.java
0 → 100644
View file @
ae422217
package
com
.
bkty
.
system
.
config
;
import
lombok.Data
;
import
org.springframework.boot.context.properties.ConfigurationProperties
;
import
org.springframework.cloud.context.config.annotation.RefreshScope
;
import
org.springframework.stereotype.Component
;
@Data
@Component
@RefreshScope
@ConfigurationProperties
(
prefix
=
"yypt"
)
public
class
YyptUrlProperties
{
/**
* 运营平台登录账号
*/
private
String
account
;
/**
* 运营平台登录密码
*/
private
String
password
;
/**
* 运营平台登录url
*/
private
String
tokenUrl
;
/**
* 学生档案信息推送接口
*/
private
String
studentUrl
;
/**
* 删除学生档案信息推送接口
*/
private
String
delStudentUrl
;
/**
* 查询权益数据(学校端使用)
*/
private
String
vipUrl
;
/**
* 添加权益与学生关联表_学校端
*/
private
String
interestStudentUrl
;
/**
* 修改权益下的用户领取时间使用
*/
private
String
collectTimeTaskUrl
;
/**
* 概览数据预处理
*/
private
String
statisticsOverviewUrl
;
/**
* 查询权益包数据(学校端使用)
*/
private
String
vipUrlPackage
;
/**
* 用户画像求职偏好统计
*/
private
String
portraitJobUrl
;
/**
* 简历智作统计数据预处理
*/
private
String
resumeSmartUrl
;
/**
* 模拟面试统计数据预处理
*/
private
String
simulationInterviewUrl
;
/**
* 获取用户移动端注册时间
*/
private
String
studentUserCreateTimeUrl
;
/**
* 简历下载接口
*/
private
String
resumeDownloadUrl
;
/**
* 学校岗位
*/
private
String
positionRecommendUrl
;
/**
* 查询企业信息列表
*/
private
String
queryCompanyList
;
/**
* 发送企业信息
*/
private
String
sendCompanyRisk
;
/**
* 轮询企业信息
*/
private
String
retrieve
;
/**
* 查询企业信息结果
*/
private
String
queryCompanyRisk
;
/**
* 获取开发token
*/
private
String
getOpenToken
;
/**
* 获取个人画像AI
*/
private
String
queryStudentAi
;
/**
* 教师端接口
*/
private
String
teacherUrl
;
/**
* 文件上传功能Minio
*/
private
String
schoolFileUrl
;
/**
* offce分析
*/
private
String
offerAnalysis
;
/**
* 拿到offce分析结果匹配岗位
*/
private
String
offerAnalysisDetails
;
/**
* 查询结果
*/
private
String
messageList
;
/**
* 查询开始分析offce结果
*/
private
String
offceResult
;
/**
* 学校端简历优化
*/
private
String
resumeOptimization
;
/**
* 学校端简历优化轮询
*/
private
String
resumeOptimizationPolling
;
/**
* 优化后简历地址
*/
private
String
createResumeFile
;
/**
* 查询求职意愿
*/
private
String
queryRecommendBase
;
/**
* AI洞析
*/
private
String
queryAiHoleLeaders
;
private
String
appUrl
;
}
employmentBusiness-pc-nacos/src/main/java/com/alibaba/nacos/console/filter/XssFilter.java
0 → 100644
View file @
ae422217
/*
* Copyright 1999-2018 Alibaba Group Holding Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package
com
.
alibaba
.
nacos
.
console
.
filter
;
import
org.springframework.web.filter.OncePerRequestFilter
;
import
javax.servlet.FilterChain
;
import
javax.servlet.ServletException
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletResponse
;
import
java.io.IOException
;
/**
* XSS filter.
* @author onewe
*/
public
class
XssFilter
extends
OncePerRequestFilter
{
private
static
final
String
CONTENT_SECURITY_POLICY_HEADER
=
"Content-Security-Policy"
;
private
static
final
String
CONTENT_SECURITY_POLICY
=
"script-src 'self'"
;
@Override
protected
void
doFilterInternal
(
HttpServletRequest
request
,
HttpServletResponse
response
,
FilterChain
filterChain
)
throws
ServletException
,
IOException
{
response
.
setHeader
(
CONTENT_SECURITY_POLICY_HEADER
,
CONTENT_SECURITY_POLICY
);
filterChain
.
doFilter
(
request
,
response
);
}
}
employmentBusiness-pc-nacos/src/main/resources/static/console-ui/public/js/vs/base/worker/workerMain.js
0 → 100644
View file @
ae422217
This diff could not be displayed because it is too large.
employmentBusiness-pc-nacos/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/xml.js
0 → 100644
View file @
ae422217
/*!-----------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* monaco-languages version: 0.9.0(e162b4ba29044167bc7181c42b3270fa8a467424)
* Released under the MIT license
* https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md
*-----------------------------------------------------------------------------*/
define
(
"vs/basic-languages/src/xml"
,[
"require"
,
"exports"
],
function
(
e
,
t
){
"use strict"
;
Object
.
defineProperty
(
t
,
"__esModule"
,{
value
:
!
0
}),
t
.
conf
=
{
comments
:{
blockComment
:[
"\x3c!--"
,
"--\x3e"
]},
brackets
:[[
"<"
,
">"
]],
autoClosingPairs
:[{
open
:
"<"
,
close
:
">"
},{
open
:
"'"
,
close
:
"'"
},{
open
:
'"'
,
close
:
'"'
}],
surroundingPairs
:[{
open
:
"<"
,
close
:
">"
},{
open
:
"'"
,
close
:
"'"
},{
open
:
'"'
,
close
:
'"'
}]},
t
.
language
=
{
defaultToken
:
""
,
tokenPostfix
:
".xml"
,
ignoreCase
:
!
0
,
qualifiedName
:
/
(?:[\w\.\-]
+:
)?[\w\.\-]
+/
,
tokenizer
:{
root
:[[
/
[^
<&
]
+/
,
""
],{
include
:
"@whitespace"
},[
/
(
<
)(
@qualifiedName
)
/
,[{
token
:
"delimiter"
},{
token
:
"tag"
,
next
:
"@tag"
}]],[
/
(
<
\/)(
@qualifiedName
)(\s
*
)(
>
)
/
,[{
token
:
"delimiter"
},{
token
:
"tag"
},
""
,{
token
:
"delimiter"
}]],[
/
(
<
\?)(
@qualifiedName
)
/
,[{
token
:
"delimiter"
},{
token
:
"metatag"
,
next
:
"@tag"
}]],[
/
(
<
\!)(
@qualifiedName
)
/
,[{
token
:
"delimiter"
},{
token
:
"metatag"
,
next
:
"@tag"
}]],[
/<
\!\[
CDATA
\[
/
,{
token
:
"delimiter.cdata"
,
next
:
"@cdata"
}],[
/&
\w
+;/
,
"string.escape"
]],
cdata
:[[
/
[^\]]
+/
,
""
],[
/
\]\]
>/
,{
token
:
"delimiter.cdata"
,
next
:
"@pop"
}],[
/
\]
/
,
""
]],
tag
:[[
/
[
\t\r\n]
+/
,
""
],[
/
(
@qualifiedName
)(\s
*=
\s
*
)(
"
[^
"
]
*"|'
[^
'
]
*'
)
/
,[
"attribute.name"
,
""
,
"attribute.value"
]],[
/
(
@qualifiedName
)(\s
*=
\s
*
)(
"
[^
">?
\/]
*|'
[^
'>?
\/]
*
)(?=[\?\/]\>)
/
,[
"attribute.name"
,
""
,
"attribute.value"
]],[
/
(
@qualifiedName
)(\s
*=
\s
*
)(
"
[^
">
]
*|'
[^
'>
]
*
)
/
,[
"attribute.name"
,
""
,
"attribute.value"
]],[
/@qualifiedName/
,
"attribute.name"
],[
/
\?
>/
,{
token
:
"delimiter"
,
next
:
"@pop"
}],[
/
(\/)(
>
)
/
,[{
token
:
"tag"
},{
token
:
"delimiter"
,
next
:
"@pop"
}]],[
/>/
,{
token
:
"delimiter"
,
next
:
"@pop"
}]],
whitespace
:[[
/
[
\t\r\n]
+/
,
""
],[
/<!--/
,{
token
:
"comment"
,
next
:
"@comment"
}]],
comment
:[[
/
[^
<
\-]
+/
,
"comment.content"
],[
/-->/
,{
token
:
"comment"
,
next
:
"@pop"
}],[
/<!--/
,
"comment.content.invalid"
],[
/
[
<
\-]
/
,
"comment.content"
]]}}});
\ No newline at end of file
employmentBusiness-pc-nacos/src/main/resources/static/console-ui/public/js/vs/basic-languages/src/yaml.js
0 → 100644
View file @
ae422217
/*!-----------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* monaco-languages version: 0.9.0(e162b4ba29044167bc7181c42b3270fa8a467424)
* Released under the MIT license
* https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md
*-----------------------------------------------------------------------------*/
define
(
"vs/basic-languages/src/yaml"
,[
"require"
,
"exports"
],
function
(
e
,
n
){
"use strict"
;
Object
.
defineProperty
(
n
,
"__esModule"
,{
value
:
!
0
}),
n
.
conf
=
{
comments
:{
lineComment
:
"#"
},
brackets
:[[
"{"
,
"}"
],[
"["
,
"]"
],[
"("
,
")"
]],
autoClosingPairs
:[{
open
:
"{"
,
close
:
"}"
},{
open
:
"["
,
close
:
"]"
},{
open
:
"("
,
close
:
")"
},{
open
:
'"'
,
close
:
'"'
},{
open
:
"'"
,
close
:
"'"
}],
surroundingPairs
:[{
open
:
"{"
,
close
:
"}"
},{
open
:
"["
,
close
:
"]"
},{
open
:
"("
,
close
:
")"
},{
open
:
'"'
,
close
:
'"'
},{
open
:
"'"
,
close
:
"'"
}]},
n
.
language
=
{
tokenPostfix
:
".yaml"
,
brackets
:[{
token
:
"delimiter.bracket"
,
open
:
"{"
,
close
:
"}"
},{
token
:
"delimiter.square"
,
open
:
"["
,
close
:
"]"
}],
keywords
:[
"true"
,
"True"
,
"TRUE"
,
"false"
,
"False"
,
"FALSE"
,
"null"
,
"Null"
,
"Null"
,
"~"
],
numberInteger
:
/
(?:
0|
[
+-
]?[
0-9
]
+
)
/
,
numberFloat
:
/
(?:
0|
[
+-
]?[
0-9
]
+
)(?:\.[
0-9
]
+
)?(?:
e
[
-+
][
1-9
][
0-9
]
*
)?
/
,
numberOctal
:
/0o
[
0-7
]
+/
,
numberHex
:
/0x
[
0-9a-fA-F
]
+/
,
numberInfinity
:
/
[
+-
]?\.(?:
inf|Inf|INF
)
/
,
numberNaN
:
/
\.(?:
nan|Nan|NAN
)
/
,
numberDate
:
/
\d{4}
-
\d\d
-
\d\d([
Tt
]\d\d
:
\d\d
:
\d\d(\.\d
+
)?((
?[
+-
]\d\d?(
:
\d\d)?)
|Z
)?)?
/
,
escapes
:
/
\\(?:[
btnfr
\\
"'
]
|
[
0-7
][
0-7
]?
|
[
0-3
][
0-7
]{2})
/
,
tokenizer
:{
root
:[{
include
:
"@whitespace"
},{
include
:
"@comment"
},[
/%
[^
]
+.*$/
,
"meta.directive"
],[
/---/
,
"operators.directivesEnd"
],[
/
\.{3}
/
,
"operators.documentEnd"
],[
/
[
-?:
](?=
)
/
,
"operators"
],{
include
:
"@anchor"
},{
include
:
"@tagHandle"
},{
include
:
"@flowCollections"
},{
include
:
"@blockStyle"
},[
/@numberInteger
(?![
\t]
*
\S
+
)
/
,
"number"
],[
/@numberFloat
(?![
\t]
*
\S
+
)
/
,
"number.float"
],[
/@numberOctal
(?![
\t]
*
\S
+
)
/
,
"number.octal"
],[
/@numberHex
(?![
\t]
*
\S
+
)
/
,
"number.hex"
],[
/@numberInfinity
(?![
\t]
*
\S
+
)
/
,
"number.infinity"
],[
/@numberNaN
(?![
\t]
*
\S
+
)
/
,
"number.nan"
],[
/@numberDate
(?![
\t]
*
\S
+
)
/
,
"number.date"
],[
/
(
".*
?
"|'.*
?
'|.*
?)([
\t]
*
)(
:
)(
|$
)
/
,[
"type"
,
"white"
,
"operators"
,
"white"
]],{
include
:
"@flowScalars"
},[
/.+$/
,{
cases
:{
"@keywords"
:
"keyword"
,
"@default"
:
"string"
}}]],
object
:[{
include
:
"@whitespace"
},{
include
:
"@comment"
},[
/
\}
/
,
"@brackets"
,
"@pop"
],[
/,/
,
"delimiter.comma"
],[
/:
(?=
)
/
,
"operators"
],[
/
(?:
".*
?
"|'.*
?
'|
[^
,
\{\[]
+
?)(?=
:
)
/
,
"type"
],{
include
:
"@flowCollections"
},{
include
:
"@flowScalars"
},{
include
:
"@tagHandle"
},{
include
:
"@anchor"
},{
include
:
"@flowNumber"
},[
/
[^\}
,
]
+/
,{
cases
:{
"@keywords"
:
"keyword"
,
"@default"
:
"string"
}}]],
array
:[{
include
:
"@whitespace"
},{
include
:
"@comment"
},[
/
\]
/
,
"@brackets"
,
"@pop"
],[
/,/
,
"delimiter.comma"
],{
include
:
"@flowCollections"
},{
include
:
"@flowScalars"
},{
include
:
"@tagHandle"
},{
include
:
"@anchor"
},{
include
:
"@flowNumber"
},[
/
[^\]
,
]
+/
,{
cases
:{
"@keywords"
:
"keyword"
,
"@default"
:
"string"
}}]],
string
:[[
/
[^\\
"'
]
+/
,
"string"
],[
/@escapes/
,
"string.escape"
],[
/
\\
./
,
"string.escape.invalid"
],[
/
[
"'
]
/
,{
cases
:{
"$#==$S2"
:{
token
:
"string"
,
next
:
"@pop"
},
"@default"
:
"string"
}}]],
multiString
:[[
/^
(
+
)
.+$/
,
"string"
,
"@multiStringContinued.$1"
]],
multiStringContinued
:[[
/^
(
*
)
.+$/
,{
cases
:{
"$1==$S2"
:
"string"
,
"@default"
:{
token
:
"@rematch"
,
next
:
"@popall"
}}}]],
whitespace
:[[
/
[
\t\r\n]
+/
,
"white"
]],
comment
:[[
/#.*$/
,
"comment"
]],
flowCollections
:[[
/
\[
/
,
"@brackets"
,
"@array"
],[
/
\{
/
,
"@brackets"
,
"@object"
]],
flowScalars
:[[
/"/
,
"string"
,
'@string."'
],[
/'/
,
"string"
,
"@string.'"
]],
blockStyle
:[[
/
[
>|
][
0-9
]
*
[
+-
]?
$/
,
"operators"
,
"@multiString"
]],
flowNumber
:[[
/@numberInteger
(?=[
\t]
*
[
,
\]\}])
/
,
"number"
],[
/@numberFloat
(?=[
\t]
*
[
,
\]\}])
/
,
"number.float"
],[
/@numberOctal
(?=[
\t]
*
[
,
\]\}])
/
,
"number.octal"
],[
/@numberHex
(?=[
\t]
*
[
,
\]\}])
/
,
"number.hex"
],[
/@numberInfinity
(?=[
\t]
*
[
,
\]\}])
/
,
"number.infinity"
],[
/@numberNaN
(?=[
\t]
*
[
,
\]\}])
/
,
"number.nan"
],[
/@numberDate
(?=[
\t]
*
[
,
\]\}])
/
,
"number.date"
]],
tagHandle
:[[
/
\![^
]
*/
,
"tag"
]],
anchor
:[[
/
[
&*
][^
]
+/
,
"namespace"
]]}}});
\ No newline at end of file
employmentBusiness-pc-nacos/src/main/resources/static/console-ui/public/js/xml.js
0 → 100644
View file @
ae422217
/*
* Copyright 1999-2018 Alibaba Group Holding Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
(
function
(
mod
)
{
if
(
typeof
exports
==
"object"
&&
typeof
module
==
"object"
)
// CommonJS
mod
(
require
(
"../../lib/codemirror"
));
else
if
(
typeof
define
==
"function"
&&
define
.
amd
)
// AMD
define
([
"../../lib/codemirror"
],
mod
);
else
// Plain browser env
mod
(
CodeMirror
);
})(
function
(
CodeMirror
)
{
"use strict"
;
var
htmlConfig
=
{
autoSelfClosers
:
{
'area'
:
true
,
'base'
:
true
,
'br'
:
true
,
'col'
:
true
,
'command'
:
true
,
'embed'
:
true
,
'frame'
:
true
,
'hr'
:
true
,
'img'
:
true
,
'input'
:
true
,
'keygen'
:
true
,
'link'
:
true
,
'meta'
:
true
,
'param'
:
true
,
'source'
:
true
,
'track'
:
true
,
'wbr'
:
true
,
'menuitem'
:
true
},
implicitlyClosed
:
{
'dd'
:
true
,
'li'
:
true
,
'optgroup'
:
true
,
'option'
:
true
,
'p'
:
true
,
'rp'
:
true
,
'rt'
:
true
,
'tbody'
:
true
,
'td'
:
true
,
'tfoot'
:
true
,
'th'
:
true
,
'tr'
:
true
},
contextGrabbers
:
{
'dd'
:
{
'dd'
:
true
,
'dt'
:
true
},
'dt'
:
{
'dd'
:
true
,
'dt'
:
true
},
'li'
:
{
'li'
:
true
},
'option'
:
{
'option'
:
true
,
'optgroup'
:
true
},
'optgroup'
:
{
'optgroup'
:
true
},
'p'
:
{
'address'
:
true
,
'article'
:
true
,
'aside'
:
true
,
'blockquote'
:
true
,
'dir'
:
true
,
'div'
:
true
,
'dl'
:
true
,
'fieldset'
:
true
,
'footer'
:
true
,
'form'
:
true
,
'h1'
:
true
,
'h2'
:
true
,
'h3'
:
true
,
'h4'
:
true
,
'h5'
:
true
,
'h6'
:
true
,
'header'
:
true
,
'hgroup'
:
true
,
'hr'
:
true
,
'menu'
:
true
,
'nav'
:
true
,
'ol'
:
true
,
'p'
:
true
,
'pre'
:
true
,
'section'
:
true
,
'table'
:
true
,
'ul'
:
true
},
'rp'
:
{
'rp'
:
true
,
'rt'
:
true
},
'rt'
:
{
'rp'
:
true
,
'rt'
:
true
},
'tbody'
:
{
'tbody'
:
true
,
'tfoot'
:
true
},
'td'
:
{
'td'
:
true
,
'th'
:
true
},
'tfoot'
:
{
'tbody'
:
true
},
'th'
:
{
'td'
:
true
,
'th'
:
true
},
'thead'
:
{
'tbody'
:
true
,
'tfoot'
:
true
},
'tr'
:
{
'tr'
:
true
}
},
doNotIndent
:
{
"pre"
:
true
},
allowUnquoted
:
true
,
allowMissing
:
true
,
caseFold
:
true
}
var
xmlConfig
=
{
autoSelfClosers
:
{},
implicitlyClosed
:
{},
contextGrabbers
:
{},
doNotIndent
:
{},
allowUnquoted
:
false
,
allowMissing
:
false
,
caseFold
:
false
}
CodeMirror
.
defineMode
(
"xml"
,
function
(
editorConf
,
config_
)
{
var
indentUnit
=
editorConf
.
indentUnit
var
config
=
{}
var
defaults
=
config_
.
htmlMode
?
htmlConfig
:
xmlConfig
for
(
var
prop
in
defaults
)
config
[
prop
]
=
defaults
[
prop
]
for
(
var
prop
in
config_
)
config
[
prop
]
=
config_
[
prop
]
// Return variables for tokenizers
var
type
,
setStyle
;
function
inText
(
stream
,
state
)
{
function
chain
(
parser
)
{
state
.
tokenize
=
parser
;
return
parser
(
stream
,
state
);
}
var
ch
=
stream
.
next
();
if
(
ch
==
"<"
)
{
if
(
stream
.
eat
(
"!"
))
{
if
(
stream
.
eat
(
"["
))
{
if
(
stream
.
match
(
"CDATA["
))
return
chain
(
inBlock
(
"atom"
,
"]]>"
));
else
return
null
;
}
else
if
(
stream
.
match
(
"--"
))
{
return
chain
(
inBlock
(
"comment"
,
"-->"
));
}
else
if
(
stream
.
match
(
"DOCTYPE"
,
true
,
true
))
{
stream
.
eatWhile
(
/
[\w\.
_
\-]
/
);
return
chain
(
doctype
(
1
));
}
else
{
return
null
;
}
}
else
if
(
stream
.
eat
(
"?"
))
{
stream
.
eatWhile
(
/
[\w\.
_
\-]
/
);
state
.
tokenize
=
inBlock
(
"meta"
,
"?>"
);
return
"meta"
;
}
else
{
type
=
stream
.
eat
(
"/"
)
?
"closeTag"
:
"openTag"
;
state
.
tokenize
=
inTag
;
return
"tag bracket"
;
}
}
else
if
(
ch
==
"&"
)
{
var
ok
;
if
(
stream
.
eat
(
"#"
))
{
if
(
stream
.
eat
(
"x"
))
{
ok
=
stream
.
eatWhile
(
/
[
a-fA-F
\d]
/
)
&&
stream
.
eat
(
";"
);
}
else
{
ok
=
stream
.
eatWhile
(
/
[\d]
/
)
&&
stream
.
eat
(
";"
);
}
}
else
{
ok
=
stream
.
eatWhile
(
/
[\w\.\-
:
]
/
)
&&
stream
.
eat
(
";"
);
}
return
ok
?
"atom"
:
"error"
;
}
else
{
stream
.
eatWhile
(
/
[^
&<
]
/
);
return
null
;
}
}
inText
.
isInText
=
true
;
function
inTag
(
stream
,
state
)
{
var
ch
=
stream
.
next
();
if
(
ch
==
">"
||
(
ch
==
"/"
&&
stream
.
eat
(
">"
)))
{
state
.
tokenize
=
inText
;
type
=
ch
==
">"
?
"endTag"
:
"selfcloseTag"
;
return
"tag bracket"
;
}
else
if
(
ch
==
"="
)
{
type
=
"equals"
;
return
null
;
}
else
if
(
ch
==
"<"
)
{
state
.
tokenize
=
inText
;
state
.
state
=
baseState
;
state
.
tagName
=
state
.
tagStart
=
null
;
var
next
=
state
.
tokenize
(
stream
,
state
);
return
next
?
next
+
" tag error"
:
"tag error"
;
}
else
if
(
/
[\'\"]
/
.
test
(
ch
))
{
state
.
tokenize
=
inAttribute
(
ch
);
state
.
stringStartCol
=
stream
.
column
();
return
state
.
tokenize
(
stream
,
state
);
}
else
{
stream
.
match
(
/^
[^\s\u
00a0=<>
\"\']
*
[^\s\u
00a0=<>
\"\'\/]
/
);
return
"word"
;
}
}
function
inAttribute
(
quote
)
{
var
closure
=
function
(
stream
,
state
)
{
while
(
!
stream
.
eol
())
{
if
(
stream
.
next
()
==
quote
)
{
state
.
tokenize
=
inTag
;
break
;
}
}
return
"string"
;
};
closure
.
isInAttribute
=
true
;
return
closure
;
}
function
inBlock
(
style
,
terminator
)
{
return
function
(
stream
,
state
)
{
while
(
!
stream
.
eol
())
{
if
(
stream
.
match
(
terminator
))
{
state
.
tokenize
=
inText
;
break
;
}
stream
.
next
();
}
return
style
;
};
}
function
doctype
(
depth
)
{
return
function
(
stream
,
state
)
{
var
ch
;
while
((
ch
=
stream
.
next
())
!=
null
)
{
if
(
ch
==
"<"
)
{
state
.
tokenize
=
doctype
(
depth
+
1
);
return
state
.
tokenize
(
stream
,
state
);
}
else
if
(
ch
==
">"
)
{
if
(
depth
==
1
)
{
state
.
tokenize
=
inText
;
break
;
}
else
{
state
.
tokenize
=
doctype
(
depth
-
1
);
return
state
.
tokenize
(
stream
,
state
);
}
}
}
return
"meta"
;
};
}
function
Context
(
state
,
tagName
,
startOfLine
)
{
this
.
prev
=
state
.
context
;
this
.
tagName
=
tagName
;
this
.
indent
=
state
.
indented
;
this
.
startOfLine
=
startOfLine
;
if
(
config
.
doNotIndent
.
hasOwnProperty
(
tagName
)
||
(
state
.
context
&&
state
.
context
.
noIndent
))
this
.
noIndent
=
true
;
}
function
popContext
(
state
)
{
if
(
state
.
context
)
state
.
context
=
state
.
context
.
prev
;
}
function
maybePopContext
(
state
,
nextTagName
)
{
var
parentTagName
;
while
(
true
)
{
if
(
!
state
.
context
)
{
return
;
}
parentTagName
=
state
.
context
.
tagName
;
if
(
!
config
.
contextGrabbers
.
hasOwnProperty
(
parentTagName
)
||
!
config
.
contextGrabbers
[
parentTagName
].
hasOwnProperty
(
nextTagName
))
{
return
;
}
popContext
(
state
);
}
}
function
baseState
(
type
,
stream
,
state
)
{
if
(
type
==
"openTag"
)
{
state
.
tagStart
=
stream
.
column
();
return
tagNameState
;
}
else
if
(
type
==
"closeTag"
)
{
return
closeTagNameState
;
}
else
{
return
baseState
;
}
}
function
tagNameState
(
type
,
stream
,
state
)
{
if
(
type
==
"word"
)
{
state
.
tagName
=
stream
.
current
();
setStyle
=
"tag"
;
return
attrState
;
}
else
{
setStyle
=
"error"
;
return
tagNameState
;
}
}
function
closeTagNameState
(
type
,
stream
,
state
)
{
if
(
type
==
"word"
)
{
var
tagName
=
stream
.
current
();
if
(
state
.
context
&&
state
.
context
.
tagName
!=
tagName
&&
config
.
implicitlyClosed
.
hasOwnProperty
(
state
.
context
.
tagName
))
popContext
(
state
);
if
((
state
.
context
&&
state
.
context
.
tagName
==
tagName
)
||
config
.
matchClosing
===
false
)
{
setStyle
=
"tag"
;
return
closeState
;
}
else
{
setStyle
=
"tag error"
;
return
closeStateErr
;
}
}
else
{
setStyle
=
"error"
;
return
closeStateErr
;
}
}
function
closeState
(
type
,
_stream
,
state
)
{
if
(
type
!=
"endTag"
)
{
setStyle
=
"error"
;
return
closeState
;
}
popContext
(
state
);
return
baseState
;
}
function
closeStateErr
(
type
,
stream
,
state
)
{
setStyle
=
"error"
;
return
closeState
(
type
,
stream
,
state
);
}
function
attrState
(
type
,
_stream
,
state
)
{
if
(
type
==
"word"
)
{
setStyle
=
"attribute"
;
return
attrEqState
;
}
else
if
(
type
==
"endTag"
||
type
==
"selfcloseTag"
)
{
var
tagName
=
state
.
tagName
,
tagStart
=
state
.
tagStart
;
state
.
tagName
=
state
.
tagStart
=
null
;
if
(
type
==
"selfcloseTag"
||
config
.
autoSelfClosers
.
hasOwnProperty
(
tagName
))
{
maybePopContext
(
state
,
tagName
);
}
else
{
maybePopContext
(
state
,
tagName
);
state
.
context
=
new
Context
(
state
,
tagName
,
tagStart
==
state
.
indented
);
}
return
baseState
;
}
setStyle
=
"error"
;
return
attrState
;
}
function
attrEqState
(
type
,
stream
,
state
)
{
if
(
type
==
"equals"
)
return
attrValueState
;
if
(
!
config
.
allowMissing
)
setStyle
=
"error"
;
return
attrState
(
type
,
stream
,
state
);
}
function
attrValueState
(
type
,
stream
,
state
)
{
if
(
type
==
"string"
)
return
attrContinuedState
;
if
(
type
==
"word"
&&
config
.
allowUnquoted
)
{
setStyle
=
"string"
;
return
attrState
;}
setStyle
=
"error"
;
return
attrState
(
type
,
stream
,
state
);
}
function
attrContinuedState
(
type
,
stream
,
state
)
{
if
(
type
==
"string"
)
return
attrContinuedState
;
return
attrState
(
type
,
stream
,
state
);
}
return
{
startState
:
function
(
baseIndent
)
{
var
state
=
{
tokenize
:
inText
,
state
:
baseState
,
indented
:
baseIndent
||
0
,
tagName
:
null
,
tagStart
:
null
,
context
:
null
}
if
(
baseIndent
!=
null
)
state
.
baseIndent
=
baseIndent
return
state
},
token
:
function
(
stream
,
state
)
{
if
(
!
state
.
tagName
&&
stream
.
sol
())
state
.
indented
=
stream
.
indentation
();
if
(
stream
.
eatSpace
())
return
null
;
type
=
null
;
var
style
=
state
.
tokenize
(
stream
,
state
);
if
((
style
||
type
)
&&
style
!=
"comment"
)
{
setStyle
=
null
;
state
.
state
=
state
.
state
(
type
||
style
,
stream
,
state
);
if
(
setStyle
)
style
=
setStyle
==
"error"
?
style
+
" error"
:
setStyle
;
}
return
style
;
},
indent
:
function
(
state
,
textAfter
,
fullLine
)
{
var
context
=
state
.
context
;
// Indent multi-line strings (e.g. css).
if
(
state
.
tokenize
.
isInAttribute
)
{
if
(
state
.
tagStart
==
state
.
indented
)
return
state
.
stringStartCol
+
1
;
else
return
state
.
indented
+
indentUnit
;
}
if
(
context
&&
context
.
noIndent
)
return
CodeMirror
.
Pass
;
if
(
state
.
tokenize
!=
inTag
&&
state
.
tokenize
!=
inText
)
return
fullLine
?
fullLine
.
match
(
/^
(\s
*
)
/
)[
0
].
length
:
0
;
// Indent the starts of attribute names.
if
(
state
.
tagName
)
{
if
(
config
.
multilineTagIndentPastTag
!==
false
)
return
state
.
tagStart
+
state
.
tagName
.
length
+
2
;
else
return
state
.
tagStart
+
indentUnit
*
(
config
.
multilineTagIndentFactor
||
1
);
}
if
(
config
.
alignCDATA
&&
/<!
\[
CDATA
\[
/
.
test
(
textAfter
))
return
0
;
var
tagAfter
=
textAfter
&&
/^<
(\/)?([\w
_:
\.
-
]
*
)
/
.
exec
(
textAfter
);
if
(
tagAfter
&&
tagAfter
[
1
])
{
// Closing tag spotted
while
(
context
)
{
if
(
context
.
tagName
==
tagAfter
[
2
])
{
context
=
context
.
prev
;
break
;
}
else
if
(
config
.
implicitlyClosed
.
hasOwnProperty
(
context
.
tagName
))
{
context
=
context
.
prev
;
}
else
{
break
;
}
}
}
else
if
(
tagAfter
)
{
// Opening tag spotted
while
(
context
)
{
var
grabbers
=
config
.
contextGrabbers
[
context
.
tagName
];
if
(
grabbers
&&
grabbers
.
hasOwnProperty
(
tagAfter
[
2
]))
context
=
context
.
prev
;
else
break
;
}
}
while
(
context
&&
context
.
prev
&&
!
context
.
startOfLine
)
context
=
context
.
prev
;
if
(
context
)
return
context
.
indent
+
indentUnit
;
else
return
state
.
baseIndent
||
0
;
},
electricInput
:
/<
\/[\s\w
:
]
+>$/
,
blockCommentStart
:
"<!--"
,
blockCommentEnd
:
"-->"
,
configuration
:
config
.
htmlMode
?
"html"
:
"xml"
,
helperType
:
config
.
htmlMode
?
"html"
:
"xml"
,
skipAttribute
:
function
(
state
)
{
if
(
state
.
state
==
attrValueState
)
state
.
state
=
attrState
}
};
});
CodeMirror
.
defineMIME
(
"text/xml"
,
"xml"
);
CodeMirror
.
defineMIME
(
"application/xml"
,
"xml"
);
if
(
!
CodeMirror
.
mimeModes
.
hasOwnProperty
(
"text/html"
))
CodeMirror
.
defineMIME
(
"text/html"
,
{
name
:
"xml"
,
htmlMode
:
true
});
});
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment