Javascript html中可编辑文本区域的语法高亮显示

Javascript html中可编辑文本区域的语法高亮显示,javascript,textarea,syntax-highlighting,Javascript,Textarea,Syntax Highlighting,因此,我有一个项目,涉及创建一个类似于pastebin的html Web应用程序。我必须添加语法高亮显示,但我们不允许使用预制语法高亮显示或插件。我们必须从头开始。我知道我必须用javascript来完成。谁能告诉我应该如何创建这个语法高亮显示?根据我在yt上看到的内容,我只做了一些语法突出显示测试,但大部分都是插件 下面是test.html的代码 <!DOCTYPE html> <html> <head> <meta charset="UTF

因此,我有一个项目,涉及创建一个类似于pastebin的html Web应用程序。我必须添加语法高亮显示,但我们不允许使用预制语法高亮显示或插件。我们必须从头开始。我知道我必须用javascript来完成。谁能告诉我应该如何创建这个语法高亮显示?根据我在yt上看到的内容,我只做了一些语法突出显示测试,但大部分都是插件

下面是test.html的代码

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<style>
code {
    display:block;
    white-space: pre-wrap;
    border: 1px solid #000;
    padding: 10px;
    line-height: 1.5em;
    font-family: "Lucida Console", Monaco, monospace;
}
.code-str { color : #090; }
.code-elem{ 
    color: #F90;
}
</style>
<script>
    function syntaxhighlights() {
        var ca = document.getElementsByTagName("code");
        for(var i = 0; i < ca.length; i++ ){
            var data = ca[i].innerHTML;
            data = data.replace (/"(.*?)"/g, '<span class="code-str">&quot;$1&quot;</span>');
            data = data.replace (/&lt;(.*?)&gt;/g, '<span class="code-elem">&lt;$1&gt;</span>');
            ca[i].innerHTML = data;
        }
}
window.addEventListener("load", syntaxhighlights);      
</script>
</head>
<body>
    <h2>Code Example:</h2>
    <code>&lt;h2 id="h21"&gt;Welcome Visitors&lt;/h2&gt;
&lt;p&gt;When in Rome, do as the Romans do.&lt;/p&gt;
    </code> 
</body>

我创建了一个涉及语法突出显示的项目。最好的方法是过度使用正则表达式。您必须为每个令牌创建类。您需要一个函数来获取文本并将其转换为html块。使用可以设置给定文本的格式。只需创建一个渲染类。我的是这样的(我已经很久没有写过了。希望这有帮助):

jsx-parse-engine.js
从'react html parser'导入ReactHtmlParser'
从“../styles/native/code.module.css”导入样式表
从“React”导入React
从“./utility functions”导入{insertArray、replaceString、updateArray}
//添加String.matchAll polyfill,以防未实现
;(() => {
if(!String.prototype.matchAll){
String.prototype.matchAll=函数(regex){
让match=regex.exec(this)
常量匹配=[]
while(匹配!==null){
火柴。推(火柴)
match=regex.exec(此)
}
复赛
}
}
console.log('matchAll polyfill已配置')
})()
const createJSXBuilder=(类名称)=>(v)=>
`${v}`
常量getMatchArray=(内容、模式、生成器)=>{
让matchArray=[]
const results=Array.from(content.matchAll(pattern))
for(结果的常量结果){
常量索引=result.index
常数匹配=结果[0]
常量长度=match.length
matchArray.push([索引、长度、匹配、生成器])
}
返回匹配数组
}
常量sortMatchArray=(匹配数组)=>{
让SortedMatchedaray=[]
让g
for(匹配数组的常量匹配项){
如果(sortedMatchedArray.length==0){
分拣匹配阵列推送(匹配项)
持续
}
g=真
for(设i=0;i{
设指数=0
for(匹配数组的常量匹配){
const jsx=match[3](match[2])
常量beginIndex=匹配[0]+secretIndex
content=replaceString(content,beginIndex,beginIndex+match[1],jsx)
secretIndex+=jsx.length-匹配[2]。长度
}
返回内容
}
导出函数parseSourceCodeToJSX(内容){
让matchArray=[]
常量换行符=/\n/g
常量选项卡=/\t/g
常量parserTokenMap=[
[/@\w+\([\w,]*\)\n/g,createJSXBuilder(StyleSheet.annotation)],
[/(?
}
导出函数parseTextToJSX(内容){
常量换行符=/\n/g
返回{ReactHtmlParser(content.replace(换行符,
')) }
utility-functions.js
导出函数updateArray(arr、索引、值){
返回[…arr.slice(0,索引),值,…arr.slice(索引+1)]
}
导出函数插入数组(arr、索引、值){
返回[…arr.slice(0,索引),值,…arr.slice(索引)]
}
导出函数replaceString(str、begin、end、value){
返回str.substring(0,begin)+value+str.substring(end)
}
code.module.css