提问人:GeorgNation 提问时间:8/15/2023 最后编辑:GeorgNation 更新时间:8/15/2023 访问量:44
在 Python 上将草稿 .js 文本块转换为 HTML
Draft.js text block conversion into HTML on Python
问:
我需要实施方面的帮助。有以下结构:
{
"data": {},
"depth": 0,
"entityRanges": [],
"inlineStyleRanges": [
{
"length": 4,
"offset": 4,
"style": "BOLD"
},
{
"length": 4,
"offset": 20,
"style": "BOLD"
},
{
"length": 8,
"offset": 8,
"style": "ITALIC"
},
{
"length": 12,
"offset": 12,
"style": "STRIKE"
}
],
"text": "testtesttesttesttesttest",
"type": "unstyled",
"key": "5kucc"
}
有一项任务是将块从 draft.js 转换为 Python,但我在做时遇到了麻烦。
我试着这样做:
from operator import itemgetter
tags = {
"STRIKE": {
"in": "<strike>",
"out": "</strike>"
},
"BOLD": {
"in": "<b>",
"out": "</b>"
},
"ITALIC": {
"in": "<i>",
"out": "</i>"
},
}
def proceedText(block):
inlineStyleRanges = block['inlineStyleRanges']
entityRanges = block['entityRanges']
text = block['text']
result = ""
inlineStyleRanges = sorted(inlineStyleRanges, key=itemgetter('offset'))
entityRanges = sorted(entityRanges, key=itemgetter('offset'))
lenText = len (text)
for i in range(1, lenText + 1):
pos = i - 1
for j in inlineStyleRanges:
if (pos == j['offset']):
result += tags[j['style']]['in']
result += text[pos]
elif (pos == j['offset'] + j['length']):
result += tags[j['style']]['out']
elif (pos > j['offset'] and pos < j['offset'] + j['length']):
result += text[pos]
print(result)
只是在这一点上,代码行为才足够奇怪,至少可以为文本分配样式,更不用说它是在不使用库的情况下完成的。
预期结果:同时,我们也需要帮助来实现 LINK 格式的 entityRanges。
实际结果:此代码尝试遍历所有 inlineStyleRange 字典和属性标记。
代码遍历所有偏移量,如果位置匹配,则放置一个开始或结束的 HTML 标记。没有 HTML 正文,因为我需要它与单独的编辑器集成。出于个人原因,我不打算使用 draft.js。如果有人有使用 lxml 的经验,您可以根据它调整代码。我在 StackOverflow 上没有找到任何其他类似的解决方案。test<b>test</b><i>test</i><strike><i>test</i><b>test</b>test</strike>
<b>test</b><i>testt<strike>teesstt</i>testt<b>teesstt
答: 暂无答案
评论
itemgetter
tags
<i>test</i><strike><i>test</i>
inlineStyleRanges
tag "i" is duplicated again, since it is already followed by the tag "b"
— 在这种情况下,脚本的复杂性会显着增加