生成 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 表? 的相关文章

  • .rmd 文件的访问名称并在 R 中使用

    我正在编织一个名为MyFile rmd 我如何访问该字符串MyFile在编织过程中并将其用于 在 YAML 标头的标题部分中使用 在后续的 R 块中使用 title r rmarkdown metadata title author My
  • 如何使用 GitHub README 中的 Markdown 渲染多列?

    为了呈现三列中的项目 我尝试将以下 CSS3 指令添加到我的项目中README md文件 但样式被删除 div div style display inline block div div div div
  • PyPandoc 与 PyInstaller 结合使用

    我安装了 PyInstaller 来为我的 python 脚本创建可执行文件 效果很好 我使用 PyPandoc 创建 docx报告 当正常的 python 文件运行时 它也可以正常运行 但不能从 PyInstaller 生成的可执行文件运
  • Pandoc:如何在目录前添加表格?

    我想在 pandoc markdown 生成的目录之前添加一个表格 我找到了参数 include before 这样 我可以在目录之前添加文本 但是有没有办法添加表格呢 下面显示我的代码 我希望目录位于两个表和 header1 之间 而不是
  • R markdown 引文标识符

    R markdown 允许使用 YAML 元数据部分中的参考书目元数据字段指定参考书目文件 例如 title Sample Document output html document bibliography bibliography bi
  • 您可以将文本文件中的信息导入/引用到 Markdown 文件中吗?

    我找不到这方面的示例 但是是否可以通过引用将文本导入到 Markdown 文件中 例如 假设我有我的README md Markdown 可以导入吗somefile txt进入自述文件 就像图像参考一样 简单回答 不 Markdown 不支
  • yard 0.7.3 无法在 Markdown 和 Textile 中构建我的自述文件

    我决定将我的项目中的 README 文件转换为 Markdown 并一直使用yard 验证文档是否正确呈现 所以我安装了 rdiscount 将 README 更改为 README md 并尝试 yard doc README md 这给了
  • 有没有基于 WPF 的 Markdown 渲染器? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我们有基于 WPF 的应用程序 我们有单独的字符串存储库 其中的文本在网络中进行编辑 在我们的 WPF
  • 在 Rails 3 中渲染 Markdown 文本

    我想将 markdown 转换为 html 在我看来我有markdown some text variable 但我得到了错误undefined method markdown I added require BlueCoth 到envir
  • pandoc 文档转换失败,错误 67

    我使用的是 R 3 3 2 和 Rstudio 版本 1 0 44 这是我的 RMarkdown 文件的格式 title Sentiment Analysis output rmdformats material highlight kat
  • 从 HTML 转换为 Markdown 时阻止 Pandoc 转义单引号

    如果我转换单引号 从 HTML 到 Markdown 它会自动转义 echo pandoc f html t markdown 我希望它输出时不带斜杠 因为它使带有缩写的文本更难以阅读 我认为这可能是由于 all symbols escap
  • lua 和 walk_block 中的 pandoc 过滤器

    我正在尝试应用一个 LUA 过滤器 该过滤器只会更改文档的正文 而不影响元数据 而且比我想象的要难 过滤器应将文本添加到内联元素和块元素的前面和后面 如果它适用于内联元素 这里Code 对于块元素失败CodeBlock function P
  • 在 Markdown 中添加文本和图像之间的空格

    在 Markdown 中 您将图像添加为 myimg link 现在 我可以使用以下属性轻松更改所述图像的大小和位置 myimg link height 75px width 300px align left 我怎样才能使图像和文本之间也有
  • Pandoc“无法找到已安装模块的模块...”

    我目前正在尝试使用 pandoc 作为 Haskell 模块 而不是程序 将 MediaWiki 文本转换为其他格式 我们假设这个程序 import Text Pandoc Readers MediaWiki main do print f
  • markdown - 我可以有下划线而不转义它们并且没有 markdown 斜体吗?

    我想要其中包含下划线的文本 它不是代码 所以我不想使用代码格式 我想停止将 Markdown 视为指令斜体化 it 我可以转义 每个下划线 看 但我总共有 20 个 在源代码中看起来很丑 很难维护 而且不是很干燥 还有其他选择吗 一些 Ma
  • 无法在 rstudio 中启动 pandoc

    我不能再使用 knitr 无论是 html 还是 pdf 每次我下订单 knit 时都会得到这个结果 Error in system paste shQuote pandoc path version intern TRUE CreateP
  • 是否可以使用“pandoc”将 .tex 文件编译为 PDF?

    是否可以使用 pandoc 编译 tex 文件 我目前正在使用 MacVim 在 MultiMarkdown 中记课堂笔记 这样 当我回到家时 我就可以mmd2tex并使用 TexShop 将 tex 文件编译为 PDF 它效果很好 但这个
  • 在R中使用pandoc将.docx转换为.md时如何保留标题和副标题?

    我正在下载一个 docx 格式的 Google 文档 然后转换为 Markdown 进行操作并导出为多种格式 问题 当我使用 pandoc 进行转换时 它会删除标题 和副标题 并且不添加任何 YAML 标头信息 我可以在标头中手动添加标题
  • 仅保留百分比的尾随零

    给出以下示例 library pander tableAbs lt Titanic 1 1 tablePct lt round prop table tableAbs 100 2 table lt cbind tableAbs tableP
  • 背景突出显示代码块中的文本?

    我的目标是能够显示如下内容 我想要背景突出显示已经有的代码块内的一段代码语法高亮 我想在 Github 上托管于 Github Pages 上的 Markdown 文件上执行此操作 可以使用 kramdown markdown html c

随机推荐

  • 在 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 因为我想稍后手动编辑该文档 现在 整个过程是这样的 报告引擎