btstack/docs/manual/update_listings.py
2015-04-10 23:43:41 +02:00

180 lines
5.9 KiB
Python

#!/usr/bin/env python
import os
import re
import sys
docs_folder = ""
appendix_file = docs_folder + "examples.tex"
lst_header = """
\\begin{lstlisting}
"""
lst_ending = """
\end{lstlisting}
"""
example_header = """
\documentclass[11pt, oneside]{article}
\usepackage{geometry}
\geometry{letterpaper}
%\geometry{landscape}
%\usepackage[parfill]{parskip}
\usepackage{graphicx}
\usepackage{amssymb}
\usepackage{listings}
\usepackage{hyperref}
\\begin{document}
\section{Examples}
"""
example_ending = """
\end{document}
"""
example_item = """
\item \emph{EXAMPLE_TITLE}: EXAMPLE_DESC, see Section \\ref{example:EXAMPLE_LABLE}.
"""
example_section = """
\subsection{EXAMPLE_TITLE: EXAMPLE_DESC}
\label{example:EXAMPLE_LABLE}
"""
example_subsection = """
\subsubsection{LISTING_CAPTION}
"""
listing_start = """
\\begin{lstlisting}[float, caption= LISTING_CAPTION., label=LISTING_LABLE]
"""
listing_ending = """
\end{lstlisting}
"""
msp_folder = "../../platforms/msp-exp430f5438-cc2564b/example/"
# Example group title: [folder, example file, section title]
list_of_examples = {
"UART" : [[msp_folder, "led_counter", "provides UART and timer interrupt without Bluetooth"]]
#"GAP" : [["", "gap_inquiry"]],
#"SPP Server" : [["", "spp_counter"],
# ["", "spp_accel"],
# ["", "spp_flowcontrol"]],
}
class State:
SearchExampleStart = 0
SearchSnippetStart = 2
SearchSnippetPause = 4
SearchSnippetResume = 5
SearchSnippetEnd = 6
ReachedExampleEnd = 7
def replacePlaceholder(template, title, lable):
snippet = template.replace("API_TITLE", title).replace("API_LABLE", lable)
return snippet
def writeListings(fout, infile_name):
lst_lable = ""
lst_caption = ""
listing = ""
state = State.SearchExampleStart
with open(infile_name, 'rb') as fin:
for line in fin:
section_parts = re.match('.*(@section)\s*(.*)(\s*\*/)\n',line)
if section_parts:
aout.write(example_subsection.replace("LISTING_CAPTION", section_parts.group(2)))
continue
brief_parts = re.match('.*(@brief)\s*(.*)\n',line)
if brief_parts:
brief = brief_parts.group(2)+"\n"
if lst_lable:
brief = brief.replace(lst_lable, "\\ref{"+lst_lable+"}")
lst_lable = ""
aout.write(brief)
if listing:
aout.write(listing)
listing = ""
continue
if state == State.SearchExampleStart:
parts = re.match('.*(EXAMPLE_START)\((.*)\):\s*(.*)(\*/)?\n',line)
if parts:
lable = parts.group(2)
title = parts.group(2).replace("_","\_")
desc = parts.group(3).replace("_","\_")
aout.write(example_section.replace("EXAMPLE_TITLE", title).replace("EXAMPLE_DESC", desc).replace("EXAMPLE_LABLE", lable))
state = State.SearchSnippetStart
continue
if state == State.SearchSnippetStart:
parts = re.match('.*(SNIPPET_START)\((.*)\):\s*(.*)(\*/)?\n',line)
if parts:
lst_lable = parts.group(2)
lst_caption = parts.group(3).replace("_","\_")
listing = listing_start.replace("LISTING_CAPTION", lst_caption).replace("LISTING_LABLE", lst_lable)
state = State.SearchSnippetEnd
continue
if state == State.SearchSnippetEnd:
parts_end = re.match('.*(SNIPPET_END).*',line)
parts_pause = re.match('.*(SNIPPET_PAUSE).*',line)
if not parts_end and not parts_pause:
end_comment_parts = re.match('.*(\*)/*\s*\n', line);
if not end_comment_parts:
aout.write(line)
elif parts_end:
aout.write(listing_ending)
state = State.SearchSnippetStart
elif parts_pause:
aout.write("...\n")
state = State.SearchSnippetResume
continue
if state == State.SearchSnippetResume:
parts = re.match('.*(SNIPPET_RESUME).*',line)
if parts:
state = State.SearchSnippetEnd
continue
parts = re.match('.*(EXAMPLE_END).*',line)
if parts:
if state != State.SearchSnippetStart:
print "Formating error detected"
state = State.ReachedExampleEnd
print "Reached end of the example"
# write list of examples
with open(appendix_file, 'w') as aout:
aout.write(example_header)
aout.write("\\begin{itemize}\n");
for group_title, examples in list_of_examples.iteritems():
group_title = group_title + " example"
if len(examples) > 1:
group_title = group_title + "s"
group_title = group_title + ":"
aout.write(" \item " + group_title + "\n");
aout.write(" \\begin{itemize}\n");
for example in examples:
lable = example[1]
title = example[1].replace("_","\_")
desc = example[2].replace("_","\_")
aout.write(example_item.replace("EXAMPLE_TITLE", title).replace("EXAMPLE_DESC", desc).replace("EXAMPLE_LABLE", lable))
aout.write(" \\end{itemize}\n")
aout.write("\\end{itemize}\n")
for group_title, examples in list_of_examples.iteritems():
for example in examples:
file_name = example[0] + example[1] + ".c"
writeListings(aout, file_name)
aout.write(example_ending)