生成 Markdown 表?

2024-01-21

有没有办法从对象(Python/Ruby/Java/C#)生成表?

我想以编程方式创建一个简单的表。我有一些对象,我想将一些属性映射到标题,将集合映射到行。

为什么是 Markdown?因为我想稍后手动编辑该文档。现在,整个过程是这样的:

  • 报告引擎是用 C# 编写的
  • 有生成 DOCX 的对象(有中间 XML 或类似的东西)
  • 几乎总是我必须做一些小修改,并且我必须在 MS Word 中打开 docx 文档
  • 要求开发团队修复每个错误很麻烦,因为他们根本没有时间立即修复,我必须等待下一个版本。

我发现如果我得到 Markdown 文档,我可以轻松编辑它,插入一些变量并使用 pandoc 用给定的数据替换这些变量。但要获得 Markdown,我必须知道开发人员如何在 Markdown 中生成表格。


我需要做同样的事情来生成 Doxygen Markdown 表,所以我想我会分享。我已经在 Python 2.7 和 3.3 中成功运行了示例代码,尽管我不能声称我已经对其进行了严格的测试。

# Generates tables for Doxygen flavored Markdown.  See the Doxygen
# documentation for details:
#   http://www.doxygen.nl/manual/markdown.html#md_tables

# Translation dictionaries for table alignment
left_rule = {'<': ':', '^': ':', '>': '-'}
right_rule = {'<': '-', '^': ':', '>': ':'}

def evalute_field(record, field_spec):
    """
    Evalute a field of a record using the type of the field_spec as a guide.
    """
    if type(field_spec) is int:
        return str(record[field_spec])
    elif type(field_spec) is str:
        return str(getattr(record, field_spec))
    else:
        return str(field_spec(record))

def table(file, records, fields, headings, alignment = None):
    """
    Generate a Doxygen-flavor Markdown table from records.

    file -- Any object with a 'write' method that takes a single string
        parameter.
    records -- Iterable.  Rows will be generated from this.
    fields -- List of fields for each row.  Each entry may be an integer,
        string or a function.  If the entry is an integer, it is assumed to be
        an index of each record.  If the entry is a string, it is assumed to be
        a field of each record.  If the entry is a function, it is called with
        the record and its return value is taken as the value of the field.
    headings -- List of column headings.
    alignment - List of pairs alignment characters.  The first of the pair
        specifies the alignment of the header, (Doxygen won't respect this, but
        it might look good, the second specifies the alignment of the cells in
        the column.

        Possible alignment characters are:
            '<' = Left align (default for cells)
            '>' = Right align
            '^' = Center (default for column headings)
    """

    num_columns = len(fields)
    assert len(headings) == num_columns

    # Compute the table cell data
    columns = [[] for i in range(num_columns)]
    for record in records:
        for i, field in enumerate(fields):
            columns[i].append(evalute_field(record, field))

    # Fill out any missing alignment characters.
    extended_align = alignment if alignment != None else []
    if len(extended_align) > num_columns:
        extended_align = extended_align[0:num_columns]
    elif len(extended_align) < num_columns:
        extended_align += [('^', '<')
                           for i in range[num_columns-len(extended_align)]]

    heading_align, cell_align = [x for x in zip(*extended_align)]

    field_widths = [len(max(column, key=len)) if len(column) > 0 else 0
                    for column in columns]
    heading_widths = [max(len(head), 2) for head in headings]
    column_widths = [max(x) for x in zip(field_widths, heading_widths)]

    _ = ' | '.join(['{:' + a + str(w) + '}'
                    for a, w in zip(heading_align, column_widths)])
    heading_template = '| ' + _ + ' |'
    _ = ' | '.join(['{:' + a + str(w) + '}'
                    for a, w in zip(cell_align, column_widths)])
    row_template = '| ' + _ + ' |'

    _ = ' | '.join([left_rule[a] + '-'*(w-2) + right_rule[a]
                    for a, w in zip(cell_align, column_widths)])
    ruling = '| ' + _ + ' |'

    file.write(heading_template.format(*headings).rstrip() + '\n')
    file.write(ruling.rstrip() + '\n')
    for row in zip(*columns):
        file.write(row_template.format(*row).rstrip() + '\n')

这是一个简单的测试用例:

import sys

sys.stdout.write('State Capitals (source: Wikipedia)\n\n')

headings = ['State', 'Abrev.', 'Capital', 'Capital since', 'Population',
            'Largest Population?']

data = [('Alabama', 'AL', '1819', 'Montgomery', '1846', 155.4, False,
         205764),
        ('Alaska', 'AK', '1959', 'Juneau', '1906', 2716.7, False, 31275),
        ('Arizona', 'AZ', '1912', 'Phoenix', '1889',474.9, True, 1445632),
        ('Arkansas', 'AR', '1836', 'Little Rock', '1821', 116.2, True,
         193524)]

fields = [0, 1, 3, 4, 7, lambda rec: 'Yes' if rec[6] else 'No']

align = [('^', '<'), ('^', '^'), ('^', '<'), ('^', '^'), ('^', '>'),
         ('^','^')]

table(sys.stdout, data, fields, headings, align)

给出这个输出:

State Capitals (source: Wikipedia)

|  State   | Abrev. |   Capital   | Capital since | Population | Largest Population? |
| :------- | :----: | :---------- | :-----------: | ---------: | :-----------------: |
| Alabama  |   AL   | Montgomery  |     1846      |     205764 |         No          |
| Alaska   |   AK   | Juneau      |     1906      |      31275 |         No          |
| Arizona  |   AZ   | Phoenix     |     1889      |    1445632 |         Yes         |
| Arkansas |   AR   | Little Rock |     1821      |     193524 |         Yes         |

Doxygen 将其呈现为:

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

生成 Markdown 表? 的相关文章

  • Angular - 使用 \n 渲染 Markdown

    我正在尝试在 Angular 应用程序中渲染 Markdown 我正在使用ngx markdown https github com jfcere ngx markdown与 Angular 5 一起使用 效果很好 但是 我必须升级到 An
  • 如何使用 markdown 按顺序编写两个单独的块引用?

    我需要按顺序放置两个块引用 但是 markdown 将它们组合成一个块引用 我能让它们分开的唯一方法是在它们之间放置一些垃圾文本 由于此文本字段允许我使用 Markdown 因此我可以演示 gt First Quote gt Second
  • Pandoc:[警告] 无法转换 TeX 数学

    我尝试使用 Pandoc 将 html 转换为 docx 这是我的 html 代码 p Example v 1 rm v 2 p 头中有 MathJax 配置 MathJax Hub Config extensions tex2jax js
  • 如何在 BitBucket mark down 中的列表项下嵌套代码块?

    虽然这个问题有几个带有关键字组合的问题 答案 但我没有看到直接提出相同问题或回答它的问题 答案 我想在列表项下嵌套一个代码块 当我遵循这个answer https meta stackexchange com a 3793 我不太明白我想要
  • 无法将 imgur 上的 gif 嵌入到 github 上的 README.md 中

    我想在 README md 上显示一个大 gif 首先 我把它上传到imgur 然后 我将 url 添加到 README md img alt YAP src http i imgur com dNYswmI gif 但无法加载 编译为 a
  • 如何使用PageDown Markdown编辑器?

    我想为用户提供实时预览使用 Markdown 创建的笔记的能力 但是我在该项目中找不到任何下载 我怎样才能开始使用PageDown 降价 https github com balpha pagedown编辑 PageDown 的文档非常混乱
  • Flask 和 Jinja2 使用漂白剂,图像 HTML 无法正常工作

    我一直在为自己的一个项目创建一个小博客 只有我作为用户才能访问发布页面 我之前一直在关注 Flask 教程 该教程的最终产品使您能够使用漂白剂和 Markdown 发布 HTML 并通过 Jinja2 模板传递它 In my models
  • 如何将 package.json 中的所有 npm 依赖项记录到 README.md 中

    我想记录所有 npmdevDependencies and dependencies中描述的package json文件到README md文件在同一个项目中 以下属性值得关注name description and version 当然
  • 以富文本形式 Markdown 到剪贴板

    在 Windows 上使用 Python 我尝试获取一个 Markdown 文件并将其作为富文本粘贴到我的剪贴板中 大部分拼图都很简单 将 Markdown 解析为 HTML 没有问题 通过 TKinter 将内容放入剪贴板 是的 但这是我
  • 如何在代码/预块中添加 Markdown 格式?

    这似乎违背了代码块的目的 但我希望能够将代码块中的某些内容加粗 例如 如果我想将返回行加粗 int main void return 0 您必须在 HTML 中执行此操作 按设计 http daringfireball net projec
  • 如何将 GitHub wiki 存储为源代码的一部分

    GitHub 以及许多git服务器 例如 GitLab 提供项目级 wiki 其中通常包含 markdown md 文件被存储并形成 好吧 你的项目的wiki 这将是so cool如果有一种方法可以将您的 wiki 存储为主项目源代码的一部
  • 如何在 Bitbucket wiki 上的 Markdown 中转义“@”

    谁知道如何逃脱 BitBucket wiki 上 markdown 中的字符 就我而言 后面紧跟着恰好是某人的用户名的单词 即 blahblah 到目前为止我尝试过的 64 但这些都不起作用 屏蔽被忽略 当我使用字符代码时 它只是按原样输出
  • 是否有 Swift 代码的 Github markdown 语言标识符?

    我在用着https jbt github io markdown editor https jbt github io markdown editor在线文档工具 我想知道是否有一个标识符可以识别 swift 语法元素 谢谢 swift s
  • 带有 Pandoc 的内联 CSS

    如果在某处记录了以编程方式实现此目的的简单方法 不是通过在浏览器字段中复制 粘贴并单击按钮进行转换 我深表歉意 在我的搜索和阅读中我找不到它 我想以编程方式将 Markdown 和 CSS 文件转换为听起来可能称为 内联 CSS 的文件 例
  • Markdown 所见即所得编辑器和预览在同一文本区域中[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我寻找一个编辑器来编写 Markdown 语法并在同一文本区域中预览 例如引导所见即所得HTML5 ht
  • 如何使用 GitHub README 中的 Markdown 渲染多列?

    为了呈现三列中的项目 我尝试将以下 CSS3 指令添加到我的项目中README md文件 但样式被删除 div div style display inline block div div div div
  • 在 Emacs 中自动完成 Bibtex 文件中的 Pandoc 风格引文

    Pandoc 风格的引文 Pandoc http www johnmacfarlane net pandoc 使用 Markdown 格式 支持使用 BibTeX 文件中的键自动引用 该格式的一些示例如下 Blah blah doe99 B
  • 在 Python 中读取 .docx 文件以查找删除线、项目符号和其他格式

    任何人都可以帮助我在使用 python docx 的 Python 中识别 docx 文件中的段落是否包含带有删除线格式的文本 即它出现但被划掉 或者在开头有一个项目符号点 我正在尝试编写一个脚本来识别文档中的结构并解析内容 到目前为止 我
  • R markdown 引文标识符

    R markdown 允许使用 YAML 元数据部分中的参考书目元数据字段指定参考书目文件 例如 title Sample Document output html document bibliography bibliography bi
  • 如何在knitr中安装软件包?

    到目前为止 我一直在使用这段代码来加载 R 包并编写 R 文件 但我正在尝试使用knitr rm list ls all TRUE kpacks lt c ggplot2 install github devtools mapdata ne

随机推荐

  • 在 spring mvc log4j 中为每个日志消息添加字符串前缀

    我希望将我的字符串作为前缀添加到应用程序中的每个日志消息中 我的意思是 我有几个 java 应用程序 我希望其中一个在消息中具有一些前缀 例如 DATE INFO or other sample gt this is my added st
  • 在不同容器中渲染组件并共享状态

    我有一个由 WordPress 预渲染的 HTML 页面和三个 React 组件
  • 理解正则表达式 [\s\S-[<>]]*

    我有这个正则表达式 s S lt gt 你能帮我理解这个表达代表什么吗 据我所知 这意味着由空格和从非空格字符到 的范围组成的字符类 没有多大意义 Thanks 这是一个仅受少数正则表达式引擎 NET JGSoft XML Schema 和
  • 如何在laravel公共文件夹中安装wordpress

    我也点击此链接 但这不是我的解决方案 laravel 和 wordpress 在同一域中 laravel 在子文件夹中 https stackoverflow com questions 29018742 laravel and wordp
  • Gradle 子项目未包含在类路径中

    我们设置了 2 个项目 1 个主项目和 1 个子项目 它们是 Java 项目 它们都在同一个目录下 目录结构如下 dev Project A build gradle settings gradle Project B build grad
  • 如何每小时调用一次函数?另外,我怎样才能循环这个?

    我需要一种简单的方法来每 60 分钟调用一个函数 我怎样才能做到这一点 我正在制作一个 MineCraft bukkit 插件 这就是我所拥有的 package com webs playsoulcraft plazmotech java
  • 识别评论用户并发送通知 Laravel

    我有一个帖子系统 在我的网站上 用户可以发布文章并对每篇文章发表评论 我想发布 当任何用户 不是帖子的作者 评论帖子时 我需要向帖子的作者发送通知 该帖子由 UserName 评论 我这样做 在 CommentController 中 我有
  • 使用 HTTP 和 REGEX 清除 Varnish

    我想使用 HTTP 清除清漆中的元素 这个http调用是从varnish本身后面的后端服务器触发的 因此后端服务器除了HTTP之外没有其他访问权限 我已经使用相应的 ACL 实施了以下清除规则 该规则适用于 curl X PURGE htt
  • 在 git 中管理本地更改我不想提交

    所以我有一些已更改的文件版本 这些都是非常个人化的更改 例如 为 javascript 构建关闭缩小功能 我永远不会提交 但我确实想让它保持开放状态 以便根据其他人的更改进行更新 目前 每次更新工作区时我都必须进行堆栈保存 这变得非常烦人
  • 可启动和跨平台应用程序并使用delphi或Pascal

    是否可以使用 Delphi 或 Pascal 创建可启动 MBR 应用程序 应用程序 我知道我们不能使用 vcl RTL 和其他东西 因为它们依赖于操作系统 但我可以至少使用 Readln 和 writeln 吗 如果是真的的话 我们可以在
  • 如何暂停/恢复视频录制

    我想在录制视频时实现暂停 恢复功能 MediaRecorder 没有任何暂停 恢复方法 本机相机应用程序具有暂停 恢复功能 可以实施吗 请指导我 任何帮助或指导将不胜感激 None
  • Azure Pipeline 使用 YAML 触发 Pipeline

    当使用 YAML 完成另一个管道时尝试触发 Azure 管道 有文档 https github com microsoft azure pipelines yaml blob master design pipeline resources
  • Android ListView 有两个按钮设置可见性问题

    I have Drag Sort Listview https github com bauerca drag sort listview与以下项目 1 文本视图2 两个按钮 ON和OFF 一次只有一个按钮可见 关闭状态的图像 http p
  • 是否可以在自定义组件中使用骆驼组件?

    我最近开始使用 Apache Camel 我们正在考虑创建自定义组件来抽象大量逻辑并简化路由 但其中一些逻辑涉及 http 请求和其他部分 这些部分具有我们想要利用的现有 Camel 组件 是否可以从我们的自定义组件的生产者中调用其他组件
  • 使用ajax调用Struts 2动作,直接向响应写入字符串,不返回字符串

    在 struts2 应用程序中 我调用 Ajax 请求并将字符串直接写入响应 如下所示并返回null在操作的执行方法中 ServeletActionContext getResponse getOutputStream print samp
  • 如何将逻辑运算符应用于Python列表中的所有元素

    我有一个 python 中的布尔值列表 我想对它们进行 与 或 或 或 非 并得到结果 下面的代码可以工作 但不太Pythonic def apply and alist if len alist gt 1 return alist 0 a
  • JSP 技巧让模板制作变得更容易?

    在工作中我的任务是转动一堆HTML文件转化为简单的JSP项目 它实际上都是静态的 没有可编程的服务器端逻辑 我应该提到我对 Java 完全陌生 JSP 文件似乎可以轻松地使用常见的包含和变量 就像PHP 但我想知道一种简单的方法来获得模板继
  • 是否可以通过 GitHub API 查明问题是否已通过拉取请求关闭

    I m using github script https github com marketplace actions github script for GitHub actions which allows you to easily
  • 如何在网络浏览器中以适当的比例显示 5 毫米网格?

    我正在创建一个用于显示心电图的 Web 应用程序 心电图通常是在 5 毫米方形网格上以固定比例 10 毫米 毫伏和 25 毫米 秒 绘制的 使用正确的尺寸非常重要 因为读者会将屏幕上看到的内容与可能仅存在于纸上的其他心电图进行比较 最推荐的
  • 生成 Markdown 表?

    有没有办法从对象 Python Ruby Java C 生成表 我想以编程方式创建一个简单的表 我有一些对象 我想将一些属性映射到标题 将集合映射到行 为什么是 Markdown 因为我想稍后手动编辑该文档 现在 整个过程是这样的 报告引擎