rake html to create html files. The files are
created under the docs directory.rake pdf to create pdf a file. The file is created
under the latex directory.git clone https://github.com/ToshioCP/Gtk4-tutorial.git on
the command-line.Code button (green
button) on the top page of the repository. Then, click “Download
ZIP”.When you see gtk4_tutorial GitHub
repository, you’ll find the contents of the Readme.md
file. This file is written in markdown language. Markdown files have
.md suffix.
There are several kinds of markdown language. Readme.md
uses ‘GitHub Flavored Markdown’, which is often shortened as GFM.
Markdown files in the gfm directory are written in GFM. If
you are not familiar with it, refer to the page GitHub Flavor Markdown
spec.
This tutorial also uses another markdown – ‘pandoc’s markdown’. Pandoc is a converter between markdown, html, latex, word docx and so on. This type of markdown is used to convert markdown to html and/or latex.
.Src.md file has “.src.md” suffix. The syntax of .src.md file is similar to markdown but it has a special command which isn’t included in markdown syntax. It is @@@ command. The command starts with a line begins with “@@@” and ends with a line “@@@”. For example,
@@@include
tfeapplication.c
@@@
There are four types of @@@ command.
This type of @@@ command starts with a line “@@@include”.
@@@include
tfeapplication.c
@@@
This command replaces itself with the texts read from the C source
files surrounded by @@@include and @@@. If a
function list follows the filename, only the functions are read.
@@@include
tfeapplication.c main startup
@@@
The command above is replaced by the contents of main
and startup functions in the file
tfeapplication.c.
Other language’s source files are also possible. The following example shows that the ruby file ‘lib_src2md.rb’ is inserted by the command.
@@@include
lib_src2md.rb
@@@
You can’t specify functions or methods unless the file is C source.
The inserted text is converted to fence code block. Fence code block
begins with ~~~ and ends with ~~~. The
contents are displayed verbatim. ~~~ is look like a fence
so the block is called “fence code block”.
If the target markdown is GFM, then an info string can follow the
beginning fence. The following example shows that the @@@ command
includes a C source file sample.c.
$ cat src/sample.c
int
main (int argc, char **argv) {
... ...
}
$cat src/sample.src.md
... ...
@@@include -N
sample.c
@@@
... ...
$ ruby src2md.rb src/sample.src.md
$ cat gfm/sample.md
... ...
~~~C
int
main (int argc, char **argv) {
... ...
}
~~~
... ...
Info strings are usually languages like C, ruby, xml and so on. This string is decided with the filename extension.
.c => C.rb => ruby.xml => xmlThe supported languages are written in the lang method
in lib/lib_src2md.rb.
A line number will be inserted at the top of each line in the code block. If you don’t want to insert it, give “-N” option to @@@include command.
Options:
-n: Inserts a line number at the top of each line
(default).-N: No line number is inserted.The following shows that the line numbers are inserted at the beginning of each line.
$cat src/sample.src.md
... ...
@@@include
sample.c
@@@
... ...
$ ruby src2md.rb src/sample.src.md
$ cat gfm/sample.md
... ...
~~~C
1 int
2 main (int argc, char **argv) {
... ...
14 }
~~~
... ...
If a markdown is an intermediate file to html, another type of info string follows the fence. If @@@include command doesn’t have -N option, then the generated markdown is:
~~~{.C .numberLines}
int
main (int argc, char **argv) {
... ...
}
~~~
The info string .C specifies C language. The info string
.numberLines is a class of the pandoc markdown. If the
class is given, pandoc generates CSS to insert line numbers to the
source code in the html file. That’s why the fence code block in the
markdown doesn’t have line numbers, which is different from gfm
markdown. If -N option is given, then the info string is
{.C} only.
If a markdown is an intermediate file to latex, the same info string follows the beginning fence.
~~~{.C .numberLines}
int
main (int argc, char **argv) {
... ...
}
~~~
Rake uses pandoc with –listings option to convert the markdown to a latex file. The generated latex file uses ‘listings package’ to list source files instead of verbatim environment. The markdown above is converted to the following latex source file.
\begin{lstlisting}[language=C, numbers=left]
int
main (int argc, char **argv) {
... ...
}
\end{lstlisting}
Listing package can color or emphasize keywords, strings, comments and directives. But it doesn’t really analyze the syntax of the language, so the emphasis tokens are limited.
@@@include command has two advantages.
This type of @@@ command starts with a line begins with “@@@shell”.
@@@shell
shell command
... ...
@@@
This command replaces itself with:
For example,
@@@shell
wc Rakefile
@@@
This is converted to:
~~~
$ wc Rakefile
164 475 4971 Rakefile
~~~
This type of @@@ command starts with a line begins with “@@@if”, and followed by “@@@elif”, “@@@else” or “@@@end”. This command is similar to “#if”, “#elif”, #else” and “#endif” directives in the C preprocessor. For example,
@@@if gfm
Refer to [tfetextview API reference](tfetextview_doc.md)
@@@elif html
Refer to [tfetextview API reference](tfetextview_doc.html)
@@@elif latex
Refer to tfetextview API reference in appendix.
@@@end
@@@if and @@@elif have conditions. They are
gfm, html or latex so far.
Other type of conditions may be available in the future version.
The code analyzing @@@if series command is rather complicated. It is based on the state diagram below.
This type of @@@ command starts with a line begins with “@@@table”. The contents of this
command is a table of the GFM or pandoc’s markdown. The command makes a
table easy to read. For example, a text file sample.md has
a table like this:
Price list
@@@table
|item|price|
|:---:|:---:|
|mouse|$10|
|PC|$500|
@@@
The command changes this into:
Price list
|item |price|
|:---:|:---:|
|mouse| $10 |
| PC |$500 |
This command just changes the appearance of the table. There’s no influence on html/latex files that is converted from the markdown. Notice that the command supports only the above type of markdown table format.
A script mktbl.rb supports this command. If you run the
script like this:
$ ruby mktbl.rb sample.md
Then, the tables in ‘sample.md’ will be arranged. The script also
makes a backup file sample.md.bak.
The task of the script seems easy, but the program is not so simple.
The script mktbl.rb uses a library
lib/lib_src2md.rb
@@@commands are effective in the whole text. This means you can’t stop the @@@commands. But sometimes you want to show the commands literally like this document. One solution is to add four blanks at the top of the line. Then @@@commands are not effective because @@@commands must be at the top of the line.
The @@@ commands are carried out by a method src2md,
which is in the file lib/lib_src2md.rb. This method
converts .src.md file into .md file. In
addition, some other conversions are made by src2md
method.
The order of the conversions are:
There is the src2md.rb file in the top directory of this
repository. It just invokes the method src2md. In the same
way, the method is called in the action in the
Rakefile.
There are seven directories under gtk4_tutorial
directory. They are gfm, docs,
latex, src, image,
test and lib. Three directories
gfm, docs and latex are the
destination directories for GFM, html and latex files respectively. It
is possible that these three directories don’t exist before the
conversion.
rake converts .src.md files to GFM files and store
them in this directory.rake html will convert .src.md files to html
files and store them in this directory.rake pdf will convert .src.md files to latex
files and store them in this directory. Finally it creates a pdf file in
latex directory.rake test on the terminal.Src directory contains .src.md files and C-related source files. The
top directory, which is gtk_tutorial directory, contains
Rakefile, src2md.rb and some other files. When
Readme.md is generated, it will be located at the top
directory. Readme.md has title, abstract, table of contents
with links to GFM files.
Rakefile describes how to convert .src.md files into GFM, html and/or
pdf files. Rake carries out the conversion according to the
Rakefile.
Files in src directory are an abstract, sections of the
document and other .src.md files. An abstract.src.md
contains the abstract of this tutorial. Each section filename is “sec”,
number of the section and “.src.md” suffix. For example, “sec1.src.md”,
“sec5.src.md” or “sec12.src.md”. They are the files correspond to the
section 1, section 5 and section 12 respectively.
Most of .src.md files have @@@include commands and they
include C source files. Such C source files are located in the
subdirectories of src directory.
Those C files have been compiled and tested. When you compile source
files, some auxiliary files and a target file like a.out
are created. Or _build directory is made when
meson and ninja is used when compiling. Those
files are not tracked by git because they are specified in
.gitignore.
The name of the subdirectories should be independent of section names. It is because of renumbering, which will be explained in the next subsection.
Sometimes you might want to insert a new section. For example, you want to insert it between section 4 and section 5. You can make a temporary section 4.5, that is a rational number between 4 and 5. However, section numbers are usually integer so section 4.5 must be changed to section 5. And the numbers of the following sections must be increased by one.
This renumbering is done by the renumber method in the
lib/lib_renumber.rb file.
Rakefile is similar to Makefile but controlled by rake, which is a ruby script. Rakefile in this tutorial has the following tasks.
Rake does renumbering before the tasks above.
Markdown files (GFM) are generated by rake.
$ rake
This command generates Readme.md with
src/abstract.src.md and titles of each .src.md
file. At the same time, it converts each .src.md file into a GFM file
under the gfm directory. Navigation lines are added at the
top and bottom of each markdown section file.
You can describe width and height of images in .src.md files. For example,
{width=10cm height=6cm}
The size between left brace and right brace is used in latex file and it is not fit to GFM syntax. So the size will be removed in the conversion.
If a .src.md file has relative URL links, they will be changed by
conversion. Because .src.md files are located under the src
directory and GFM files are located under the gfm
directory. That means the base directory of the relative link are
different. For example, [src/sample.c](sample.c) is
translated to [src/sample.c](../src/sample.c).
If a link points another .src.md file, then the target filename will
be changed to .md file. For example,
[Section 5](sec5.src.md) is translated to
[Section 5](sec5.md).
If you want to clean the directory, that means remove all the
generated markdown files, type rake clobber.
$ rake clobber
Sometimes this is necessary before generating GFM files.
$ rake clobber
$ rake
For example, if you append a new section and other files are still
the same as before, rake clobber is necessary. Because the
navigation of the previous section of the newly added section needs to
be updated. If you don’t do rake clobber, then it won’t be
updated because the the timestamp of .md file in gfm is newer than the
one of .src.md file. In this case, using touch to the
previous section .src.md also works to update the file.
If you see the GitHub repository (ToshioCP/Gtk4-tutorial),
Readme.md is shown below the code. And
Readme.md includes links to each markdown files. The
repository not only stores source files but also shows the whole
tutorial.
Src.md files can be translated to html files. You need pandoc to do this. Most linux distribution has pandoc package. Refer to your distribution document to install.
Type rake html to generate html files.
$ rake html
First, it generates pandoc’s markdown files under docs
directory. Then, pandoc converts them to html files. The width and
height of image files are removed. Links to .src.md files will be
converted like this.
[Section 5](sec5.src.md) => [Section 5](sec5.html)
Image files are copied to docs/image direcotiry and
links to them will be converted like this:
[sample.png](../image/sample.png) => [sample.png](image/sample.png)
Other relative links will be removed.
index.html is the top html file. If you want to clean
html files, type rake clobber or
cleanhtml.
$ rake clobber
Every html file has a header
(<head> -- </head>). It is created by pandoc
with ‘-s’ option. You can customize the output with your own template
file for pandoc. Rake uses lib/lib_mk_html_template.rb to
create its own template. The template inserts bootstrap CSS and
Javascript through jsDelivr.
The docs directory contains all the necessary html
files. They are used in the GitHub pages of this
repository.
So if you want to publish this tutorial on your own web site, just
upload the files in the docs directory to your site.
You need pandoc to convert markdown files into latex source files.
Type rake pdf to generate latex files and finally make a
pdf file.
$ rake pdf
First, it generates pandoc’s markdown files under latex
directory. Then, pandoc converts them into latex files. Links to files
or directories are removed because latex doesn’t support them. However,
links to full URL and image files are kept. Image size is set with the
size between the left brace and right brace.
{width=10cm height=6cm}
You need to specify appropriate width and height. It is almost
0.015 x pixels cm. For example, if the width of an image is
400 pixels, the width in a latex file will be almost 6cm.
A file main.tex is the root file of all the generated
latex files. It has \input commands, which inserts each
section file, between \begin{document} and
\end{document}. It also has \input, which
inserts helper.tex, in the preamble. Two files
main.tex and helper.tex are created by
lib/lib_gen_main_tex.rb. It has a sample markdown code and
converts it witn pandoc -s. Then, it extracts the preamble
in the generated file and puts it into helper.tex. You can
customize helper.tex by modifying
lib/lib_gen_main_tex.rb.
Finally, lualatex compiles the main.tex into a pdf
file.
If you want to clean latex directory, type
rake clobber or rake cleanlatex
$ rake clobber
This removes all the latex source files and a pdf file.