Added report conversion using pandoc

This commit is contained in:
Salvador E. Tropea 2022-03-17 12:13:51 -03:00
parent ab1b134358
commit 6b6d22afa8
8 changed files with 139 additions and 13 deletions

View File

@ -1872,6 +1872,15 @@ Next time you need this list just use an alias, like this:
- `name`: [string=''] Used to identify this particular output definition.
- `options`: [dict] Options for the `report` output.
* Valid keys:
- `convert_from`: [string='markdown'] Original format for the report conversion. Current templates are `markdown`. See `do_convert`.
- `convert_to`: [string='pdf'] Target format for the report conversion. See `do_convert`.
- `converted_output`: [string='%f-%i%I%v.%x'] Converted output file name (%i='report', %x=`convert_to`). Affected by global options.
- `do_convert`: [boolean=false] Run `Pandoc` to convert the report. Note that Pandoc must be installed.
The conversion is done assuming the report is in `convert_from` format.
The output file will be in `convert_to` format.
The available formats depends on the `Pandoc` installation.
In CI/CD environments: the `kicad_auto_test` docker image contains it.
In Debian/Ubuntu environments: install `pandoc`, `texlive-latex-base` and `texlive-latex-recommended`.
- `output`: [string='%f-%i%I%v.%x'] Output file name (%i='report', %x='txt'). Affected by global options.
- `template`: [string='full'] Name for one of the internal templates (full, simple) or a custom template file.
- `output_id`: [string=''] Text to use for the %I expansion content. To differentiate variations of this output.

1
debian/control vendored
View File

@ -12,6 +12,7 @@ Architecture: all
Multi-Arch: foreign
Depends: ${misc:Depends}, ${python3:Depends}, python3-distutils, python3-yaml, kicad (>= 5.1.6), python3-wxgtk4.0
Recommends: kibom.inti-cmnb (>= 1.8.0), interactivehtmlbom.inti-cmnb, pcbdraw, imagemagick, librsvg2-bin, python3-xlsxwriter, rar, poppler-utils
Suggests: pandoc, texlive-latex-base, texlive-latex-recommended
Description: KiCad Bot
KiBot is a program which helps you to automate the generation of KiCad
output documents easily, repeatable, and most of all, scriptably.

View File

@ -1306,6 +1306,19 @@ outputs:
type: 'report'
dir: 'Example/report_dir'
options:
# [string='markdown'] Original format for the report conversion. Current templates are `markdown`. See `do_convert`
convert_from: 'markdown'
# [string='pdf'] Target format for the report conversion. See `do_convert`
convert_to: 'pdf'
# [string='%f-%i%I%v.%x'] Converted output file name (%i='report', %x=`convert_to`). Affected by global options
converted_output: '%f-%i%I%v.%x'
# [boolean=false] Run `Pandoc` to convert the report. Note that Pandoc must be installed.
# The conversion is done assuming the report is in `convert_from` format.
# The output file will be in `convert_to` format.
# The available formats depends on the `Pandoc` installation.
# In CI/CD environments: the `kicad_auto_test` docker image contains it.
# In Debian/Ubuntu environments: install `pandoc`, `texlive-latex-base` and `texlive-latex-recommended`
do_convert: false
# [string='%f-%i%I%v.%x'] Output file name (%i='report', %x='txt'). Affected by global options
output: '%f-%i%I%v.%x'
# [string='full'] Name for one of the internal templates (full, simple) or a custom template file

View File

@ -85,6 +85,7 @@ PCBDRAW = 'pcbdraw'
URL_PCBDRAW = 'https://github.com/INTI-CMNB/pcbdraw'
EXAMPLE_CFG = 'example_template.kibot.yaml'
AUTO_SCALE = 0
PANDOC = 'pandoc'
KICAD_VERSION_5_99 = 5099000
KICAD_VERSION_6_0_0 = 6000000
KICAD_VERSION_6_0_2 = 6000002

View File

@ -6,9 +6,11 @@
import os
import re
import pcbnew
from subprocess import check_output, STDOUT, CalledProcessError
from .gs import GS
from .misc import UI_SMD, UI_VIRTUAL, MOD_THROUGH_HOLE, MOD_SMD, MOD_EXCLUDE_FROM_POS_FILES
from .misc import (UI_SMD, UI_VIRTUAL, MOD_THROUGH_HOLE, MOD_SMD, MOD_EXCLUDE_FROM_POS_FILES, PANDOC, MISSING_TOOL,
FAILED_EXECUTE)
from .registrable import RegOutput
from .out_base import BaseOptions
from .error import KiPlotConfigurationError
@ -18,6 +20,8 @@ from . import log
logger = log.get_logger()
INF = float('inf')
PANDOC_INSTALL = ("In CI/CD environments: the `kicad_auto_test` docker image contains it.\n"
"In Debian/Ubuntu environments: install `pandoc`, `texlive-latex-base` and `texlive-latex-recommended`")
def do_round(v, dig):
@ -115,12 +119,24 @@ class ReportOptions(BaseOptions):
""" Output file name (%i='report', %x='txt') """
self.template = 'full'
""" Name for one of the internal templates (full, simple) or a custom template file """
self.convert_from = 'markdown'
""" Original format for the report conversion. Current templates are `markdown`. See `do_convert` """
self.convert_to = 'pdf'
""" Target format for the report conversion. See `do_convert` """
self.do_convert = False
""" Run `Pandoc` to convert the report. Note that Pandoc must be installed.
The conversion is done assuming the report is in `convert_from` format.
The output file will be in `convert_to` format.
The available formats depends on the `Pandoc` installation """
self.converted_output = GS.def_global_output
""" Converted output file name (%i='report', %x=`convert_to`) """
super().__init__()
self._expand_id = 'report'
self._expand_ext = 'txt'
self._mm_digits = 2
self._mils_digits = 0
self._in_digits = 2
self._help_do_convert += ".\n"+PANDOC_INSTALL
def config(self, parent):
super().config(parent)
@ -574,8 +590,38 @@ class ReportOptions(BaseOptions):
with open(output_file, "wt") as f:
f.write(text)
def expand_converted_output(self, out_dir):
aux = self._expand_ext
self._expand_ext = str(self.convert_to)
res = self._parent.expand_filename(out_dir, self.converted_output)
self._expand_ext = aux
return res
def get_targets(self, out_dir):
return [self._parent.expand_filename(out_dir, self.output)]
files = [self._parent.expand_filename(out_dir, self.output)]
if self.do_convert:
files.append(self.expand_converted_output(out_dir))
return files
def convert(self, fname):
if not self.do_convert:
return
out = self.expand_converted_output(GS.out_dir)
logger.debug('Converting the report to: {}'.format(out))
resources = '--resource-path='+GS.out_dir
cmd = [PANDOC, '--from', self.convert_from, '--to', self.convert_to, resources, fname, '-o', out]
logger.debug('Executing {}'.format(cmd))
try:
check_output(cmd, stderr=STDOUT)
except FileNotFoundError:
logger.error("Unable to convert the report, `{}` must be installed.".format(PANDOC))
logger.error(PANDOC_INSTALL)
exit(MISSING_TOOL)
except CalledProcessError as e:
logger.error('{} error: {}'.format(PANDOC, e.returncode))
if e.output:
logger.debug('Output from command: '+e.output.decode())
exit(FAILED_EXECUTE)
def run(self, fname):
self.pcb_material = GS.global_pcb_material
@ -624,6 +670,7 @@ class ReportOptions(BaseOptions):
self.schematic_pdfs = len(self._schematic_pdfs) > 0
self.schematic_svgs = len(self._schematic_svgs) > 0
self.do_template(self.template, fname)
self.convert(fname)
@output_class

View File

@ -1005,6 +1005,18 @@ def test_report_simple_1(test_dir):
ctx.clean_up(keep_project=True)
def test_report_simple_2(test_dir):
prj = 'light_control'
ctx = context.TestContext(test_dir, 'test_report_simple_2', prj, 'report_simple_2', POS_DIR)
ctx.run()
ctx.expect_out_file(prj+'-report.txt')
ctx.expect_out_file(prj+'-report_simple.txt')
ctx.compare_txt(prj+'-report.txt')
ctx.compare_txt(prj+'-report_simple.txt')
ctx.expect_out_file(prj+'-report.pdf')
ctx.clean_up(keep_project=True)
def test_board_view_1(test_dir):
prj = 'glasgow'
ctx = context.TestContext(test_dir, 'test_board_view_1', prj, 'boardview', POS_DIR)

View File

@ -9,10 +9,6 @@ global:
copper_thickness: "35"
outputs:
- name: 'report_full'
comment: "Full design report"
type: report
- name: 'report_simple'
comment: "Simple design report"
type: report
@ -20,6 +16,10 @@ outputs:
options:
template: simple
- name: 'report_full'
comment: "Full design report"
type: report
- name: 'print_front'
comment: "Top copper and silkscreen"
type: svg_pcb_print
@ -40,13 +40,6 @@ outputs:
- layer: B.Cu
- layer: B.SilkS
- name: 'print_sch'
comment: "Schematic"
type: pdf_sch_print
dir: .
options:
output: Schematic.pdf
- name: 'print_sch_svg'
comment: "Schematic"
type: svg_sch_print

View File

@ -0,0 +1,50 @@
# Example KiBot config file
kibot:
version: 1
global:
solder_mask_color_top: blue
solder_mask_color_bottom: red
pcb_finish: ENIG
copper_thickness: "35"
outputs:
- name: 'report_simple'
comment: "Simple design report"
type: report
output_id: _simple
options:
template: simple
- name: 'print_front'
comment: "Top copper and silkscreen"
type: svg_pcb_print
dir: Layers
options:
title: 'Fake title for front copper and silk'
layers:
- layer: F.Cu
- layer: F.SilkS
- name: 'print_bottom'
comment: "Bottom copper and silkscreen"
type: svg_pcb_print
dir: Layers
options:
title: 'Fake title for bottom copper and silk'
layers:
- layer: B.Cu
- layer: B.SilkS
- name: 'print_sch_svg'
comment: "Schematic"
type: svg_sch_print
dir: .
options:
output: Schematic.svg
- name: 'report_full'
comment: "Full design report"
type: report
options:
do_convert: true