解决Sphinx下reStructuredText中英文混合换行导致生成的HTML多出空格

2023-05-16

问题起因

比如reStructuredText源文件里的这段文字:

除某些病毒的基因由RNA(核糖核酸)构成以外,多数生物的基因由DNA(脱氧核糖核酸)
构成,并在染色体上作线状排列。基因一词通常指染色体基因。在真核生物中,由于
染色体都在细胞核内,所以又称为核基因。位于线粒体和叶绿体等细胞器中的基因则称为
染色体外基因、核外基因或细胞质基因,也可以分别称为线粒体基因、基因质粒和
叶绿体基因。在核基因或细胞质基因中都储存着遗传信息。

Sphinx生成的HTML页面效果是这样的:

Sphinx生成效果

仔细看会发现一个问题,段落在原始文字换行的地方产生了一个空白(红色圈起来的地方):

多出的空白

为了解决这个问题,我在CSDN上找到了这篇文章:「reStructuredText/Sphinx中文段落内换行导致生成的HTML多出空格的问题」

按照文章给出的代码我弄了个Sphinx扩展,虽然空白是去了,但是一旦遇到像这样的内容:

下面用C语言实现一个自定义的函数——计算给定两个整数的和:

.. code-block:: c

    int add(int a, int b) {
        return a + b;
    }

输出的页面就会变成这样子了:

去除换行空白后效果

这种显示效果显然是有问题的——这里的 code-block 插入的代码是不能去掉换行的。

此外还有一个问题。如果遇到纯英文的段落一般会在英文单词和单词之间进行换行,这时换行去掉之后两个单词就直接连在一起了。

解决思路

原文是通过在Sphinx的生成过程中移除全部的 \r\n ,从而在生成的HTML里去掉换行符号,最后令显示的时候不出现空白。

为了防止中英文混合场景下全部换行符被去除导致代码和英文排版出现问题,理想的去除换行逻辑应该是:中文字符和中文字符之间的换行符去除,其它情况下的换行符保留。

因此需要一个适应混合中英文字符组成的字符串的替换方法。考虑到英文字符宽度是一个字节,那么找到字符串里的换行符后判断左右两个字符的宽度是几个字节,如果都是大于一个字节的,去掉中间的换行符。这样做基本够用了。

代码实现

# coding=utf-8

# 文件 docs/source/replace_util.py 源码:

import os

def mix_replace(text):
    new_text = text
    pos = 0
    while True:
        pos = new_text.find(os.linesep, pos)
        if pos < 0:
            break
        if pos - 1 < 0:
            pos = pos + 1
            continue
        if pos + 1 > len(new_text) - 1:
            break
        before = new_text[pos - 1]
        after = new_text[pos + 1]
        if len(before.encode()) > 1 and len(after.encode()) > 1:
            new_text = new_text[:pos] + new_text[(pos + 1):]
        else:
            pos = pos + 1
    return new_text

原文的Sphinx扩展改动后:


# 文件 docs/source/remove_newline.py 源码:

import os
from docutils.nodes import NodeVisitor, TextElement, Text
from replace_util import mix_replace

def setup(app):
    app.connect('doctree-resolved', process_chinese_paragraph)

class ParagraphVisitor(NodeVisitor):
    def dispatch_visit(self, node):
        if isinstance(node, TextElement):
            for i in range(len(node.children)):
                if type(node[i]) == Text:
                    # 下面注释掉的是原文实现方式
                    #node[i] = Text(node[i].astext().replace('\r', '').replace('\n', ''))
                    node[i] = Text(mix_replace(node[i].astext()))

def process_chinese_paragraph(app, doctree, fromdocname):
    pv = ParagraphVisitor(doctree)
    doctree.walk(pv)

在本地的Sphinx工程的docs目录添加上面的两个文件后:

目录结构

配置文件 docs/source/conf.py 调整,当前路径添加到模块搜索路径:


# 添加处理加载的模块路径:

import os
import sys

sys.path.insert(0, os.path.abspath('.'))

添加 remove_newline 模块到 extensions


extensions = [
    'remove_newline'
]

完成后重新生成页面,效果:

最终修正后的效果

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

解决Sphinx下reStructuredText中英文混合换行导致生成的HTML多出空格 的相关文章

  • MapReduce实例——好友推荐

    1 实例介绍 好友推荐算法在实际的社交环境中应用较多 xff0c 比如qq软件中的 你可能认识的好友 或者是Facebook中的好友推介 好友推荐功能简单的说是这样一个需求 xff0c 预测某两个人是否认识 xff0c 并推荐为好友 xff
  • Hadoop源码分析——JobClient

    1 MapReduce作业处理过程概述 当用户使用Hadoop的Mapreduce计算模型来进行处理问题时 xff0c 用户只需要定义所需的Mapper和Reduce处理函数 xff0c 还有可能包括的Combiner Comparator
  • 大数据010——Hive

    1 Hive 概述 Hive 是建立在 Hadoop 上的数据仓库基础构架 它提供了一系列的工具 xff0c 可以用来进行数据提取转化加载 xff08 ETL xff09 xff0c 这是一种可以存储 查询和分析存储在 Hadoop 中的大
  • 大数据011——Sqoop

    1 Sqoop 概述 Sqoop是Hadoop和关系数据库服务器之间传送数据的一种工具 它是用来从关系数据库如 xff1a MySQL xff0c Oracle到Hadoop的HDFS xff0c 并从Hadoop的文件系统导出数据到关系数
  • 大数据012——HBase

    1 HBase 简介 HBase Hadoop Database xff0c 是一个高可靠性 高性能 面向列 可伸缩 实时读写的分布式数据库 xff1b 在Hadoop生态圈中 xff0c 它是其中一部分且利用Hadoop HDFS作为其文
  • Hadoop源码分析——MapReduce输入和输出

    Hadoop中的MapReduce库支持集中不同的格式的输入数据 例如 xff0c 文本模式的输入数据的每一行被视为一个key value键值对 key是文件的偏移量 xff0c value是那一行的内容 另一种常见的格式是以key进行排序
  • 大数据013——Flume

    1 Flume 简介 Flume是由Cloudera软件公司提供的一个高可用的 xff0c 高可靠的 xff0c 分布式的海量日志采集 聚合和传输的系统 xff0c 后与2009年被捐赠了apache软件基金会 xff0c 为hadoop相
  • Hadoop源码分析——计算模型MapReduce

    MapReduce 是一个计算模型 xff0c 也是一个处理和生成超大数据集的算法模型的相关实现 用户首先创建一个Map函数处理一个基于key value pair的数据集合 xff0c 输出中间的基于 key value pair 的数据
  • 从SDLC到DevSecOps的转变

    OSSTMM 根据开源安全测试方法手册OSSTMM Open Source Security Testing Methodology Manual 的表述 安全测试包括但不限于以下几种做法 漏洞扫描 安全扫描 渗透测试 风险评估 安全审核
  • 大数据014——Storm 简介及入门案例

    分布式实时数据处理框架 Storm 1 Storm简介与核心概念 1 1 Storm 简介 全称为 Apache Storm xff0c 是一个分布式实时大数据处理系统 它是一个流数据框架 xff0c 具有最高的获取率 它比较简单 xff0
  • Hive与HBase整合详解

    参考之前小节的大数据010 Hive与大数据012 HBase成功搭建Hive和HBase的环境 xff0c 并进行了相应的测试 xff0c 并且在大数据011 Sqoop中实现Hive HBase与MySQL之间的相互转换 xff1b 本
  • 大数据015——Elasticsearch基础

    1 Elasticsearch 简介 Elasticsearch是一个基于Lucene的实时的分布式搜索和分析 引擎 设计用于云计算中 xff0c 能够达到实时搜索 xff0c 稳定 xff0c 可靠 xff0c 快速 xff0c 安装使用
  • 大数据015——Elasticsearch深入

    1 Elasticsearch 核心概念 1 1 cluster 代表一个集群 xff0c 集群中有多个节点 xff0c 其中有一个为主节点 xff0c 这个主节点是可以通过选举产生的 xff0c 主从节点是对于集群内部来说的 es的一个重
  • 大数据014——Storm 集群及入门案例

    分布式实时数据处理框架 Storm 1 Storm 集群 1 1 Storm 版本变更 版本编写语言重要特性HA 高可用0 9 xjava 43 clojule改进与Kafka HDFS HBase的集成不支持 xff0c storm集群只
  • 大数据016——Kafka

    1 Kafka 简介 Kafka 是一个高吞吐量 低延迟分布式的消息队列系统 kafka 每秒可以处理几十万条消息 xff0c 它的延迟最低只有几毫秒 Kafka 也是一个高度可扩展的消息系统 xff0c 它在LinkedIn 的中央数据管
  • 大数据017——Scala基础

    Scala 是一门以 java 虚拟机 xff08 JVM xff09 为目标运行环境并将面向对象和函数式编程语言的最佳特性结合在一起的编程语言 你可以使用Scala 编写出更加精简的程序 xff0c 同时充分利用并发的威力 由于scala
  • 大数据017——Scala进阶

    Scala 基础语法 第二阶段 1 类和对象 1 1 类 1 xff09 简单类和无参方法 如下定义Scala类最简单形式 xff1a class Counter private var value 61 0 必须初始换字段 def inc
  • 大数据018——Spark(一)

    1 Spark 数据分析简介 1 1 Spark 是什么 Spark 是一个用来实现快速而通用的集群计算的平台 在速度方面 xff0c Spark 扩展了广泛使用的 MapReduce 计算模型 xff0c 而且高效地支持更多计算模式 xf
  • ROS 订阅RealsenseD435图像与opencv保存32位深度图像

    一 xff0c 通过ros订阅realsense图像 int main int argc char argv ros init argc argv 34 image listener 34 ros NodeHandle nh cv name
  • 测试左移和右移:不是左右逢源而是左右突击

    持续测试是在软件交付生命周期过程中 xff0c 以防控业务风险为目的 xff0c 将每一个业务交付阶段都辅以测试活动进行质量保障 xff0c 并尽最大可能自动化 xff0c 通过测试结果不断的反馈给制品过程的测试实践活动 随着持续测试实践的

随机推荐