Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Updated pdf version specs #400

Closed
wants to merge 49 commits into from
Closed
Show file tree
Hide file tree
Changes from 35 commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
b6d9875
changes to generate pdf-version of the specs
Arshitha Nov 22, 2019
30e3aab
included name to contributors file
Arshitha Nov 22, 2019
b3ddd2e
Fixed bugs as suggested on the pdf-version issue
Arshitha Jan 16, 2020
877a303
Merge pull request #1 from bids-standard/master
Arshitha Jan 17, 2020
5a5dc3f
Merge branch 'pdf-version' into master
Arshitha Jan 20, 2020
4fefe5b
updated branch with most recent commits from base repo
Arshitha Jan 22, 2020
4a2601c
deleted all files
Arshitha Jan 22, 2020
8aa83e6
added most recent version of files
Arshitha Jan 22, 2020
4794112
new branch with more readable commit history
Arshitha Jan 25, 2020
a5667bf
removed remove_cross_internal_links function
Arshitha Jan 25, 2020
c00d029
added comments and cleaned up code
Arshitha Jan 25, 2020
a3efecf
added readme and cleaned up code
Arshitha Jan 30, 2020
e9538f4
reverted modifications to CHANGES.md and fixed file naming to bids-sp…
Arshitha Feb 6, 2020
626f1a4
adding title and version details to the cover page
Arshitha Feb 18, 2020
0ec12cb
Merge remote-tracking branch 'upstream/master'
Arshitha Feb 18, 2020
3476e74
Merge branch 'master' into updated-pdf-version-specs
Arshitha Feb 18, 2020
1574bcb
fixed markdown file flagged by Travis CI build
Arshitha Feb 18, 2020
1ea328e
column width adjustment and typo fix
Arshitha Feb 18, 2020
62328e7
Changes based on code review
Arshitha Feb 20, 2020
ff41bde
modified circleci config
Arshitha Feb 20, 2020
206255d
formatting changes to circleci config
Arshitha Feb 20, 2020
fce1b0f
added store_artifacts command to config
Arshitha Feb 20, 2020
354ca4e
formatting changes to circleci config
Arshitha Feb 20, 2020
20f9388
recreated config to fix indentation errors
Arshitha Feb 20, 2020
37e9e87
added build_docs_pdf job as part of the workflow
Arshitha Feb 20, 2020
24e34a1
changed path in config
Arshitha Feb 20, 2020
4f34472
circleci config working dir changes
Arshitha Feb 20, 2020
caa442b
circleci config changes
Arshitha Feb 20, 2020
621f329
docker version change
Arshitha Feb 20, 2020
6232eb5
changing relative paths for circleci build
Arshitha Feb 20, 2020
1ddeadf
path change to match config
Arshitha Feb 20, 2020
39aa2e5
relative path fix
Arshitha Feb 20, 2020
6dbb810
circleci build debug
Arshitha Feb 20, 2020
725a87c
circleci build debug
Arshitha Feb 20, 2020
68db019
circleci build debug
Arshitha Feb 20, 2020
d1ecfd9
circleci build debug
Arshitha Feb 21, 2020
8de0662
circleci build debug
Arshitha Feb 21, 2020
f524d78
few more changes to relative paths
Arshitha Feb 21, 2020
e6e912a
fixing cp flag
Arshitha Feb 21, 2020
98658b9
testing cp behaviour within docker
Arshitha Feb 21, 2020
6475ad3
circleci build debug
Arshitha Feb 21, 2020
21b5b20
changing config
Arshitha Feb 21, 2020
3a353cf
pulling header string from mkdocs.yml
Arshitha Feb 21, 2020
d1a2d3c
remove generated pdf from repo
Arshitha Feb 21, 2020
29ca8ef
cleaned up code and final checks with circleci
Arshitha Feb 21, 2020
400712e
fixing travisCI build error
Arshitha Feb 21, 2020
44be12f
reverting back changes 01-magnetic-resonance-imaging-data.md
Arshitha Feb 21, 2020
898f7cd
STY: Fixed Markdown style
Arshitha Feb 22, 2020
1b11312
column width adjustment
Arshitha Feb 24, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 15 additions & 1 deletion .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,19 @@ jobs:
root: .
paths: site

build_docs_pdf:
working_directory: ~/bids-specification/pdf_build_src
docker:
- image: danteev/texlive:TL2017
steps:
- checkout:
path: ~/bids-specification
- run:
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think you may be creating yourself some problems with the paths you are specifying in working_directory and checkout.

I would leave the working_directory line alone (i.e., remove line 33 here) ... then we will have the default working directory of ~/project (see https://discuss.circleci.com/t/working-directory-is-no-longer-required-defaults-to-project/14363/2)

Then I would also remove line 38, corresponding to the path parameter of the checkout setting ... that will mean that the bids-specification will be cloned (checked out) to the default directory, which is the working directory, which will be ~/project

Then you should take a look at your python scripts and how they handle paths. All the while assuming that you are working from a directory ~/project/

name: generate pdf version docs
command: sh build_pdf.sh
- store_artifacts:
path: rendered_pdf

linkchecker:
docker:
- image: yarikoptic/linkchecker:9.4.0.anchorfix1-1
Expand Down Expand Up @@ -57,7 +70,7 @@ jobs:
working_directory: ~/build
command: |
if (git log -1 --pretty=%s | grep Merge*) && (! git log -1 --pretty=%b | grep REL:) ; then
github_changelog_generator --user bids-standard --project bids-specification --token ${CHANGE_TOKEN} --output ~/build/CHANGES.md --base ~/build/src/pregh-changes.md --header-label Changelog --no-issues --no-issues-wo-labels --no-filter-by-milestone --no-compare-link --pr-label ""
github_changelog_generator --user bids-standard --project bids-specification --token ${CHANGE_TOKEN} --output ~/build/CHANGES.md --base ~/build/src/pregh-changes.md --header-label "# Changelog" --no-issues --no-issues-wo-labels --no-filter-by-milestone --no-compare-link --pr-label ""
cat ~/build/CHANGES.md
mv ~/build/CHANGES.md ~/build/src/CHANGES.md
else
Expand Down Expand Up @@ -144,6 +157,7 @@ workflows:
search_build:
jobs:
- build_docs
- build_docs_pdf
- linkchecker:
requires:
- build_docs
Expand Down
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
site/
site/
node_modules/
package-lock.json
41 changes: 41 additions & 0 deletions pdf_build_src/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# pdf-version of BIDS specification

The `pdf_build_src` directory contains the scripts and tex files required to build a pdf document of the BIDS specification from multiple markdown files using the pandoc library.

Pandoc is command line tool which is also a Haskell library that converts files from one markup format to another. More here: https://pandoc.org/index.html

## Requirements

For the pdf build to be successful, the following need to be installed:

- Python 3.x
- pandoc
- Latest version of LaTeX: By default, Pandoc creates PDFs using LaTeX. Because a full MacTeX installation uses four gigabytes of disk space, pandoc recommends BasicTeX or TinyTeX and using the tlmgr tool to install additional packages as needed.

Installation instructions for both pandoc and LaTeX: https://pandoc.org/installing.html

## Building pdf document

Run the `build_pdf.sh` from the `pdf_build_src` with the command `sh build_pdf.sh` from the command line terminal

List of warnings are for missing characters like emojis while converting from markdown to pdf. Except for losing those characters in the final document, it doesn't affect the formatting or contents and therefore, can be ignored.

## Technical Overview

Pandoc comes with a plethora of options to format the resulting document. For building a pdf from multiple markdowns, a consolidated intermediate tex file is first built, which is then converted to a pdf document. To achieve the desired formatting in the final pdf, additional tex files are used with options offered by pandoc.

### Formatting files

`listings_setup.tex` - Listings is a LaTeX package used for typestting programming code in TeX. This file sets up the listings package to suit our needs and is used with the `--listings` option.

`cover.tex` - BIDS Logo is used as a cover page for the document. `cover.tex` is used with the option `--include-before-body`

`header.tex` - Header tex file that's updated with the latest version number and date when `build_pdf.sh` is run. Used with the `-H` header option.

### Scripts

`process_markdowns.py` - Script that processes markdown files in the `src` directory that are duplicated and modified for the needs of the pdf.

`pandoc_script.py` - Prepares and runs the final pandoc command through the `build_pdf.sh` script

`build_pdf.sh` - Shell script that organizes the directory structure and runs the above two python scripts
Binary file added pdf_build_src/bids-spec.pdf
Binary file not shown.
16 changes: 16 additions & 0 deletions pdf_build_src/build_pdf.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# Shell script that runs process_markdowns.py and pandoc_script.py in sequence to build the pdf document

# prepare the copied src directory
python3 process_markdowns.py

# copy pandoc_script into the temp src_copy directory
cp pandoc_script.py header.tex cover.tex listings_setup.tex src_copy

# run pandoc_script from src_copy directory
cd src_copy
python3 pandoc_script.py
mv bids-spec.pdf ..
cd ..

# delete the duplicated src directory
rm -rf src_copy
27 changes: 27 additions & 0 deletions pdf_build_src/cover.tex
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
% adds the bids logo as the cover page of the pdf
\begin{titlepage}

\newcommand{\HRule}{\rule{\linewidth}{0.5mm}} % Defines a new command for the horizontal lines, change thickness here

\center % Center everything on the page



%----------------------------------------------------------------------------------------
% LOGO SECTION
%----------------------------------------------------------------------------------------

\includegraphics[width=0.6\textwidth]{images/BIDS_logo.jpg}\\[1cm]

%----------------------------------------------------------------------------------------
% TITLE SECTION
%----------------------------------------------------------------------------------------

\HRule \\[0.4cm]
{ \huge \bfseries Brain Imaging Data Structure Specification}\\[0.4cm] % Title of your document
\HRule \\[1.5cm]

% \textsc{\large v1.2.1}\\[0.5cm]{\large 2019-08-14}\\[2cm]

% \vfill % Fill the rest of the page with whitespace
\textsc{\large v1.2.2}\\[0.5cm]{\large 2020-02-12}\\[2cm]\vfill\end{titlepage}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We need the version and date (here: v1.2.2 and 2020-02-12) to be updated automatically.

The version needs to be scraped from this line:

site_name: Brain Imaging Data Structure v1.3.0-dev

i.e., here it would be: v1.3.0-dev

And the date should be available from the machine that's building the PDF.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

EDIT: I realize now that you DO automatically extract version and date within your pdf_build_src/process_markdowns.py file.

However, please extract the version from the mkdocs.yml, because that's the file we mainly update for each release, as described in the protocol

Also: I would highly recommend to "inject" the following line into the cover.tex file during the build process:

\textsc{\large v1.2.2}\\[0.5cm]{\large 2020-02-12}\\[2cm]\vfill\end{titlepage}

instead of having it already there and then merely update it during each build.

The advantage of this is, that for each release, git will not have to track changes of cover.tex ... and the functionality would be the same.

Also, it'd be less confusing to reviewers.

In short: remove line 27 from cover.tex and instead format this line in process_markdowns.py and also write it to cover.tex FROM process_markdowns.py during the build process

Do similarly for header.tex

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed this for both header.tex and cover.tex

6 changes: 6 additions & 0 deletions pdf_build_src/header.tex
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
% header file
\usepackage{fancyhdr}
\pagestyle{fancy}
\fancyhf{}
\chead{Brain Imaging Data Structure v1.2.2 2020-02-12}
Copy link
Member

@sappelhoff sappelhoff Feb 19, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

version and date need to be automatically determined, see my comment above on the cover.tex file.

see #400 (comment) and discuss there, please.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

see here: #400 (comment)

\fancyfoot[LE,RO]{\thepage}
25 changes: 25 additions & 0 deletions pdf_build_src/listings_setup.tex
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
% Contents of listings-setup.tex
\usepackage{xcolor}
\usepackage{graphicx}

\lstset{
basicstyle=\ttfamily,
numbers=left,
keywordstyle=\color[rgb]{0.13,0.29,0.53}\bfseries,
stringstyle=\color[rgb]{0.31,0.60,0.02},
commentstyle=\color[rgb]{0.56,0.35,0.01}\itshape,
numberstyle=\footnotesize,
stepnumber=1,
numbersep=5pt,
backgroundcolor=\color[RGB]{248,248,248},
showspaces=false,
showstringspaces=false,
showtabs=false,
tabsize=2,
captionpos=b,
breaklines=true,
breakautoindent=true,
escapeinside={\%*}{*)},
linewidth=\textwidth,
basewidth=0.5em
}
43 changes: 43 additions & 0 deletions pdf_build_src/pandoc_script.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
"""Use the pandoc library as a final step to build the pdf.

This is done once the duplicate src directory is processed.
"""
import os
import subprocess


def build_pdf(filename):
"""Construct command with required pandoc flags and run using subprocess.

Parameters
----------
filename : str
Name of the output file.

"""
markdown_list = []
for root, dirs, files in os.walk('.'):
for file in files:
if file.endswith(".md") and file != 'index.md':
markdown_list.append(os.path.join(root, file))
elif file == 'index.md':
index_page = os.path.join(root, file)

default_pandoc_cmd = "pandoc "

# creates string of file paths in the order we'd like them to be appear
# ordering is taken care of by the inherent file naming
files_string = index_page + " " + " ".join(sorted(markdown_list))

flags = (" -f markdown_github --include-before-body cover.tex --toc "
"-V documentclass=report --listings -H listings_setup.tex "
"-H header.tex -V linkcolor:blue -V geometry:a4paper "
"-V geometry:margin=2cm --pdf-engine=xelatex -o ")
output_filename = filename

cmd = default_pandoc_cmd + files_string + flags + output_filename
subprocess.run(cmd.split())


if __name__ == "__main__":
build_pdf('bids-spec.pdf')
Loading