gpt4 book ai didi

javascript - react : Rendering a syntax highlighted code block

转载 作者:行者123 更新时间:2023-11-29 15:31:19 26 4
gpt4 key购买 nike

我正在使用 React 和 JSX 开发一个文章系统。我的文章有时在其内容中包含代码示例。我已经实现了 highlight.js 来为这些 block 添加样式。我的主要问题是我的文章使用 HTML 标签,因此我使用 React 的 dangerouslySetInnerHTML 方法。这工作正常,但当然我的代码块中的任何 HTML 代码都会被解释为 HTML。我想知道你们中是否有人对我应该如何实现这一点有任何见解。我是否应该从我的内容中删除所有 HTML 并在安全地将其呈现为文本之前解析它(使用 markdown)?

感谢阅读本文。

最佳答案

我使用 markdown 和 highlight,然后使用 innerHtml。这是来自 https://github.com/calitek/ProjectNotes .

'use strict';

var fs = require('fs');
var Remarkable = require('remarkable');
var hljs = require('highlight.js');
let lodash = require('lodash');

var md = new Remarkable({
highlight: function (str, lang) {
if (lang && hljs.getLanguage(lang)) {
try {
return hljs.highlight(lang, str).value;
} catch (err) {}
}

try {
return hljs.highlightAuto(str).value;
} catch (err) {}

return '';
}
});

var rootDataPath = './data';

var getFile = function(clientData, doneCallBack) {
let getNote = function(fileData) {
var filePath = rootDataPath + '/filenotes.json';
var notesReadCallBack = function(err, data){
if (err) doneCallBack({fileData: fileData, noteData: {note: 'error'}});
else {
let noteData;
var jsonData = JSON.parse(data.toString());
let noteRecord = lodash.findWhere(jsonData, {nodeid: clientData.nodeid});
if (noteRecord) {
let noteIndex = lodash.indexOf(jsonData, noteRecord);
noteData = jsonData[noteIndex];
} else {
noteData = {nodeid: clientData.nodeid, note: ""};
}
let returnObject = {
noteData: noteData,
fileData: fileData
}
return doneCallBack(returnObject);
}
};
fs.readFile(filePath, notesReadCallBack);
}
var fileReadCallBack = function(err, data){
if (err) doneCallBack({note: 'error'});
else {
let inData = data.toString();
let inFile = clientData.filePath;
if (inFile.endsWith('.js') || inFile.endsWith('.json') || inFile.endsWith('.css')) {
inData = '``` javascript\n' + inData + '```';
}

let outData = md.render(inData);
getNote(outData);
}
};
fs.readFile(clientData.filePath, fileReadCallBack);
};

我正在服务器上进行 Markdown 渲染。然后将其发送到组件。

import React from 'react';

let FileCtrlSty = {
height: '60%',
marginBottom: '20px',
width: '100%'
};

export default class FileCtrl extends React.Component {
render() {
let htmlDivSty = {height: '100%', width: '100%'}
if (this.props.fileData.startsWith('<pre>')) htmlDivSty.overflow = 'hidden';
else htmlDivSty.overflow = 'auto';
let fileHtml = {__html: this.props.fileData};
return (
<div id='FileCtrlSty' style={FileCtrlSty}>
<div dangerouslySetInnerHTML={fileHtml} style={htmlDivSty}></div>
</div>
);
}
}

关于javascript - react : Rendering a syntax highlighted code block,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34578261/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com