在 Python 上将草稿 .js 文本块转换为 HTML

Draft.js text block conversion into HTML on Python

提问人:GeorgNation 提问时间:8/15/2023 最后编辑:GeorgNation 更新时间:8/15/2023 访问量:44

问:

我需要实施方面的帮助。有以下结构:

{
    "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

Python HTML 解析

评论

0赞 Alderven 8/15/2023
和变量在哪里定义?itemgettertags
0赞 GeorgNation 8/15/2023
我忘了,现在我添加了它。
0赞 Alderven 8/15/2023
为什么你期望双斜体标签:,尽管其中只出现一次。<i>test</i><strike><i>test</i>inlineStyleRanges
0赞 GeorgNation 8/15/2023
一个标签“i”没有标签“strike”,并且由于下面是一个删除线文本的示例,因此标签“i”再次被复制,因为它后面已经跟着标签“b”。
0赞 Alderven 8/15/2023
tag "i" is duplicated again, since it is already followed by the tag "b"— 在这种情况下,脚本的复杂性会显着增加

答: 暂无答案