• R/O
  • SSH

un-xtab: 提交

Source, documentation, and distribution code for un-xtab.py


Commit MetaInfo

修訂9e607401eb77311ce54cf791a4b3aa8391237007 (tree)
時間2019-07-21 22:49:26
作者Dreas Nielsen <dreas.nielsen@gmai...>
CommiterDreas Nielsen

Log Message

Added documentation source for ReadTheDocs.

Change Summary

差異

diff -r e9a71f069e8e -r 9e607401eb77 .hgignore
--- a/.hgignore Sat Mar 05 06:35:35 2016 -0800
+++ b/.hgignore Sun Jul 21 06:49:26 2019 -0700
@@ -2,9 +2,12 @@
22 dist
33 test
44 doc/images
5-doc/*.csv
6-doc/*.xlsx
7-doc/*.zip
8-doc/index.html
5+doc/.*\.csv
6+doc/.*\.xlsx
7+doc/.*\.zip
8+doc/build/*
9+doc_orig/*
10+doc_orig/images
911 *~
12+*swp
1013
diff -r e9a71f069e8e -r 9e607401eb77 CHANGELOG.rst
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/CHANGELOG.rst Sun Jul 21 06:49:26 2019 -0700
@@ -0,0 +1,8 @@
1+========== ========== =================================================================================
2+Date Version Features
3+========== ========== =================================================================================
4+2019-07-20 0.8.0 Completed documentation for ReadTheDocs.
5+2016-01-23 0.3.0 Added the '-n' command-line option.
6+2014-10-22 0.2.0 Added 'row_headers_row' configuration parameter.
7+2014-01-10 0.1.0 Initial working version.
8+========== ========== =================================================================================
diff -r e9a71f069e8e -r 9e607401eb77 doc/Makefile
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/Makefile Sun Jul 21 06:49:26 2019 -0700
@@ -0,0 +1,20 @@
1+# Minimal makefile for Sphinx documentation
2+#
3+
4+# You can set these variables from the command line.
5+SPHINXOPTS =
6+SPHINXBUILD = sphinx-build
7+SPHINXPROJ = un-xtab
8+SOURCEDIR = source
9+BUILDDIR = build
10+
11+# Put it first so that "make" without argument is like "make help".
12+help:
13+ @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
14+
15+.PHONY: help Makefile
16+
17+# Catch-all target: route all unknown targets to Sphinx using the new
18+# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
19+%: Makefile
20+ @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
\ No newline at end of file
diff -r e9a71f069e8e -r 9e607401eb77 doc/doc_example1.cfg
--- a/doc/doc_example1.cfg Sat Mar 05 06:35:35 2016 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,11 +0,0 @@
1-[doc_example1]
2-data_columns=5-10
3-data_rows=7-11
4-row_headers=1-4
5-column_header_rows=3-6
6-column_group_count=2
7-column_header_label_1=Concentration
8-column_header_label_2=Qualifier
9-header_as_column_1=1,1,Analyte
10-header_as_column_2=2,1,Units
11-header_as_column_3=3,1,Measurement basis
diff -r e9a71f069e8e -r 9e607401eb77 doc/doc_example1.html
--- a/doc/doc_example1.html Sat Mar 05 06:35:35 2016 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,24 +0,0 @@
1-<table>
2-<tr>
3- <td>Laboratory Name</td> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> </tr>
4-<tr>
5- <td>Project Name</td> <td></td> <td></td> <td></td> <td></td> </tr>
6-<tr>
7- <td></td> <td></td> <td></td> <td>Arsenic</td> <td></td> <td>Cadmium</td> <td></td> <td>Copper</td> <td></td> </tr>
8- <tr>
9- <td></td> <td></td> <td></td> <td>mg/kg</td> <td></td> <td>mg/kg</td> <td></td> <td>mg/kg</td> <td></td> </tr>
10- <tr>
11- <td></td> <td></td> <td></td> <td>dry</td> <td></td> <td>dry</td> <td></td> <td>dry</td> <td></td> </tr>
12-<tr>
13- <td>Client sample ID</td> <td>Lab sample ID</td> <td>Preparation date</td> <td>Analysis date</td> <td>Concentration</td> <td>Qualifier</td> <td>Concentration</td> <td>Qualifier</td> <td>Concentration</td> <td>Qualifier</td> </tr>
14-<tr>
15- <td>SD00231</td> <td>45298-01</td> <td>2013-06-23</td> <td>2013-06-24</td> <td>0.11</td> <td>U</td> <td>112</td> <td></td> <td>251</td> <td></td> </tr>
16-<tr>
17- <td>SD00232</td> <td>45298-02</td> <td>2013-06-23</td> <td>2013-06-24</td> <td>8.21</td> <td></td> <td>582</td> <td></td> <td>396</td> <td></td> </tr>
18-<tr>
19- <td>SD00233</td> <td>45298-03</td> <td>2013-06-23</td> <td>2013-06-24</td> <td>0.11</td> <td>U</td> <td>45.1</td> <td></td> <td>2.4</td> <td>U</td> </tr>
20-<tr>
21- <td>SD00235</td> <td>45298-04</td> <td>2013-06-23</td> <td>2013-06-24</td> <td>0.11</td> <td>U</td> <td>69</td> <td></td> <td>2.4</td> <td>U</td> </tr>
22- <tr>
23- <td>SD00236</td> <td>45298-05</td> <td>2013-06-23</td> <td>2013-06-24</td> <td>4.53</td> <td></td> <td>98.9</td> <td></td> <td>85.8</td> <td></td> </tr>
24-</table>
diff -r e9a71f069e8e -r 9e607401eb77 doc/help.txt
--- a/doc/help.txt Sat Mar 05 06:35:35 2016 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,29 +0,0 @@
1-Usage: un-xtab.py [options] <Input file name> <Output file name>
2-Arguments:
3- Input file name The name of a text (CSV) file with crosstabbed data.
4- Output file name The name of a text (CSV) to create with normalized data.
5-
6-Convert a crosstabbed data set to a normalized data table.
7-
8-Options:
9- --version show program's version number and exit
10- -h, --help show this help message and exit
11- -c CONFIGFILE, --configfile=CONFIGFILE
12- The name of the config file, with path if necessary.
13- The default is to look for a configuration file with
14- the same name as the input file, but with an extension
15- of cfg, in the same directory as the input file.
16- -s SPECNAME, --specname=SPECNAME
17- The name of the section to use in the configuration
18- file. The default is to use the name of the input
19- data file, without its extension.
20- -e ENCODING, --encoding=ENCODING
21- Character encoding of the CSV file. It should be one
22- of the strings listed at
23- http://docs.python.org/library/codecs.html#standard-
24- encodings.
25- -d, --displayspecs Print the format specifications allowed in the
26- configuration file, then exit.
27- -p, --printconfig Pretty-print the configuration data after reading the
28- configuration file, then exit.
29- -o, --outputheaders Print the output column headers, then exit.
diff -r e9a71f069e8e -r 9e607401eb77 doc/source/Table_annotated_img.png
Binary file doc/source/Table_annotated_img.png has changed
diff -r e9a71f069e8e -r 9e607401eb77 doc/source/availability.rst
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/source/availability.rst Sun Jul 21 06:49:26 2019 -0700
@@ -0,0 +1,17 @@
1+.. _availability:
2+
3+Availability
4+================================================================
5+
6+.. index:: Installation
7+
8+The un-xtab program is available on `PyPi <https://pypi.org/project/xtab/>`_.
9+It can be installed with:
10+
11+.. code-block:: none
12+
13+ pip install un-xtab
14+
15+.. index:: Repository
16+
17+The latest code is available from the `Bibucket repository <https://bitbucket.org/rdnielsen/un-xtab>`_.
diff -r e9a71f069e8e -r 9e607401eb77 doc/source/change_log.rst
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/source/change_log.rst Sun Jul 21 06:49:26 2019 -0700
@@ -0,0 +1,6 @@
1+.. _changelog:
2+
3+Change Log
4+==============================================================
5+
6+.. include:: ../../CHANGELOG.rst
diff -r e9a71f069e8e -r 9e607401eb77 doc/source/conf.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/source/conf.py Sun Jul 21 06:49:26 2019 -0700
@@ -0,0 +1,169 @@
1+# -*- coding: utf-8 -*-
2+#
3+# un-xtab documentation build configuration file, created by
4+# sphinx-quickstart on Mon Jul 15 19:14:59 2019.
5+#
6+# This file is execfile()d with the current directory set to its
7+# containing dir.
8+#
9+# Note that not all possible configuration values are present in this
10+# autogenerated file.
11+#
12+# All configuration values have a default; values that are commented out
13+# serve to show the default.
14+
15+# If extensions (or modules to document with autodoc) are in another directory,
16+# add these directories to sys.path here. If the directory is relative to the
17+# documentation root, use os.path.abspath to make it absolute, like shown here.
18+#
19+# import os
20+# import sys
21+# sys.path.insert(0, os.path.abspath('.'))
22+
23+
24+# -- General configuration ------------------------------------------------
25+
26+# If your documentation needs a minimal Sphinx version, state it here.
27+#
28+# needs_sphinx = '1.0'
29+
30+# Add any Sphinx extension module names here, as strings. They can be
31+# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
32+# ones.
33+extensions = []
34+
35+# Add any paths that contain templates here, relative to this directory.
36+templates_path = ['_templates']
37+
38+# The suffix(es) of source filenames.
39+# You can specify multiple suffix as a list of string:
40+#
41+# source_suffix = ['.rst', '.md']
42+source_suffix = '.rst'
43+
44+# The master toctree document.
45+master_doc = 'index'
46+
47+# General information about the project.
48+project = u'un-xtab'
49+copyright = u'2019, Dreas Nielsen'
50+author = u'Dreas Nielsen'
51+
52+# The version info for the project you're documenting, acts as replacement for
53+# |version| and |release|, also used in various other places throughout the
54+# built documents.
55+#
56+# The short X.Y version.
57+version = u'0.8.0'
58+# The full version, including alpha/beta/rc tags.
59+release = u'0.8.0'
60+
61+# The language for content autogenerated by Sphinx. Refer to documentation
62+# for a list of supported languages.
63+#
64+# This is also used if you do content translation via gettext catalogs.
65+# Usually you set "language" from the command line for these cases.
66+language = None
67+
68+# List of patterns, relative to source directory, that match files and
69+# directories to ignore when looking for source files.
70+# This patterns also effect to html_static_path and html_extra_path
71+exclude_patterns = []
72+
73+# The name of the Pygments (syntax highlighting) style to use.
74+pygments_style = 'sphinx'
75+
76+# If true, `todo` and `todoList` produce output, else they produce nothing.
77+todo_include_todos = False
78+
79+
80+# -- Options for HTML output ----------------------------------------------
81+
82+# The theme to use for HTML and HTML Help pages. See the documentation for
83+# a list of builtin themes.
84+#
85+html_theme_path = ["themes"]
86+html_theme = 'sunwood'
87+
88+# Theme options are theme-specific and customize the look and feel of a theme
89+# further. For a list of options available for each theme, see the
90+# documentation.
91+#
92+# html_theme_options = {}
93+
94+# Add any paths that contain custom static files (such as style sheets) here,
95+# relative to this directory. They are copied after the builtin static files,
96+# so a file named "default.css" will overwrite the builtin "default.css".
97+html_static_path = ['_static']
98+
99+# Custom sidebar templates, must be a dictionary that maps document names
100+# to template names.
101+#
102+# This is required for the alabaster theme
103+# refs: http://alabaster.readthedocs.io/en/latest/installation.html#sidebars
104+html_sidebars = {
105+ '**': [
106+ 'relations.html', # needs 'show_related': True theme option to display
107+ 'searchbox.html',
108+ ]
109+}
110+
111+
112+# -- Options for HTMLHelp output ------------------------------------------
113+
114+# Output file base name for HTML help builder.
115+htmlhelp_basename = 'un-xtabdoc'
116+
117+
118+# -- Options for LaTeX output ---------------------------------------------
119+
120+latex_elements = {
121+ # The paper size ('letterpaper' or 'a4paper').
122+ #
123+ # 'papersize': 'letterpaper',
124+
125+ # The font size ('10pt', '11pt' or '12pt').
126+ #
127+ # 'pointsize': '10pt',
128+
129+ # Additional stuff for the LaTeX preamble.
130+ #
131+ # 'preamble': '',
132+
133+ # Latex figure (float) alignment
134+ #
135+ # 'figure_align': 'htbp',
136+}
137+
138+# Grouping the document tree into LaTeX files. List of tuples
139+# (source start file, target name, title,
140+# author, documentclass [howto, manual, or own class]).
141+latex_documents = [
142+ (master_doc, 'un-xtab.tex', u'un-xtab Documentation',
143+ u'Dreas Nielsen', 'manual'),
144+]
145+
146+
147+# -- Options for manual page output ---------------------------------------
148+
149+# One entry per manual page. List of tuples
150+# (source start file, name, description, authors, manual section).
151+man_pages = [
152+ (master_doc, 'un-xtab', u'un-xtab Documentation',
153+ [author], 1)
154+]
155+
156+
157+# -- Options for Texinfo output -------------------------------------------
158+
159+# Grouping the document tree into Texinfo files. List of tuples
160+# (source start file, target name, title, author,
161+# dir menu entry, description, category)
162+texinfo_documents = [
163+ (master_doc, 'un-xtab', u'un-xtab Documentation',
164+ author, 'un-xtab', 'One line description of project.',
165+ 'Miscellaneous'),
166+]
167+
168+
169+
diff -r e9a71f069e8e -r 9e607401eb77 doc/source/configuration.rst
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/source/configuration.rst Sun Jul 21 06:49:26 2019 -0700
@@ -0,0 +1,107 @@
1+.. _configuration:
2+
3+Configuration
4+===========================
5+
6+
7+Because of the variety of layouts of crosstabbed data, the information necessary to
8+describe each crostabbed file can be complex. For this reason, and also to facilitate
9+documentation of the way in which a file was handled, the un-crosstabbing information
10+is read from a configuration file rather than passed to the program on the command line.
11+
12+The configuration file may contain several sections, where each section contains
13+configuration data for a separate data set to be normalized. For example, each section
14+in a configuration file could pertain to a different worksheet in an Excel workbook of
15+crosstabbed data.
16+
17+Each section is identified by a unique name. The name must be enclosed in square brackets, e.g.:.
18+
19+.. code-block:: none
20+
21+ [section_name]
22+
23+The configuration data in each section consists of a set of pairs of keywords and values.
24+The keywords and values must be separated by a colon or an equal sign, e.g.:
25+
26+.. code-block:: none
27+
28+ key:value
29+
30+or
31+
32+.. code-block:: none
33+
34+ key=value
35+
36+Each configuration option must be on its own line. Comment lines can be included in the
37+configuration file; these must begin with a hash symbol (#). The configuration keywords
38+and their meanings are as folllows.
39+
40+data_columns
41+ A list of the columns in the input file containing crosstabbed data that are to be normalized.
42+
43+data_rows
44+ A list of the rows containing data to be normalized.
45+
46+row_headers
47+ A list of the columns to the left (or right) of the crosstabbed data columns that are to
48+ be preserved in the normalized output.
49+
50+column_header_rows
51+ A list of the rows containing column header values that are to be used in the normalized output.
52+
53+column_group_count
54+ The number of columns (they must be contiguous) containing related data values that should
55+ appear on the same row of the normalized output.
56+
57+column_header_label_#
58+ The header text (label) for one of the column_group_count output columns. The value consists
59+ of either two digits or a string. If the value is two digits, these refer to a cell in the
60+ matrix of column header cells (column_header_rows by column_group_count). The digits are the
61+ row number and the column number, in that order. If the value is a string, the string is used
62+ directly. There should be exactly column_header_count column_header_label keywords, and each
63+ keyword should include a numeric suffix to make it unique. The numeric suffixes should range
64+ from 1 to column_group_count.
65+
66+header_as_column_#
67+ A multi-part value that identifies a cell in the matrix of (column_header_rows by
68+ column_group_count) cells that contains a value that is to be propagated into the normalized
69+ output as a new column. The multi-part value consists of two digits and a string. The two digits
70+ identify the cell in the column header matrix that is to be used as a data value. The digits are
71+ the row number and the column number, in that order. The string is used as the header for that
72+ column.
73+
74+row_headers_row
75+ The row on which the headers for the row_headers columns appear. This configuration parameter
76+ is optional. If omitted, the maximum of column_header_rows will be used. If specified, the value
77+ must be one of the column_header_rows.
78+
79+nd_values
80+ A list of strings that represent missing values in cells of the crosstabbed data table. If all
81+ column_header_count values of a set are missing, a row will not be written to the output file
82+ for this set of values.
83+
84+List values should be separated by commas. Numeric lists may include ranges, consisting of two
85+integers separated by a dash. All configuration parameters are required except for nd_values.
86+The meaning of several of these configuration parameters is illustrated in the following figure.
87+
88+.. image:: Table_annotated_img.png
89+ :width: 720pt
90+
91+An example set of configuration parameters is shown below. This are the parameters that were
92+used to normalize the chemical data set shown above.
93+
94+.. code-block:: none
95+
96+ [concentration_data]
97+ data_columns=5-10
98+ data_rows=7-11
99+ row_headers=1-4
100+ column_header_rows=3-6
101+ column_group_count=2
102+ column_header_label_1=Concentration
103+ column_header_label_2=Qualifier
104+ header_as_column_1=1,1,Analyte
105+ header_as_column_2=2,1,Units
106+ header_as_column_3=3,1,Measurement basis
107+
diff -r e9a71f069e8e -r 9e607401eb77 doc/source/copyright.rst
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/source/copyright.rst Sun Jul 21 06:49:26 2019 -0700
@@ -0,0 +1,15 @@
1+.. _copyright:
2+
3+Copyright and License
4+================================
5+
6+Copyright (c) 2014-2019 R.Dreas Nielsen
7+
8+This program is free software: you can redistribute it and/or modify it
9+under the terms of the GNU General Public License as published by the
10+Free Software Foundation, either version 3 of the License, or (at your
11+option) any later version. This program is distributed in the hope that
12+it will be useful, but WITHOUT ANY WARRANTY; without even the implied
13+warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
14+the GNU General Public License for more details. The GNU General Public
15+License is available at http://www.gnu.org/licenses/.
diff -r e9a71f069e8e -r 9e607401eb77 doc/source/index.rst
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/source/index.rst Sun Jul 21 06:49:26 2019 -0700
@@ -0,0 +1,131 @@
1+.. un-xtab documentation master file
2+
3+.. _home:
4+
5+Normalizing (Un-Crosstabbing) Crosstabbed CSV Data Tables
6+=============================================================
7+
8+.. toctree::
9+ :maxdepth: 3
10+ :hidden:
11+
12+ Home <self>
13+ syntax
14+ configuration
15+ availability
16+ copyright
17+ change_log
18+
19+.. index:: CSV
20+
21+un-xtab.py is a Python module and command-line program that rearranges data
22+in a CSV file from a crosstabbed format to a normalized format. It takes data
23+that are in this form:
24+
25++-----------+---------------+---------------+------------+
26+| Station | 2006-05-23 | 2006-06-15 | 2006-07-19 |
27++===========+===============+===============+============+
28+| WQ-01 | 4.5 | 3.7 | 6.8 |
29++-----------+---------------+---------------+------------+
30+| WQ-02 | 9.7 | 5.1 | 7.2 |
31++-----------+---------------+---------------+------------+
32+| WQ-03 | 10 | 6.1 | 8.8 |
33++-----------+---------------+---------------+------------+
34+
35+And rearranges it into this form:
36+
37++------------+------------+---------+
38+| Station | Date | Value |
39++============+============+=========+
40+| WQ-01 | 2006-05-23 | 4.5 |
41++------------+------------+---------+
42+| WQ-02 | 2006-05-23 | 3.7 |
43++------------+------------+---------+
44+| WQ-03 | 2006-05-23 | 6.8 |
45++------------+------------+---------+
46+| WQ-01 | 2006-06-15 | 9.7 |
47++------------+------------+---------+
48+| WQ-02 | 2006-05-15 | 5.1 |
49++------------+------------+---------+
50+| WQ-03 | 2006-06-15 | 7.2 |
51++------------+------------+---------+
52+| WQ-01 | 2006-07-19 | 10 |
53++------------+------------+---------+
54+| WQ-02 | 2006-07-19 | 6.1 |
55++------------+------------+---------+
56+| WQ-03 | 2006-07-19 | 8.8 |
57++------------+------------+---------+
58+
59+
60+You can use the un-xtab program to rearrange data that have been provided in a format
61+designed for readability into a format that is more suitable for storage in a database,
62+or for use with statistical, modeling, graphics, or other software.
63+
64+The un-xtab program can deal with crosstabbed formats that include multiple rows of
65+column headers and groups of data values that were crosstabbed together. For example,
66+un-xtab can convert something like this:
67+
68+.. rst-class:: xscroll
69+
70++------------------+---------------+------------------+---------------+---------------+-----------+---------------+-----------+---------------+-----------+
71+| Laboratory Name | | | | | | | | | |
72++------------------+---------------+------------------+---------------+---------------+-----------+---------------+-----------+---------------+-----------+
73+| Project Name | | | | | | | | | |
74++------------------+---------------+------------------+---------------+---------------+-----------+---------------+-----------+---------------+-----------+
75+| | | | | Arsenic | | Cadmium | | Copper | |
76++------------------+---------------+------------------+---------------+---------------+-----------+---------------+-----------+---------------+-----------+
77+| | | | | mg/kg | | mg/kg | | mg/kg | |
78++------------------+---------------+------------------+---------------+---------------+-----------+---------------+-----------+---------------+-----------+
79+| | | | | dry | | dry | | dry | |
80++------------------+---------------+------------------+---------------+---------------+-----------+---------------+-----------+---------------+-----------+
81+| Client sample ID | Lab sample ID | Preparation date | Analysis date | Concentration | Qualifier | Concentration | Qualifier | Concentration | Qualifier |
82++==================+===============+==================+===============+===============+===========+===============+===========+===============+===========+
83+| SD00231 | 45298-01 | 2013-06-23 | 2013-06-24 | 0.11 | U | 112 | | 251 | |
84++------------------+---------------+------------------+---------------+---------------+-----------+---------------+-----------+---------------+-----------+
85+| SD00232 | 45298-02 | 2013-06-23 | 2013-06-24 | 8.21 | | 582 | | 396 | |
86++------------------+---------------+------------------+---------------+---------------+-----------+---------------+-----------+---------------+-----------+
87+| SD00233 | 45298-03 | 2013-06-23 | 2013-06-24 | 0.11 | U | 45.1 | | 2.4 | U |
88++------------------+---------------+------------------+---------------+---------------+-----------+---------------+-----------+---------------+-----------+
89+| SD00235 | 45298-04 | 2013-06-23 | 2013-06-24 | 0.11 | U | 69 | | 2.4 | U |
90++------------------+---------------+------------------+---------------+---------------+-----------+---------------+-----------+---------------+-----------+
91+| SD00236 | 45298-05 | 2013-06-23 | 2013-06-24 | 4.53 | | 98.9 | | 85.8 | |
92++------------------+---------------+------------------+---------------+---------------+-----------+---------------+-----------+---------------+-----------+
93+
94+to this:
95+
96+.. rst-class:: xscroll
97+
98++------------------+---------------+------------------+---------------+---------+-------+-------------------+---------------+-----------+
99+| Client sample ID | Lab sample ID | Preparation date | Analysis date | Analyte | Units | Measurement basis | Concentration | Qualifier |
100++==================+===============+==================+===============+=========+=======+===================+===============+===========+
101+| SD00231 | 45298-01 | 2013-06-23 | 2013-06-24 | Arsenic | mg/kg | dry | 0.11 | U |
102++------------------+---------------+------------------+---------------+---------+-------+-------------------+---------------+-----------+
103+| SD00231 | 45298-01 | 2013-06-23 | 2013-06-24 | Cadmium | mg/kg | dry | 112 | |
104++------------------+---------------+------------------+---------------+---------+-------+-------------------+---------------+-----------+
105+| SD00231 | 45298-01 | 2013-06-23 | 2013-06-24 | Copper | mg/kg | dry | 251 | |
106++------------------+---------------+------------------+---------------+---------+-------+-------------------+---------------+-----------+
107+| SD00232 | 45298-02 | 2013-06-23 | 2013-06-24 | Arsenic | mg/kg | dry | 8.21 | |
108++------------------+---------------+------------------+---------------+---------+-------+-------------------+---------------+-----------+
109+| SD00232 | 45298-02 | 2013-06-23 | 2013-06-24 | Cadmium | mg/kg | dry | 582 | |
110++------------------+---------------+------------------+---------------+---------+-------+-------------------+---------------+-----------+
111+| SD00232 | 45298-02 | 2013-06-23 | 2013-06-24 | Copper | mg/kg | dry | 396 | |
112++------------------+---------------+------------------+---------------+---------+-------+-------------------+---------------+-----------+
113+| SD00233 | 45298-03 | 2013-06-23 | 2013-06-24 | Arsenic | mg/kg | dry | 0.11 | U |
114++------------------+---------------+------------------+---------------+---------+-------+-------------------+---------------+-----------+
115+| SD00233 | 45298-03 | 2013-06-23 | 2013-06-24 | Cadmium | mg/kg | dry | 45.1 | |
116++------------------+---------------+------------------+---------------+---------+-------+-------------------+---------------+-----------+
117+| SD00233 | 45298-03 | 2013-06-23 | 2013-06-24 | Copper | mg/kg | dry | 2.4 | U |
118++------------------+---------------+------------------+---------------+---------+-------+-------------------+---------------+-----------+
119+| SD00235 | 45298-04 | 2013-06-23 | 2013-06-24 | Arsenic | mg/kg | dry | 0.11 | U |
120++------------------+---------------+------------------+---------------+---------+-------+-------------------+---------------+-----------+
121+| SD00235 | 45298-04 | 2013-06-23 | 2013-06-24 | Cadmium | mg/kg | dry | 69 | |
122++------------------+---------------+------------------+---------------+---------+-------+-------------------+---------------+-----------+
123+| SD00235 | 45298-04 | 2013-06-23 | 2013-06-24 | Copper | mg/kg | dry | 2.4 | U |
124++------------------+---------------+------------------+---------------+---------+-------+-------------------+---------------+-----------+
125+| SD00236 | 45298-05 | 2013-06-23 | 2013-06-24 | Arsenic | mg/kg | dry | 4.53 | |
126++------------------+---------------+------------------+---------------+---------+-------+-------------------+---------------+-----------+
127+| SD00236 | 45298-05 | 2013-06-23 | 2013-06-24 | Cadmium | mg/kg | dry | 98.9 | |
128++------------------+---------------+------------------+---------------+---------+-------+-------------------+---------------+-----------+
129+| SD00236 | 45298-05 | 2013-06-23 | 2013-06-24 | Copper | mg/kg | dry | 85.8 | |
130++------------------+---------------+------------------+---------------+---------+-------+-------------------+---------------+-----------+
131+
diff -r e9a71f069e8e -r 9e607401eb77 doc/source/syntax.rst
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/source/syntax.rst Sun Jul 21 06:49:26 2019 -0700
@@ -0,0 +1,83 @@
1+.. highlight:: sh
2+
3+.. index:: ! Command-line options
4+
5+.. _syntax:
6+
7+Command-Line Syntax
8+================================
9+
10+un-xtab.py should be run at the operating-system command line--i.e., at a
11+shell prompt in Linux or in a command window in Windows. Python may or
12+may not need to be explicitly invoked, and the .py extension may or may
13+not need to be included, depending on your operating system, operating
14+system seetings, and how xtab is :ref:`installed <availability>`.
15+
16+For Linux users: The xtab.py file contains a shebang line pointing to
17+/usr/bin/python, so there should be no need to invoke the Python
18+interpreter. Depending on how un-xtab.py was obtained and installed,
19+it may need to be made executable with the *chmod* command.
20+
21+For Windows users: If you are unfamiliar with running Python programs
22+at the command prompt, see https://docs.python.org/2/faq/windows.html.
23+
24+In the following syntax descriptions, angle brackets identify required
25+replaceable elements, and square brackets identify optional replaceable
26+elements.
27+
28+.. code-block:: sh
29+
30+ un-xtab.py [options] <input_file_name> <output_file_name>
31+
32+.. index:: Required arguments
33+ single: Arguments
34+
35+Required Arguments
36+-------------------------------
37+
38+.. code-block:: none
39+
40+ <input_file_name>
41+ The name of the input file from which to read data.
42+ This must be a text file, with data in a crosstabbed format.
43+ Details of the internal structure must be specified in the
44+ configuration file.
45+ <output_file_name>
46+ The name of the output file to create. The output file
47+ will be created as a .csv file.
48+
49+
50+.. index:: Optional arguments
51+ single: Arguments
52+
53+Optional Arguments
54+-------------------------------
55+
56+.. code-block:: none
57+
58+ -c CONFIGFILE, --configfile=CONFIGFILE
59+ The name of the configuration file, with path if necessary.
60+ The default is a configuration file with the same name as the
61+ input file, but with an extension of ".cfg", in the same
62+ directory as the input file.
63+ -d, --displayspecs
64+ Print the format specifications that are allowed in the
65+ configuration file.
66+ -e ENCODING, --encoding=ENCODING
67+ Character encoding of the CSV file. The value should be one of
68+ the strings listed at http://docs.python.org/library/codecs.html#standard-encodings
69+ -h, --help
70+ Show the built-in syntax help and exit.
71+ -n ROWSEQ, --number_rows=ROWSEQ
72+ A directive to number the rows of the output. The value is the
73+ column header for the row numbers.
74+ -o, --outputheaders
75+ Print the output column headers, then exit.
76+ -p, --printconfig
77+ Pretty-print the configuration data after reading the configuration
78+ file, then exit.
79+ -s SPECNAME, --specname=SPECNAME
80+ The name of the set of specifications to use in the configuration file.
81+ The default is to use the name of the input data file, without
82+ its extension.
83+
diff -r e9a71f069e8e -r 9e607401eb77 doc/source/themes/sunwood/layout.html
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/source/themes/sunwood/layout.html Sun Jul 21 06:49:26 2019 -0700
@@ -0,0 +1,77 @@
1+{#
2+ sunwood/layout.html
3+ ~~~~~~~~~~~~~~~~~
4+
5+ Sphinx layout template for the sunwood theme.
6+ Modified from the agogo theme, written by Andi Albrecht.
7+
8+ :copyright: Copyright 2017, R. Dreas Nielsen
9+ :license: BSD
10+ agogo theme Copyright 2007-2016 by the Sphinx team, see AUTHORS.
11+#}
12+{%- extends "basic/layout.html" %}
13+
14+{% block header %}
15+ <div class="header-wrapper" role="banner">
16+ <div class="header">
17+ </div>
18+ {%- block headertitle %}
19+ <div class="headertitle"><a
20+ href="{{ pathto(master_doc) }}">{{ shorttitle|e }}</a>
21+ </div>
22+ {%- endblock %}
23+ </div>
24+{% endblock %}
25+
26+{% block content %}
27+ <div class="content-wrapper">
28+ <div class="content">
29+ <div class="document">
30+ {%- block document %}
31+ {{ super() }}
32+ {%- endblock %}
33+ </div>
34+ <div class="sidebar">
35+ {%- block sidebartoc %}
36+ <h3>{{ _('Contents') }}</h3>
37+ {{ toctree(includehidden=True) }}
38+ {%- endblock %}
39+ {%- block sidebargoto %}
40+ <div class="sidebarnav" role="navigation">
41+ <h3 style="margin-top: 0.5em;">{{ _('Go To') }}</h3>
42+ <div class="sidebarnavlinks">
43+ {%- for rellink in rellinks|reverse %}
44+ <a href="{{ pathto(rellink[0]) }}" title="{{ rellink[1]|striptags|e }}"
45+ {{ accesskey(rellink[2]) }}>{{ rellink[3]|title }}</a>
46+ {%- if not loop.last %}{{ reldelim2 }}{% endif %}
47+ {%- endfor %}
48+ </div>
49+ </div>
50+ {% endblock %}
51+ {%- block sidebarsearch %}
52+ <div role="search">
53+ <h3 style="margin-top: 0.5em;">{{ _('Search') }}</h3>
54+ <form class="search" action="{{ pathto('search') }}" method="get">
55+ <input type="text" name="q" />
56+ <input type="submit" value="{{ _('Search') }}" />
57+ <input type="hidden" name="check_keywords" value="yes" />
58+ <input type="hidden" name="area" value="default" />
59+ </form>
60+ </div>
61+ {%- endblock %}
62+ </div>
63+ <div class="clearer"></div>
64+ </div>
65+ </div>
66+{% endblock %}
67+
68+{% block footer %}
69+ <div class="footer-wrapper">
70+ <div class="footer">
71+ <div class="right">{{ super() }}</div>
72+ </div>
73+ </div>
74+{% endblock %}
75+
76+{% block relbar1 %}{% endblock %}
77+{% block relbar2 %}{% endblock %}
diff -r e9a71f069e8e -r 9e607401eb77 doc/source/themes/sunwood/static/sunwood.css_t
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/source/themes/sunwood/static/sunwood.css_t Sun Jul 21 06:49:26 2019 -0700
@@ -0,0 +1,659 @@
1+/*
2+ * sunwood.css_t
3+ * ~~~~~~~~~~~
4+ *
5+ * Sphinx stylesheet -- sunwood theme.
6+ *
7+ * :copyright: Copyright 2017, R. Dreas Nielsen
8+ * :license: BSD
9+ *
10+ * Adapted from the agogo theme.
11+ * agogo theme copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS.
12+ * agogo license: BSD, see LICENSE for details.
13+ *
14+ */
15+
16+* {
17+ margin: 0px;
18+ padding: 0px;
19+}
20+
21+body {
22+ font-family: {{ theme_bodyfont }};
23+ line-height: 1.4em;
24+ color: black;
25+ background-color: #f2ecd1;
26+}
27+
28+
29+/* Page layout */
30+
31+div.header, div.content, div.footer {
32+ width: {{ theme_pagewidth }};
33+ margin-left: 1em;
34+ margin-right: 0;
35+ background-color: #f2ecd1;
36+}
37+
38+div.header-wrapper {
39+ background-color: #f2ecd1;
40+ height: 7em;
41+}
42+
43+
44+/* Default body styles */
45+a {
46+ color: {{ theme_linkcolor }};
47+ text-decoration: none;
48+}
49+a:link, a:visited, a:active {
50+ color: {{ theme_linkcolor }};
51+ text-decoration: none;
52+ }
53+a:hover {
54+ color: #4E2A16;
55+ }
56+
57+div.bodywrapper a, div.footer a {
58+ text-decoration: none;
59+}
60+
61+div.bodywrapper {
62+ background-color: #F3F1E2;
63+ padding: 0.5em 0.5em;
64+ padding-left: 3em;
65+ border: 1px solid #814324;
66+ }
67+div.bodywrapper h1, div.bodywrapper h2 {
68+ margin-top: 0;
69+ margin-left: -1.0em;
70+ }
71+
72+
73+.clearer {
74+ clear: both;
75+}
76+
77+.left {
78+ float: left;
79+}
80+
81+.right {
82+ float: right;
83+}
84+
85+.line-block {
86+ display: block;
87+ margin-top: 1em;
88+ margin-bottom: 1em;
89+}
90+
91+.line-block .line-block {
92+ margin-top: 0;
93+ margin-bottom: 0;
94+ margin-left: 1.5em;
95+}
96+
97+h1, h2, h3, h4 {
98+ font-family: {{ theme_headerfont }};
99+ font-weight: normal;
100+ color: {{ theme_headercolor2 }};
101+ margin-bottom: .8em;
102+}
103+
104+h1 {
105+ color: {{ theme_headercolor1 }};
106+ border-bottom: 2px solid {{ theme_headercolor1 }};
107+ font-size: 1.5em;
108+}
109+
110+h2 {
111+ padding-bottom: .5em;
112+ border-bottom: 1px solid {{ theme_headercolor2 }};
113+ font-size: 1.2em;
114+}
115+
116+a.headerlink {
117+ visibility: hidden;
118+ color: #dddddd;
119+ padding-left: .3em;
120+}
121+
122+h1:hover > a.headerlink,
123+h2:hover > a.headerlink,
124+h3:hover > a.headerlink,
125+h4:hover > a.headerlink,
126+h5:hover > a.headerlink,
127+h6:hover > a.headerlink,
128+dt:hover > a.headerlink,
129+caption:hover > a.headerlink,
130+p.caption:hover > a.headerlink,
131+div.code-block-caption:hover > a.headerlink {
132+ visibility: visible;
133+}
134+
135+img {
136+ margin-left: 2em;
137+ border: 1px dotted {{ theme_border_color }};
138+}
139+
140+div.admonition {
141+ margin-top: 10px;
142+ margin-bottom: 10px;
143+ padding: 2px 7px 1px 7px;
144+ border-left: 0.2em solid {{ theme_border_color }};
145+}
146+
147+p.admonition-title {
148+ margin: 0px 10px 5px 0px;
149+ font-weight: bold;
150+}
151+
152+dt:target, .highlighted {
153+ background-color: #fbe54e;
154+}
155+
156+table {
157+ font-family: "Liberation Sans", sans-serif;
158+ border-top: 2px solid #814324;
159+ border-bottom: 2px solid #814324;
160+ border-left: 1px dotted #814324;
161+ border-right: 1px dotted #814324;
162+ border-collapse: collapse;
163+ font-size: 0.9em;
164+ color: #814324;
165+ vertical-align: top;
166+ line-height: 120%;
167+ }
168+table.xscroll {
169+ display: block;
170+ overflow-x: auto;
171+ }
172+td {
173+ color: black;
174+ text-align: left;
175+ padding-left: 10px;
176+ padding-right: 10px;
177+ padding-top: 4px;
178+ padding-bottom: 4px;
179+ border-right: 1px dotted #814324;
180+ }
181+th {
182+ padding: 6px 6px;
183+ text-align: center;
184+ color: #814324;
185+ background-color: #e4d798;
186+ border-right: 1px dotted #814324;
187+ }
188+tr.hdr {
189+ font-weight: bold;
190+ }
191+thead tr {
192+ border-bottom: 1px solid #814324;
193+ background-color: #F3F1E2;
194+ }
195+tbody tr {
196+ border-bottom: 1px dotted #814324;
197+ }
198+
199+/* Header */
200+
201+div.header {
202+ position: absolute;
203+ top: 0; left: 10%; width: 65%;
204+ background-color: #FFE4B5;
205+ background-color: rgb(228, 215, 152);
206+ border-bottom: 4px solid #814324;
207+ border-left: 4px solid #814324;
208+ border-right: 4px solid #814324;
209+ height: 5em;
210+ }
211+
212+div.headertitle {
213+ position: relative;
214+ top: 0.5em; left: 5%; width: 75%;
215+ padding: 0.5em 3em 0.5em 0em;
216+ text-align: center;
217+ font-family: "Liberation Sans", "DejaVu Sans", "Bitstream Vera Sans", Arial, Helvetica, sans-serif;
218+ font-size: 1.5em;
219+ font-weight: bold;
220+ word-spacing: 0.05em;
221+ color: #814324;
222+ background-color: rgb(250, 250, 210);
223+ border: 1px solid #814324;
224+ opacity: 0.8;
225+ }
226+
227+
228+div.header .headertitle a {
229+ color: #814324;
230+}
231+
232+div.header div.rel {
233+ margin-top: 1em;
234+}
235+
236+div.header div.rel a {
237+ color: {{ theme_headerlinkcolor }};
238+ letter-spacing: .1em;
239+ text-transform: uppercase;
240+}
241+
242+p.logo {
243+ float: right;
244+}
245+
246+img.logo {
247+ border: 0;
248+}
249+
250+
251+/* Content */
252+div.content-wrapper {
253+ background-color: #f2ecd1;
254+ padding-bottom: 20px;
255+}
256+
257+div.document {
258+ width: {{ theme_documentwidth }};
259+ float: left;
260+ background-color: #f2ecd1;
261+}
262+
263+div.body {
264+ padding-right: 2em;
265+ text-align: {{ theme_textalign }};
266+}
267+
268+div.document h1 {
269+ line-height: 120%;
270+}
271+
272+div.document ul {
273+ margin: 1.5em;
274+ list-style-type: disc;
275+}
276+
277+div.document li::marker {
278+ color: #814324;
279+ }
280+
281+div.document dd {
282+ margin-left: 1.2em;
283+ margin-top: .4em;
284+ margin-bottom: 1em;
285+}
286+
287+div.document .section {
288+ margin-top: 1.7em;
289+}
290+div.document .section:first-child {
291+ margin-top: 0px;
292+}
293+
294+div.document div.highlight {
295+ margin: 0.5em 1em;
296+ padding: 0.5em 1.0em;
297+ border: 1px dotted rgb(123, 108, 34);
298+ min-width: 40em;
299+ max-width: 80%;
300+ overflow-x: auto;
301+ font-family: "Liberation Mono", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Lucida Console", "Courier New", Courier, fixed;
302+ font-size: 1.0em;
303+ line-height: 110%;
304+ background-color: #F5F4F0;
305+ color: #4C1200;
306+ white-space: pre;
307+ display: inline-block;
308+ }
309+
310+div.document div.literal-block-wrapper {
311+ margin-top: .8em;
312+ margin-bottom: .8em;
313+}
314+
315+div.document div.literal-block-wrapper div.highlight {
316+ margin: 0;
317+}
318+
319+div.document div.code-block-caption span.caption-number {
320+ padding: 0.1em 0.3em;
321+ font-style: italic;
322+}
323+
324+div.document div.code-block-caption span.caption-text {
325+}
326+
327+div.document h2 {
328+ margin-top: .7em;
329+}
330+
331+div.document p {
332+ margin-bottom: .5em;
333+}
334+
335+div.document li.toctree-l1 {
336+ margin-bottom: 1em;
337+}
338+
339+div.document .descname {
340+ font-weight: bold;
341+}
342+
343+div.document .sig-paren {
344+ font-size: larger;
345+}
346+
347+div.document .docutils.literal {
348+ background-color: #eeeeec;
349+ padding: 1px;
350+}
351+
352+div.document .docutils.xref.literal {
353+ background-color: transparent;
354+ padding: 0px;
355+}
356+
357+div.document blockquote {
358+ margin: 1em;
359+}
360+
361+div.document ol {
362+ margin: 1.5em;
363+}
364+
365+
366+/* Sidebar */
367+
368+div.sidebar {
369+ width: {{ theme_sidebarwidth }};
370+ float: right;
371+ font-family: "Liberation Sans", sans-serif;
372+ font-size: .9em;
373+ line-height: 120%;
374+ border: 1px solid #814324;
375+ color: #814324;
376+ /*background-color: #f2ecd1;*/
377+ /*background-color: #f3f1e2;*/
378+ background-color: #f3efda;
379+ /*box-shadow: 5px 5px 3px #AAAAAA;*/
380+ box-shadow: 5px 5px 3px #B8BF8F;
381+}
382+
383+div.sidebar a, div.header a {
384+ text-decoration: none;
385+}
386+
387+div.sidebar a:hover, div.header a:hover {
388+ text-decoration: underline;
389+ color: #4e2a16;
390+}
391+
392+
393+div.sidebar h3 {
394+ font-family: "Liberation Sans", sans-serif;
395+ color: #814324;
396+ font-weight: bold;
397+ background-color: #e4d798;
398+ border-bottom: 1px solid #814324;
399+ border-top: 1px solid #814324;
400+ margin-bottom: 5px;
401+ padding-left: 5px;
402+ padding-top: 5px;
403+ padding-bottom: 3px;
404+ letter-spacing: .1em;
405+}
406+
407+div.sidebar ul {
408+ list-style-type: none;
409+ margin-left: 3px;
410+}
411+
412+div.sidebar li.toctree-l1 a {
413+ display: block;
414+ color: #814324;
415+ background-color: transparent;
416+ margin-left: 3px;
417+ padding-left: 3px;
418+}
419+
420+div.sidebar li.toctree-l2 a {
421+ color: #814324;
422+ background-color: transparent;
423+ border: none;
424+ margin-left: 1em;
425+}
426+
427+div.sidebar li.toctree-l3 a {
428+ color: #814324;
429+ background-color: transparent;
430+ border: none;
431+ margin-left: 2em;
432+}
433+
434+div.sidebar li.toctree-l2:last-child a {
435+ border-bottom: none;
436+}
437+
438+div.sidebar input[type="text"] {
439+ font-size: 0.9em;
440+ width: 150px;
441+ margin-left: 6px;
442+ margin-bottom: 6px;
443+}
444+
445+div.sidebar input[type="submit"] {
446+ font-size: 0.9em;
447+ width: auto;
448+ padding-left: 3px;
449+ padding-right: 3px;
450+ text-align: center;
451+ margin-bottom: 6px;
452+}
453+
454+div.sidebar div.sidebarnavlinks {
455+ padding: 0.5em 1.0em;
456+ font-size: 0.9em;
457+ }
458+
459+
460+/* Footer */
461+
462+div.footer-wrapper {
463+ background: #e4d798;
464+ border-top: 4px solid {{ theme_border_color }};
465+ border-bottom: 2px solid {{ theme_border_color }};
466+ padding-top: 10px;
467+ padding-bottom: 10px;
468+ min-height: 2em;
469+}
470+
471+div.footer, div.footer a {
472+ background: #e4d798;
473+ color: #888a85;
474+}
475+
476+div.footer .right {
477+ text-align: right;
478+}
479+
480+div.footer .left {
481+ text-transform: uppercase;
482+}
483+
484+
485+/* Styles copied from basic theme */
486+
487+img.align-left, .figure.align-left, object.align-left {
488+ clear: left;
489+ float: left;
490+ margin-right: 1em;
491+}
492+
493+img.align-right, .figure.align-right, object.align-right {
494+ clear: right;
495+ float: right;
496+ margin-left: 1em;
497+}
498+
499+img.align-center, .figure.align-center, object.align-center {
500+ display: block;
501+ margin-left: auto;
502+ margin-right: auto;
503+}
504+
505+.align-left {
506+ text-align: left;
507+}
508+
509+.align-center {
510+ text-align: center;
511+}
512+
513+.align-right {
514+ text-align: right;
515+}
516+
517+table caption span.caption-number {
518+ font-style: italic;
519+}
520+
521+table caption span.caption-text {
522+}
523+
524+div.figure p.caption span.caption-number {
525+ font-style: italic;
526+}
527+
528+div.figure p.caption span.caption-text {
529+}
530+
531+/* -- search page ----------------------------------------------------------- */
532+
533+ul.search {
534+ margin: 10px 0 0 20px;
535+ padding: 0;
536+}
537+
538+ul.search li {
539+ padding: 5px 0 5px 20px;
540+ background-image: url(file.png);
541+ background-repeat: no-repeat;
542+ background-position: 0 7px;
543+}
544+
545+ul.search li a {
546+ font-weight: bold;
547+}
548+
549+ul.search li div.context {
550+ color: #888;
551+ margin: 2px 0 0 30px;
552+ text-align: left;
553+}
554+
555+ul.keywordmatches li.goodmatch a {
556+ font-weight: bold;
557+}
558+
559+/* -- index page ------------------------------------------------------------ */
560+
561+table.contentstable {
562+ width: 90%;
563+}
564+
565+table.contentstable p.biglink {
566+ line-height: 150%;
567+}
568+
569+a.biglink {
570+ font-size: 1.3em;
571+}
572+
573+span.linkdescr {
574+ font-style: italic;
575+ padding-top: 5px;
576+ font-size: 90%;
577+}
578+
579+/* -- general index --------------------------------------------------------- */
580+
581+table.indextable td {
582+ text-align: left;
583+ vertical-align: top;
584+}
585+
586+table.indextable ul {
587+ margin-top: 0;
588+ margin-bottom: 0;
589+ list-style-type: none;
590+}
591+
592+table.indextable > tbody > tr > td > ul {
593+ padding-left: 0em;
594+}
595+
596+table.indextable tr.pcap {
597+ height: 10px;
598+}
599+
600+table.indextable tr.cap {
601+ margin-top: 10px;
602+ background-color: #f2f2f2;
603+}
604+
605+img.toggler {
606+ margin-right: 3px;
607+ margin-top: 3px;
608+ cursor: pointer;
609+}
610+
611+/* -- domain module index --------------------------------------------------- */
612+
613+table.modindextable td {
614+ padding: 2px;
615+ border-collapse: collapse;
616+}
617+
618+/* -- viewcode extension ---------------------------------------------------- */
619+
620+.viewcode-link {
621+ float: right;
622+}
623+
624+.viewcode-back {
625+ float: right;
626+ font-family: {{ theme_bodyfont }};
627+}
628+
629+div.viewcode-block:target {
630+ margin: -1px -3px;
631+ padding: 0.5em 1.0em;
632+ background-color: #F5F4F0;
633+ border: 1px dotted {{ theme_border_color }};
634+}
635+
636+div.code-block-caption {
637+ background-color: #ddd;
638+ color: #333;
639+ padding: 2px 5px;
640+ font-size: small;
641+}
642+
643+/* -- math display ---------------------------------------------------------- */
644+
645+div.body div.math p {
646+ text-align: center;
647+}
648+
649+span.eqno {
650+ float: right;
651+}
652+
653+
654+/* -- other customization --------------------------------------------------- */
655+
656+dt {
657+ font-family: "Liberation Sans", "DejaVu Sans", "Bitstream Vera Sans", Arial, Helvetica, sans-serif;
658+ }
659+
diff -r e9a71f069e8e -r 9e607401eb77 doc/source/themes/sunwood/theme.conf
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/source/themes/sunwood/theme.conf Sun Jul 21 06:49:26 2019 -0700
@@ -0,0 +1,19 @@
1+[theme]
2+inherit = basic
3+stylesheet = sunwood.css
4+pygments_style = tango
5+
6+[options]
7+bodyfont = "Liberation Sans Regular", "Georgia", "Times New Roman", serif
8+headerfont = "Liberation Sans", "Verdana", Arial, sans-serif
9+pagewidth = 70em
10+documentwidth = 50em
11+sidebarwidth = 20em
12+bgcolor = #f3f1e2
13+headerbg = #f3f1e2
14+border_color = #814324
15+linkcolor = #4C1200
16+headercolor1 = #814324
17+headercolor2 = #814324
18+headerlinkcolor = #4C1200
19+textalign = justify
Show on old repository browser