You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
181 lines
5.8 KiB
181 lines
5.8 KiB
#!/usr/bin/env python |
|
|
|
from __future__ import print_function |
|
|
|
import emitter |
|
|
|
class RSTEmitter(emitter.Emitter): |
|
def preface(self): |
|
return """.. Dynamically generated list of Logger Messages |
|
.. This page was generated using Tools/autotest/logger_metdata/parse.py |
|
|
|
.. DO NOT EDIT |
|
|
|
.. _logmessages: |
|
|
|
Onboard Message Log Messages |
|
============================ |
|
|
|
This is a list of log messages which may be present in logs produced and stored onboard ArduPilot vehicles. |
|
|
|
""" |
|
def postface(self): |
|
return "" |
|
|
|
def start(self): |
|
self.fh = open("LogMessages.rst", mode='w') |
|
print(self.preface(), file=self.fh) |
|
|
|
def emit(self, doccos): |
|
self.start() |
|
for docco in doccos: |
|
print('.. _%s:' % docco.name, file=self.fh) |
|
print("", file=self.fh) |
|
desc = docco.description |
|
if desc is None: |
|
desc = "" |
|
line = '%s: %s' % (docco.name, desc) |
|
print(line, file=self.fh) |
|
print("~" * len(line), file=self.fh) |
|
|
|
rows = [] |
|
for f in docco.fields_order: |
|
if "description" in docco.fields[f]: |
|
fdesc = docco.fields[f]["description"] |
|
else: |
|
fdesc = "" |
|
rows.append([f, fdesc]) |
|
# if "bits" in docco.fields[f]: |
|
# print(' <bits>%s</bits>' % |
|
# docco.fields[f]["bits"], file=self.fh) |
|
print(self.tablify(rows), file=self.fh) |
|
|
|
print("", file=self.fh) |
|
self.stop() |
|
|
|
def stop(self): |
|
print(self.postface(), file=self.fh) |
|
self.fh.close() |
|
|
|
|
|
# tablify swiped from rstemit.py |
|
|
|
def tablify_row(self, rowheading, row, widths, height): |
|
joiner = "|" |
|
|
|
row_lines = [x.split("\n") for x in row] |
|
for row_line in row_lines: |
|
row_line.extend([""] * (height - len(row_line))) |
|
if rowheading is not None: |
|
rowheading_lines = rowheading.split("\n") |
|
rowheading_lines.extend([""] * (height - len(rowheading_lines))) |
|
|
|
out_lines = [] |
|
for i in range(0, height): |
|
out_line = "" |
|
if rowheading is not None: |
|
rowheading_line = rowheading_lines[i] |
|
out_line += joiner + " " + rowheading_line + " " * (widths[0] - len(rowheading_line) - 1) |
|
joiner = "#" |
|
j = 0 |
|
for item in row_lines: |
|
widthnum = j |
|
if rowheading is not None: |
|
widthnum += 1 |
|
line = item[i] |
|
out_line += joiner + " " + line + " " * (widths[widthnum] - len(line) - 1) |
|
joiner = "|" |
|
j += 1 |
|
out_line += "|" |
|
out_lines.append(out_line) |
|
return "\n".join(out_lines) |
|
|
|
def tablify_longest_row_length(self, rows, rowheadings, headings): |
|
check_width_rows = rows[:] |
|
if headings is not None: |
|
check_width_rows.append(headings) |
|
longest_row_length = 0 |
|
for row in check_width_rows: |
|
if len(row) > longest_row_length: |
|
longest_row_length = len(row) |
|
if rowheadings is not None: |
|
longest_row_length += 1 |
|
return longest_row_length |
|
|
|
def longest_line_in_string(self, string): |
|
longest = 0 |
|
for line in string.split("\n"): |
|
if len(line) > longest: |
|
longest = len(line) |
|
return longest |
|
|
|
def tablify_calc_row_widths_heights(self, rows, rowheadings, headings): |
|
rows_to_check = [] |
|
if headings is not None: |
|
rows_to_check.append(headings) |
|
rows_to_check.extend(rows[:]) |
|
|
|
heights = [0] * len(rows_to_check) |
|
|
|
longest_row_length = self.tablify_longest_row_length(rows, rowheadings, headings) |
|
widths = [0] * longest_row_length |
|
|
|
all_rowheadings = [] |
|
if rowheadings is not None: |
|
if headings is not None: |
|
all_rowheadings.append("") |
|
all_rowheadings.extend(rowheadings) |
|
|
|
for rownum in range(0, len(rows_to_check)): |
|
row = rows_to_check[rownum] |
|
values_to_check = [] |
|
if rowheadings is not None: |
|
values_to_check.append(all_rowheadings[rownum]) |
|
values_to_check.extend(row[:]) |
|
colnum = 0 |
|
for value in values_to_check: |
|
height = len(value.split("\n")) |
|
if height > heights[rownum]: |
|
heights[rownum] = height |
|
longest_line = self.longest_line_in_string(value) |
|
width = longest_line + 2 # +2 for leading/trailing ws |
|
if width > widths[colnum]: |
|
widths[colnum] = width |
|
colnum += 1 |
|
return (widths, heights) |
|
|
|
def tablify(self, rows, headings=None, rowheadings=None): |
|
|
|
(widths, heights) = self.tablify_calc_row_widths_heights(rows, rowheadings, headings) |
|
|
|
# create dividing lines |
|
bar = "" |
|
heading_bar = "" |
|
for width in widths: |
|
bar += "+" |
|
heading_bar += "+" |
|
bar += "-" * width |
|
heading_bar += "=" * width |
|
bar += "+" |
|
heading_bar += "+" |
|
|
|
# create table |
|
ret = bar + "\n" |
|
if headings is not None: |
|
rowheading = None |
|
if rowheadings is not None: |
|
rowheading = "" |
|
ret += self.tablify_row(rowheading, headings, widths, heights[0]) + "\n" |
|
ret += heading_bar + "\n" |
|
for i in range(0, len(rows)): |
|
rowheading = None |
|
height = i |
|
if rowheadings is not None: |
|
rowheading = rowheadings[i] |
|
if headings is not None: |
|
height += 1 |
|
ret += self.tablify_row(rowheading, rows[i], widths, heights[height]) + "\n" |
|
ret += bar + "\n" |
|
|
|
return ret |
|
|
|
|