mirror of
https://github.com/ToshioCP/Gtk4-tutorial.git
synced 2025-01-12 20:03:28 +01:00
Support smartphone. Bug fixed. Rakefile updated.
This commit is contained in:
parent
b911986561
commit
1241ce7940
47 changed files with 271 additions and 390 deletions
123
Rakefile
123
Rakefile
|
@ -1,27 +1,61 @@
|
||||||
require 'rake/clean'
|
require 'rake/clean'
|
||||||
require 'fileutils'
|
require 'fileutils'
|
||||||
require_relative 'lib/lib_src_file.rb'
|
require_relative 'lib/lib_renumber.rb'
|
||||||
require_relative 'lib/lib_src2md.rb'
|
require_relative 'lib/lib_src2md.rb'
|
||||||
require_relative 'lib/lib_gen_main_tex.rb'
|
require_relative 'lib/lib_gen_main_tex.rb'
|
||||||
require_relative 'lib/lib_mk_html_template.rb'
|
require_relative 'lib/lib_mk_html_template.rb'
|
||||||
require_relative 'lib/lib_cp_images.rb'
|
|
||||||
|
|
||||||
secfiles = Sec_files.new(FileList['src/sec*.src.md'].to_a.map{|file| Sec_file.new(file)})
|
def pair array1, array2
|
||||||
secfiles.renum!
|
n = [array1.size, array2.size].max
|
||||||
|
(0...n).map{|i| [array1[i], array2[i], i]}
|
||||||
|
end
|
||||||
|
def s2md file
|
||||||
|
"#{File.basename(file,'.src.md')}.md"
|
||||||
|
end
|
||||||
|
def s2html file
|
||||||
|
"#{File.basename(file,'.src.md')}.html"
|
||||||
|
end
|
||||||
|
def s2tex file
|
||||||
|
"#{File.basename(file,'.src.md')}.tex"
|
||||||
|
end
|
||||||
|
def c_files path
|
||||||
|
dir = File.dirname(path)
|
||||||
|
File.read(path).scan(/^@@@include\n(.*?)@@@\n/m).flatten\
|
||||||
|
.map{|s| s.each_line.to_a}.flatten\
|
||||||
|
.map{|line| "#{dir}/#{(line.match(/^\S*/)[0])}"}
|
||||||
|
end
|
||||||
|
|
||||||
|
# source files
|
||||||
|
secfiles = FileList['src/sec*.src.md']
|
||||||
|
renumber(secfiles)
|
||||||
otherfiles = ["src/turtle/turtle_doc.src.md",
|
otherfiles = ["src/turtle/turtle_doc.src.md",
|
||||||
"src/tfetextview/tfetextview_doc.src.md",
|
"src/tfetextview/tfetextview_doc.src.md",
|
||||||
"src/Readme_for_developers.src.md"].map {|file| Src_file.new file}
|
"src/Readme_for_developers.src.md"]
|
||||||
srcfiles = secfiles + otherfiles
|
srcfiles = secfiles + otherfiles
|
||||||
abstract = Src_file.new "src/abstract.src.md"
|
abstract = "src/abstract.src.md"
|
||||||
|
# imagesrcfiles are the image files used in the srcfiles.
|
||||||
|
# They are absolute paths.
|
||||||
|
imagesrcfiles = srcfiles.map do |file|
|
||||||
|
d = File.dirname(file)
|
||||||
|
File.read(file)\
|
||||||
|
.gsub(/^ .*\n/,'').gsub(/^~~~.*?^~~~\n/m,'')\
|
||||||
|
.scan(/!\[.*?\]\((.*?)\)/).flatten.uniq
|
||||||
|
.map{|img| File.absolute_path("#{d}/#{img}")}
|
||||||
|
end
|
||||||
|
imagesrcfiles = imagesrcfiles.flatten.sort.uniq
|
||||||
|
|
||||||
# docs is a directory for html files.
|
# docs is a directory for html files.
|
||||||
html_dir = 'docs'
|
html_dir = 'docs'
|
||||||
mdfiles = srcfiles.map {|file| "gfm/" + file.to_md}
|
|
||||||
htmlfiles = srcfiles.map {|file| "#{html_dir}/" + file.to_html}
|
# target files
|
||||||
sectexfiles = secfiles.map {|file| "latex/" + file.to_tex}
|
mdfiles = srcfiles.map{|file| "gfm/#{s2md(file)}"}
|
||||||
othertexfiles = otherfiles.map {|file| "latex/" + file.to_tex}
|
htmlfiles = srcfiles.map {|file| "#{html_dir}/#{s2html(file)}"}
|
||||||
|
sectexfiles = secfiles.map {|file| "latex/#{s2tex(file)}"}
|
||||||
|
othertexfiles = otherfiles.map {|file| "latex/#{s2tex(file)}"}
|
||||||
texfiles = sectexfiles + othertexfiles
|
texfiles = sectexfiles + othertexfiles
|
||||||
abstract_tex = "latex/"+abstract.to_tex
|
abstract_md = "gfm/#{s2md(abstract)}"
|
||||||
|
abstract_tex = "latex/#{s2tex(abstract)}"
|
||||||
|
htmlimagefiles = imagesrcfiles.map{|file| "#{html_dir}/image/#{File.basename(file)}"}
|
||||||
|
|
||||||
["gfm", html_dir, "latex"].each{|d| Dir.mkdir(d) unless Dir.exist?(d)}
|
["gfm", html_dir, "latex"].each{|d| Dir.mkdir(d) unless Dir.exist?(d)}
|
||||||
|
|
||||||
|
@ -31,11 +65,6 @@ CLOBBER.append(FileList["docs/*.html"])
|
||||||
CLOBBER.append(FileList["docs/image/*"])
|
CLOBBER.append(FileList["docs/image/*"])
|
||||||
CLOBBER.append(FileList["latex/*.pdf"])
|
CLOBBER.append(FileList["latex/*.pdf"])
|
||||||
|
|
||||||
def pair array1, array2
|
|
||||||
n = [array1.size, array2.size].max
|
|
||||||
(0...n).map{|i| [array1[i], array2[i], i]}
|
|
||||||
end
|
|
||||||
|
|
||||||
# tasks
|
# tasks
|
||||||
|
|
||||||
task default: :md
|
task default: :md
|
||||||
|
@ -44,51 +73,49 @@ task all: [:md, :html, :pdf]
|
||||||
task md: %w[Readme.md] + mdfiles
|
task md: %w[Readme.md] + mdfiles
|
||||||
|
|
||||||
file "Readme.md" => [abstract] + secfiles do
|
file "Readme.md" => [abstract] + secfiles do
|
||||||
src2md abstract, abstract.to_md, "gfm"
|
src2md abstract, abstract_md, "gfm"
|
||||||
buf = ["# Gtk4 Tutorial for beginners\n\nThe github page of this tutorial is also available. Click [here](https://toshiocp.github.io/Gtk4-tutorial/).\n\n"]\
|
buf = ["# Gtk4 Tutorial for beginners\n\nThe github page of this tutorial is also available. Click [here](https://toshiocp.github.io/Gtk4-tutorial/).\n\n"]\
|
||||||
+ File.readlines(abstract.to_md)\
|
+ File.readlines(abstract_md)\
|
||||||
+ ["\n## Table of contents\n\n"]
|
+ ["\n## Table of contents\n\n"]
|
||||||
File.delete(abstract.to_md)
|
File.delete(abstract_md)
|
||||||
secfiles.each_with_index do |secfile, i|
|
secfiles.each_with_index do |secfile, i|
|
||||||
h = File.open(secfile.path){|file| file.readline}.sub(/^#* */,"").chomp
|
h = File.open(secfile){|file| file.readline}.sub(/^#* */,"").chomp
|
||||||
buf << "1. [#{h}](gfm/#{secfile.to_md})\n"
|
buf << "1. [#{h}](gfm/#{s2md(secfile)})\n"
|
||||||
end
|
end
|
||||||
File.write("Readme.md", buf.join)
|
File.write("Readme.md", buf.join)
|
||||||
end
|
end
|
||||||
|
|
||||||
# srcfiles => mdfiles
|
# srcfiles => mdfiles
|
||||||
pair(srcfiles, mdfiles).each do |src, dst, i|
|
pair(srcfiles, mdfiles).each do |src, dst, i|
|
||||||
file dst => [src] + src.c_files do
|
file dst => [src] + c_files(src) do
|
||||||
src2md src, dst, "gfm"
|
src2md src, dst, "gfm"
|
||||||
if src.instance_of? Sec_file
|
if src =~ /sec\d+\.src\.md$/
|
||||||
if secfiles.size == 1
|
if secfiles.size == 1
|
||||||
nav = "Up: [Readme.md](../Readme.md)\n"
|
nav = "Up: [Readme.md](../Readme.md)\n"
|
||||||
elsif i == 0
|
elsif i == 0
|
||||||
nav = "Up: [Readme.md](../Readme.md), Next: [Section 2](#{secfiles[1].to_md})\n"
|
nav = "Up: [Readme.md](../Readme.md), Next: [Section 2](#{s2md(secfiles[1])})\n"
|
||||||
elsif i == secfiles.size - 1
|
elsif i == secfiles.size - 1
|
||||||
nav = "Up: [Readme.md](../Readme.md), Prev: [Section #{i}](#{secfiles[i-1].to_md})\n"
|
nav = "Up: [Readme.md](../Readme.md), Prev: [Section #{i}](#{s2md(secfiles[i-1])})\n"
|
||||||
else
|
else
|
||||||
nav = "Up: [Readme.md](../Readme.md), Prev: [Section #{i}](#{secfiles[i-1].to_md}), Next: [Section #{i+2}](#{secfiles[i+1].to_md})\n"
|
nav = "Up: [Readme.md](../Readme.md), Prev: [Section #{i}](#{s2md(secfiles[i-1])}), Next: [Section #{i+2}](#{s2md(secfiles[i+1])})\n"
|
||||||
end
|
end
|
||||||
File.write(dst, nav + "\n" + File.read(dst) + "\n" + nav)
|
File.write(dst, nav + "\n" + File.read(dst) + "\n" + nav)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
task html: %W[#{html_dir}/index.html] + htmlfiles do
|
task html: %W[#{html_dir}/index.html] + htmlfiles + htmlimagefiles
|
||||||
cp_images srcfiles, "docs/image"
|
|
||||||
end
|
|
||||||
|
|
||||||
file "#{html_dir}/index.html" => [abstract] + secfiles do
|
file "#{html_dir}/index.html" => [abstract] + secfiles do
|
||||||
abstract_md = "#{html_dir}/#{abstract.to_md}"
|
abstract_html_md = "#{html_dir}/#{s2md(abstract)}"
|
||||||
src2md abstract, abstract_md, "html"
|
src2md abstract, abstract_html_md, "html"
|
||||||
buf = [ "# Gtk4 Tutorial for beginners\n\n" ]\
|
buf = [ "# Gtk4 Tutorial for beginners\n\n" ]\
|
||||||
+ File.readlines(abstract_md)\
|
+ File.readlines(abstract_html_md)\
|
||||||
+ ["\n## Table of contents\n\n"]
|
+ ["\n## Table of contents\n\n"]
|
||||||
File.delete(abstract_md)
|
File.delete(abstract_html_md)
|
||||||
secfiles.each_with_index do |secfile, i|
|
secfiles.each_with_index do |secfile, i|
|
||||||
h = File.open(secfile.path){|file| file.readline}.sub(/^#* */,"").chomp
|
h = File.open(secfile){|file| file.readline}.sub(/^#* */,"").chomp
|
||||||
buf << "1. [#{h}](#{secfile.to_html})\n"
|
buf << "1. [#{h}](#{s2html(secfile)})\n"
|
||||||
end
|
end
|
||||||
buf << "\nThis website uses [Bootstrap](https://getbootstrap.jp/)."
|
buf << "\nThis website uses [Bootstrap](https://getbootstrap.jp/)."
|
||||||
File.write("#{html_dir}/index.md", buf.join)
|
File.write("#{html_dir}/index.md", buf.join)
|
||||||
|
@ -99,10 +126,10 @@ file "#{html_dir}/index.html" => [abstract] + secfiles do
|
||||||
end
|
end
|
||||||
|
|
||||||
pair(srcfiles, htmlfiles).each do |src, dst, i|
|
pair(srcfiles, htmlfiles).each do |src, dst, i|
|
||||||
file dst => [src] + src.c_files do
|
file dst => [src] + c_files(src) do
|
||||||
html_md = "#{html_dir}/#{src.to_md}"
|
html_md = "#{html_dir}/#{s2md(src)}"
|
||||||
src2md src, html_md, "html"
|
src2md src, html_md, "html"
|
||||||
if src.instance_of? Sec_file
|
if src =~ /sec\d+\.src\.md$/
|
||||||
if secfiles.size == 1
|
if secfiles.size == 1
|
||||||
mk_html_template("index.html", nil, nil)
|
mk_html_template("index.html", nil, nil)
|
||||||
elsif i == 0
|
elsif i == 0
|
||||||
|
@ -121,6 +148,12 @@ pair(srcfiles, htmlfiles).each do |src, dst, i|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
pair(imagesrcfiles, htmlimagefiles).each do |src, dst, i|
|
||||||
|
file dst => src do
|
||||||
|
cp src, dst
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
task pdf: %w[latex/main.tex] do
|
task pdf: %w[latex/main.tex] do
|
||||||
sh "cd latex; lualatex main.tex"
|
sh "cd latex; lualatex main.tex"
|
||||||
sh "cd latex; lualatex main.tex"
|
sh "cd latex; lualatex main.tex"
|
||||||
|
@ -128,19 +161,19 @@ task pdf: %w[latex/main.tex] do
|
||||||
end
|
end
|
||||||
|
|
||||||
file "latex/main.tex" => [abstract_tex] + texfiles do
|
file "latex/main.tex" => [abstract_tex] + texfiles do
|
||||||
gen_main_tex "latex", abstract.to_tex, sectexfiles, othertexfiles
|
gen_main_tex "latex", s2tex(abstract), sectexfiles, othertexfiles
|
||||||
end
|
end
|
||||||
|
|
||||||
file abstract_tex => abstract do
|
file abstract_tex => abstract do
|
||||||
abstract_md = "latex/"+abstract.to_md
|
abstract_tex_md = "latex/#{s2md(abstract)}"
|
||||||
src2md abstract, abstract_md, "latex"
|
src2md abstract, abstract_tex_md, "latex"
|
||||||
sh "pandoc --listings -o #{abstract_tex} #{abstract_md}"
|
sh "pandoc --listings -o #{abstract_tex} #{abstract_tex_md}"
|
||||||
File.delete(abstract_md)
|
File.delete(abstract_tex_md)
|
||||||
end
|
end
|
||||||
|
|
||||||
pair(srcfiles, texfiles).each do |src, dst, i|
|
pair(srcfiles, texfiles).each do |src, dst, i|
|
||||||
file dst => [src] + src.c_files do
|
file dst => [src] + c_files(src) do
|
||||||
tex_md = "latex/#{src.to_md}"
|
tex_md = "latex/#{s2md(src)}"
|
||||||
src2md src, tex_md, "latex"
|
src2md src, tex_md, "latex"
|
||||||
if src == "src/Readme_for_developers.src.md"
|
if src == "src/Readme_for_developers.src.md"
|
||||||
sh "pandoc -o #{dst} #{tex_md}"
|
sh "pandoc -o #{dst} #{tex_md}"
|
||||||
|
|
|
@ -76,7 +76,6 @@
|
||||||
code span.va { color: #19177c; } /* Variable */
|
code span.va { color: #19177c; } /* Variable */
|
||||||
code span.vs { color: #4070a0; } /* VerbatimString */
|
code span.vs { color: #4070a0; } /* VerbatimString */
|
||||||
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
||||||
body {width: 1080px; margin: 0 auto; font-size: large;}
|
|
||||||
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
||||||
|
@ -302,7 +301,7 @@ Refer to tfetextview API reference in appendix.
|
||||||
<ul>
|
<ul>
|
||||||
<li>Relative links are changed according to the change of the base directory.</li>
|
<li>Relative links are changed according to the change of the base directory.</li>
|
||||||
<li>Size option in image link is removed when the destination is GFM or html.</li>
|
<li>Size option in image link is removed when the destination is GFM or html.</li>
|
||||||
<li>Relative link is removed when the destination is latex.</li>
|
<li>Relative link is removed when the destination is html and/or latex.</li>
|
||||||
</ul>
|
</ul>
|
||||||
<p>The order of the conversions are:</p>
|
<p>The order of the conversions are:</p>
|
||||||
<ol type="1">
|
<ol type="1">
|
||||||
|
@ -369,7 +368,11 @@ $ rake</code></pre>
|
||||||
<p>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 it.</p>
|
<p>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 it.</p>
|
||||||
<p>Type <code>rake html</code> to generate html files.</p>
|
<p>Type <code>rake html</code> to generate html files.</p>
|
||||||
<pre><code>$ rake html</code></pre>
|
<pre><code>$ rake html</code></pre>
|
||||||
<p>First, it generates pandoc’s markdown files under <code>docs</code> directory. Then, pandoc converts them to html files. The width and height of image files are removed.</p>
|
<p>First, it generates pandoc’s markdown files under <code>docs</code> 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.</p>
|
||||||
|
<pre><code>[Section 5](sec5.src.md) => [Section 5](sec5.html)</code></pre>
|
||||||
|
<p>Image files are copied to <code>docs/image</code> direcotiry and links to them will be converted like this:</p>
|
||||||
|
<pre><code>[sample.png](../image/sample.png) => [sample.png](image/sample.png)</code></pre>
|
||||||
|
<p>Other relative links will be removed.</p>
|
||||||
<p><code>index.html</code> is the top html file. If you want to clean html files, type <code>rake clobber</code></p>
|
<p><code>index.html</code> is the top html file. If you want to clean html files, type <code>rake clobber</code></p>
|
||||||
<pre><code>$ rake clobber</code></pre>
|
<pre><code>$ rake clobber</code></pre>
|
||||||
<p>Every html file has a header (<code><head> -- </head></code>). It is created by pandoc with ‘-s’ option. You can customize the output with your own template file for pandoc. Rake uses <code>lib/lib_mk_html_template.rb</code> to create its own template. The template inserts bootstrap CSS and Javascript through <code>jsDelivr</code>.</p>
|
<p>Every html file has a header (<code><head> -- </head></code>). It is created by pandoc with ‘-s’ option. You can customize the output with your own template file for pandoc. Rake uses <code>lib/lib_mk_html_template.rb</code> to create its own template. The template inserts bootstrap CSS and Javascript through <code>jsDelivr</code>.</p>
|
||||||
|
|
|
@ -76,7 +76,6 @@
|
||||||
code span.va { color: #19177c; } /* Variable */
|
code span.va { color: #19177c; } /* Variable */
|
||||||
code span.vs { color: #4070a0; } /* VerbatimString */
|
code span.vs { color: #4070a0; } /* VerbatimString */
|
||||||
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
||||||
body {width: 1080px; margin: 0 auto; font-size: large;}
|
|
||||||
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
||||||
|
|
|
@ -76,7 +76,6 @@
|
||||||
code span.va { color: #19177c; } /* Variable */
|
code span.va { color: #19177c; } /* Variable */
|
||||||
code span.vs { color: #4070a0; } /* VerbatimString */
|
code span.vs { color: #4070a0; } /* VerbatimString */
|
||||||
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
||||||
body {width: 1080px; margin: 0 auto; font-size: large;}
|
|
||||||
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
||||||
|
|
|
@ -76,7 +76,6 @@
|
||||||
code span.va { color: #19177c; } /* Variable */
|
code span.va { color: #19177c; } /* Variable */
|
||||||
code span.vs { color: #4070a0; } /* VerbatimString */
|
code span.vs { color: #4070a0; } /* VerbatimString */
|
||||||
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
||||||
body {width: 1080px; margin: 0 auto; font-size: large;}
|
|
||||||
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
||||||
|
|
|
@ -76,7 +76,6 @@
|
||||||
code span.va { color: #19177c; } /* Variable */
|
code span.va { color: #19177c; } /* Variable */
|
||||||
code span.vs { color: #4070a0; } /* VerbatimString */
|
code span.vs { color: #4070a0; } /* VerbatimString */
|
||||||
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
||||||
body {width: 1080px; margin: 0 auto; font-size: large;}
|
|
||||||
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
||||||
|
|
|
@ -76,7 +76,6 @@
|
||||||
code span.va { color: #19177c; } /* Variable */
|
code span.va { color: #19177c; } /* Variable */
|
||||||
code span.vs { color: #4070a0; } /* VerbatimString */
|
code span.vs { color: #4070a0; } /* VerbatimString */
|
||||||
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
||||||
body {width: 1080px; margin: 0 auto; font-size: large;}
|
|
||||||
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
||||||
|
|
|
@ -76,7 +76,6 @@
|
||||||
code span.va { color: #19177c; } /* Variable */
|
code span.va { color: #19177c; } /* Variable */
|
||||||
code span.vs { color: #4070a0; } /* VerbatimString */
|
code span.vs { color: #4070a0; } /* VerbatimString */
|
||||||
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
||||||
body {width: 1080px; margin: 0 auto; font-size: large;}
|
|
||||||
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
||||||
|
|
|
@ -76,7 +76,6 @@
|
||||||
code span.va { color: #19177c; } /* Variable */
|
code span.va { color: #19177c; } /* Variable */
|
||||||
code span.vs { color: #4070a0; } /* VerbatimString */
|
code span.vs { color: #4070a0; } /* VerbatimString */
|
||||||
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
||||||
body {width: 1080px; margin: 0 auto; font-size: large;}
|
|
||||||
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
||||||
|
|
|
@ -76,7 +76,6 @@
|
||||||
code span.va { color: #19177c; } /* Variable */
|
code span.va { color: #19177c; } /* Variable */
|
||||||
code span.vs { color: #4070a0; } /* VerbatimString */
|
code span.vs { color: #4070a0; } /* VerbatimString */
|
||||||
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
||||||
body {width: 1080px; margin: 0 auto; font-size: large;}
|
|
||||||
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
||||||
|
|
|
@ -76,7 +76,6 @@
|
||||||
code span.va { color: #19177c; } /* Variable */
|
code span.va { color: #19177c; } /* Variable */
|
||||||
code span.vs { color: #4070a0; } /* VerbatimString */
|
code span.vs { color: #4070a0; } /* VerbatimString */
|
||||||
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
||||||
body {width: 1080px; margin: 0 auto; font-size: large;}
|
|
||||||
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
||||||
|
|
|
@ -76,7 +76,6 @@
|
||||||
code span.va { color: #19177c; } /* Variable */
|
code span.va { color: #19177c; } /* Variable */
|
||||||
code span.vs { color: #4070a0; } /* VerbatimString */
|
code span.vs { color: #4070a0; } /* VerbatimString */
|
||||||
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
||||||
body {width: 1080px; margin: 0 auto; font-size: large;}
|
|
||||||
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
||||||
|
|
|
@ -76,7 +76,6 @@
|
||||||
code span.va { color: #19177c; } /* Variable */
|
code span.va { color: #19177c; } /* Variable */
|
||||||
code span.vs { color: #4070a0; } /* VerbatimString */
|
code span.vs { color: #4070a0; } /* VerbatimString */
|
||||||
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
||||||
body {width: 1080px; margin: 0 auto; font-size: large;}
|
|
||||||
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
||||||
|
|
|
@ -76,7 +76,6 @@
|
||||||
code span.va { color: #19177c; } /* Variable */
|
code span.va { color: #19177c; } /* Variable */
|
||||||
code span.vs { color: #4070a0; } /* VerbatimString */
|
code span.vs { color: #4070a0; } /* VerbatimString */
|
||||||
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
||||||
body {width: 1080px; margin: 0 auto; font-size: large;}
|
|
||||||
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
||||||
|
|
|
@ -76,7 +76,6 @@
|
||||||
code span.va { color: #19177c; } /* Variable */
|
code span.va { color: #19177c; } /* Variable */
|
||||||
code span.vs { color: #4070a0; } /* VerbatimString */
|
code span.vs { color: #4070a0; } /* VerbatimString */
|
||||||
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
||||||
body {width: 1080px; margin: 0 auto; font-size: large;}
|
|
||||||
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
||||||
|
|
|
@ -76,7 +76,6 @@
|
||||||
code span.va { color: #19177c; } /* Variable */
|
code span.va { color: #19177c; } /* Variable */
|
||||||
code span.vs { color: #4070a0; } /* VerbatimString */
|
code span.vs { color: #4070a0; } /* VerbatimString */
|
||||||
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
||||||
body {width: 1080px; margin: 0 auto; font-size: large;}
|
|
||||||
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
||||||
|
|
|
@ -76,7 +76,6 @@
|
||||||
code span.va { color: #19177c; } /* Variable */
|
code span.va { color: #19177c; } /* Variable */
|
||||||
code span.vs { color: #4070a0; } /* VerbatimString */
|
code span.vs { color: #4070a0; } /* VerbatimString */
|
||||||
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
||||||
body {width: 1080px; margin: 0 auto; font-size: large;}
|
|
||||||
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
||||||
|
|
|
@ -76,7 +76,6 @@
|
||||||
code span.va { color: #19177c; } /* Variable */
|
code span.va { color: #19177c; } /* Variable */
|
||||||
code span.vs { color: #4070a0; } /* VerbatimString */
|
code span.vs { color: #4070a0; } /* VerbatimString */
|
||||||
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
||||||
body {width: 1080px; margin: 0 auto; font-size: large;}
|
|
||||||
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
||||||
|
|
|
@ -76,7 +76,6 @@
|
||||||
code span.va { color: #19177c; } /* Variable */
|
code span.va { color: #19177c; } /* Variable */
|
||||||
code span.vs { color: #4070a0; } /* VerbatimString */
|
code span.vs { color: #4070a0; } /* VerbatimString */
|
||||||
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
||||||
body {width: 1080px; margin: 0 auto; font-size: large;}
|
|
||||||
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
||||||
|
|
|
@ -76,7 +76,6 @@
|
||||||
code span.va { color: #19177c; } /* Variable */
|
code span.va { color: #19177c; } /* Variable */
|
||||||
code span.vs { color: #4070a0; } /* VerbatimString */
|
code span.vs { color: #4070a0; } /* VerbatimString */
|
||||||
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
||||||
body {width: 1080px; margin: 0 auto; font-size: large;}
|
|
||||||
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
||||||
|
|
|
@ -76,7 +76,6 @@
|
||||||
code span.va { color: #19177c; } /* Variable */
|
code span.va { color: #19177c; } /* Variable */
|
||||||
code span.vs { color: #4070a0; } /* VerbatimString */
|
code span.vs { color: #4070a0; } /* VerbatimString */
|
||||||
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
||||||
body {width: 1080px; margin: 0 auto; font-size: large;}
|
|
||||||
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
||||||
|
@ -622,7 +621,7 @@ expression: ID | NUM;</code></pre>
|
||||||
<p>The first line is:</p>
|
<p>The first line is:</p>
|
||||||
<pre><code>FC '(' NUM ',' NUM ',' NUM ')';</code></pre>
|
<pre><code>FC '(' NUM ',' NUM ',' NUM ')';</code></pre>
|
||||||
<p>The parser analyzes the turtle source code and if the input matches the definition above, the parser recognizes it as a primary procedure.</p>
|
<p>The parser analyzes the turtle source code and if the input matches the definition above, the parser recognizes it as a primary procedure.</p>
|
||||||
<p>The grammar of turtle is described in the <a href="turtle/turtle_doc.src.md">document</a>. The following is an extract from the document.</p>
|
<p>The grammar of turtle is described in the <a href="turtle_doc.html">document</a>. The following is an extract from the document.</p>
|
||||||
<pre><code>program:
|
<pre><code>program:
|
||||||
statement
|
statement
|
||||||
| program statement
|
| program statement
|
||||||
|
|
|
@ -76,7 +76,6 @@
|
||||||
code span.va { color: #19177c; } /* Variable */
|
code span.va { color: #19177c; } /* Variable */
|
||||||
code span.vs { color: #4070a0; } /* VerbatimString */
|
code span.vs { color: #4070a0; } /* VerbatimString */
|
||||||
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
||||||
body {width: 1080px; margin: 0 auto; font-size: large;}
|
|
||||||
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
||||||
|
|
|
@ -76,7 +76,6 @@
|
||||||
code span.va { color: #19177c; } /* Variable */
|
code span.va { color: #19177c; } /* Variable */
|
||||||
code span.vs { color: #4070a0; } /* VerbatimString */
|
code span.vs { color: #4070a0; } /* VerbatimString */
|
||||||
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
||||||
body {width: 1080px; margin: 0 auto; font-size: large;}
|
|
||||||
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
||||||
|
|
|
@ -76,7 +76,6 @@
|
||||||
code span.va { color: #19177c; } /* Variable */
|
code span.va { color: #19177c; } /* Variable */
|
||||||
code span.vs { color: #4070a0; } /* VerbatimString */
|
code span.vs { color: #4070a0; } /* VerbatimString */
|
||||||
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
||||||
body {width: 1080px; margin: 0 auto; font-size: large;}
|
|
||||||
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
||||||
|
|
|
@ -76,7 +76,6 @@
|
||||||
code span.va { color: #19177c; } /* Variable */
|
code span.va { color: #19177c; } /* Variable */
|
||||||
code span.vs { color: #4070a0; } /* VerbatimString */
|
code span.vs { color: #4070a0; } /* VerbatimString */
|
||||||
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
||||||
body {width: 1080px; margin: 0 auto; font-size: large;}
|
|
||||||
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
||||||
|
|
|
@ -76,7 +76,6 @@
|
||||||
code span.va { color: #19177c; } /* Variable */
|
code span.va { color: #19177c; } /* Variable */
|
||||||
code span.vs { color: #4070a0; } /* VerbatimString */
|
code span.vs { color: #4070a0; } /* VerbatimString */
|
||||||
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
||||||
body {width: 1080px; margin: 0 auto; font-size: large;}
|
|
||||||
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
||||||
|
|
|
@ -76,7 +76,6 @@
|
||||||
code span.va { color: #19177c; } /* Variable */
|
code span.va { color: #19177c; } /* Variable */
|
||||||
code span.vs { color: #4070a0; } /* VerbatimString */
|
code span.vs { color: #4070a0; } /* VerbatimString */
|
||||||
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
||||||
body {width: 1080px; margin: 0 auto; font-size: large;}
|
|
||||||
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
||||||
|
|
|
@ -76,7 +76,6 @@
|
||||||
code span.va { color: #19177c; } /* Variable */
|
code span.va { color: #19177c; } /* Variable */
|
||||||
code span.vs { color: #4070a0; } /* VerbatimString */
|
code span.vs { color: #4070a0; } /* VerbatimString */
|
||||||
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
||||||
body {width: 1080px; margin: 0 auto; font-size: large;}
|
|
||||||
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
||||||
|
|
|
@ -76,7 +76,6 @@
|
||||||
code span.va { color: #19177c; } /* Variable */
|
code span.va { color: #19177c; } /* Variable */
|
||||||
code span.vs { color: #4070a0; } /* VerbatimString */
|
code span.vs { color: #4070a0; } /* VerbatimString */
|
||||||
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
||||||
body {width: 1080px; margin: 0 auto; font-size: large;}
|
|
||||||
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
||||||
|
|
|
@ -76,7 +76,6 @@
|
||||||
code span.va { color: #19177c; } /* Variable */
|
code span.va { color: #19177c; } /* Variable */
|
||||||
code span.vs { color: #4070a0; } /* VerbatimString */
|
code span.vs { color: #4070a0; } /* VerbatimString */
|
||||||
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
||||||
body {width: 1080px; margin: 0 auto; font-size: large;}
|
|
||||||
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
||||||
|
|
|
@ -76,7 +76,6 @@
|
||||||
code span.va { color: #19177c; } /* Variable */
|
code span.va { color: #19177c; } /* Variable */
|
||||||
code span.vs { color: #4070a0; } /* VerbatimString */
|
code span.vs { color: #4070a0; } /* VerbatimString */
|
||||||
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
||||||
body {width: 1080px; margin: 0 auto; font-size: large;}
|
|
||||||
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
||||||
|
|
|
@ -76,7 +76,6 @@
|
||||||
code span.va { color: #19177c; } /* Variable */
|
code span.va { color: #19177c; } /* Variable */
|
||||||
code span.vs { color: #4070a0; } /* VerbatimString */
|
code span.vs { color: #4070a0; } /* VerbatimString */
|
||||||
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
||||||
body {width: 1080px; margin: 0 auto; font-size: large;}
|
|
||||||
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
||||||
|
|
|
@ -76,7 +76,6 @@
|
||||||
code span.va { color: #19177c; } /* Variable */
|
code span.va { color: #19177c; } /* Variable */
|
||||||
code span.vs { color: #4070a0; } /* VerbatimString */
|
code span.vs { color: #4070a0; } /* VerbatimString */
|
||||||
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
||||||
body {width: 1080px; margin: 0 auto; font-size: large;}
|
|
||||||
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
||||||
|
|
|
@ -76,7 +76,6 @@
|
||||||
code span.va { color: #19177c; } /* Variable */
|
code span.va { color: #19177c; } /* Variable */
|
||||||
code span.vs { color: #4070a0; } /* VerbatimString */
|
code span.vs { color: #4070a0; } /* VerbatimString */
|
||||||
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
||||||
body {width: 1080px; margin: 0 auto; font-size: large;}
|
|
||||||
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
||||||
|
|
|
@ -304,7 +304,7 @@ In addition, some other conversions are made by `src2md` method.
|
||||||
|
|
||||||
- Relative links are changed according to the change of the base directory.
|
- Relative links are changed according to the change of the base directory.
|
||||||
- Size option in image link is removed when the destination is GFM or html.
|
- Size option in image link is removed when the destination is GFM or html.
|
||||||
- Relative link is removed when the destination is latex.
|
- Relative link is removed when the destination is html and/or latex.
|
||||||
|
|
||||||
The order of the conversions are:
|
The order of the conversions are:
|
||||||
|
|
||||||
|
@ -449,6 +449,15 @@ Type `rake html` to generate html files.
|
||||||
First, it generates pandoc's markdown files under `docs` directory.
|
First, it generates pandoc's markdown files under `docs` directory.
|
||||||
Then, pandoc converts them to html files.
|
Then, pandoc converts them to html files.
|
||||||
The width and height of image files are removed.
|
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.
|
`index.html` is the top html file.
|
||||||
If you want to clean html files, type `rake clobber`
|
If you want to clean html files, type `rake clobber`
|
||||||
|
|
11
gfm/sec25.md
11
gfm/sec25.md
|
@ -1041,7 +1041,7 @@ The semantic value of `statement` is assigned to the one of `program` and the st
|
||||||
The following is the grammar rule extracted from `turtle.y`.
|
The following is the grammar rule extracted from `turtle.y`.
|
||||||
The rules there are based on the same idea above.
|
The rules there are based on the same idea above.
|
||||||
I don't want to explain the whole rules below.
|
I don't want to explain the whole rules below.
|
||||||
Please look into each line carefully so that you will understand all the rules and actions.
|
Please look into each line carefully so that you will understand all the rules and actions.
|
||||||
|
|
||||||
~~~bison
|
~~~bison
|
||||||
program:
|
program:
|
||||||
|
@ -1203,7 +1203,7 @@ union _object_t {
|
||||||
node_t *node;
|
node_t *node;
|
||||||
double value;
|
double value;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
int type;
|
int type;
|
||||||
char *name;
|
char *name;
|
||||||
|
@ -1508,8 +1508,8 @@ struct color {
|
||||||
double green;
|
double green;
|
||||||
double blue;
|
double blue;
|
||||||
};
|
};
|
||||||
static struct color bc = {0.95, 0.95, 0.95}; /* white */
|
static struct color bc = {0.95, 0.95, 0.95}; /* white */
|
||||||
static struct color fc = {0.0, 0.0, 0.0}; /* black */
|
static struct color fc = {0.0, 0.0, 0.0}; /* black */
|
||||||
|
|
||||||
/* cairo */
|
/* cairo */
|
||||||
static cairo_t *cr;
|
static cairo_t *cr;
|
||||||
|
@ -1603,7 +1603,7 @@ double value = 0.0;
|
||||||
case N_NUM:
|
case N_NUM:
|
||||||
value = value(node);
|
value = value(node);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
runtime_error ("Illegal expression.\n");
|
runtime_error ("Illegal expression.\n");
|
||||||
}
|
}
|
||||||
return value;
|
return value;
|
||||||
|
@ -1950,5 +1950,4 @@ However, the following information is very useful (but old).
|
||||||
Lately, lots of source codes are in the internet.
|
Lately, lots of source codes are in the internet.
|
||||||
Maybe reading source codes are the most useful for programmers.
|
Maybe reading source codes are the most useful for programmers.
|
||||||
|
|
||||||
|
|
||||||
Up: [Readme.md](../Readme.md), Prev: [Section 24](sec24.md), Next: [Section 26](sec26.md)
|
Up: [Readme.md](../Readme.md), Prev: [Section 24](sec24.md), Next: [Section 26](sec26.md)
|
||||||
|
|
|
@ -268,7 +268,7 @@ Therefore, GtkListItem instance is used as the `this` object of the lookup tag w
|
||||||
`this` object will be explained in [section 28](sec28.md).
|
`this` object will be explained in [section 28](sec28.md).
|
||||||
|
|
||||||
The C source code is as follows.
|
The C source code is as follows.
|
||||||
Its name is `list2.c` and located under [src/misc](misc) directory.
|
Its name is `list2.c` and located under [src/misc](../src/misc) directory.
|
||||||
|
|
||||||
~~~C
|
~~~C
|
||||||
1 #include <gtk/gtk.h>
|
1 #include <gtk/gtk.h>
|
||||||
|
@ -427,7 +427,7 @@ Because it can be NULL when GListItem `item` is unbound.
|
||||||
If its GFileInfo, then return the filename (copy of the filename).
|
If its GFileInfo, then return the filename (copy of the filename).
|
||||||
|
|
||||||
The whole program (`list3.c`) is as follows.
|
The whole program (`list3.c`) is as follows.
|
||||||
The program is located in [src/misc](misc) directory.
|
The program is located in [src/misc](../src/misc) directory.
|
||||||
|
|
||||||
~~~C
|
~~~C
|
||||||
1 #include <gtk/gtk.h>
|
1 #include <gtk/gtk.h>
|
||||||
|
|
|
@ -1,19 +0,0 @@
|
||||||
require 'fileutils'
|
|
||||||
include FileUtils
|
|
||||||
|
|
||||||
def cp_images srcmdfiles, dst_dir
|
|
||||||
mkdir_p(dst_dir) unless Dir.exist?(dst_dir)
|
|
||||||
images = srcmdfiles.map do |file|
|
|
||||||
d = File.dirname(file)
|
|
||||||
f = File.read(file)
|
|
||||||
f = f.gsub(/^ .*\n/,'')
|
|
||||||
f = f.gsub(/^~~~.*?^~~~\n/m,'')
|
|
||||||
imgs = f.scan(/!\[.*?\]\((.*?)\)/).flatten.uniq
|
|
||||||
imgs.map{|img| File.absolute_path("#{d}/#{img}")}
|
|
||||||
end
|
|
||||||
images = images.flatten.sort.uniq
|
|
||||||
images.each do |src|
|
|
||||||
dst = "#{dst_dir}/#{File.basename(src)}"
|
|
||||||
cp(src, dst)
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -80,7 +80,6 @@ def mk_html_template(home, sec_prev, sec_next)
|
||||||
code span.va { color: #19177c; } /* Variable */
|
code span.va { color: #19177c; } /* Variable */
|
||||||
code span.vs { color: #4070a0; } /* VerbatimString */
|
code span.vs { color: #4070a0; } /* VerbatimString */
|
||||||
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
||||||
body {width: 1080px; margin: 0 auto; font-size: large;}
|
|
||||||
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
div.sourceCode { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
pre:not(.sourceCode) { margin: 10px; padding: 16px 10px 8px 10px; border: 2px solid silver; background-color: ghostwhite; overflow-x:scroll}
|
||||||
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
table {margin-left: auto; margin-right: auto; border-collapse: collapse; border: 1px solid;}
|
||||||
|
|
33
lib/lib_renumber.rb
Normal file
33
lib/lib_renumber.rb
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
def renumber secfiles
|
||||||
|
temp_name = get_temp_name()
|
||||||
|
secfiles.sort!{|f,g| f.match(/\d+(\.\d+)?\.src\.md$/).to_a[0].to_f <=> g.match(/\d+(\.\d+)?\.src\.md$/).to_a[0].to_f}
|
||||||
|
rename_rule = []
|
||||||
|
secfiles.each_with_index do |file, i|
|
||||||
|
# rule: sec_file, filename_old, temporary_file, filename_new, number_old, number_new
|
||||||
|
# Be careful that the sec_file will change from filename_old to filename_new. String is mutable!
|
||||||
|
rename_rule << [file, file+temp_name, file.gsub(/\d+(\.\d+)?\.src\.md$/,"#{i+1}.src.md")]
|
||||||
|
end
|
||||||
|
rename_rule.each do |rule|
|
||||||
|
File.rename rule[0], rule[1] if rule[0] != rule[2]
|
||||||
|
end
|
||||||
|
rename_rule.each do |rule|
|
||||||
|
File.rename rule[1], rule[2] if rule[0] != rule[2]
|
||||||
|
end
|
||||||
|
rename_rule.each do |rule|
|
||||||
|
src = File.read(rule[2])
|
||||||
|
changed = false
|
||||||
|
rename_rule.each do |rule|
|
||||||
|
old, temp, new = rule
|
||||||
|
unless old == new
|
||||||
|
old_n = /\d+(\.\d+)?/.match(old).to_a[0]
|
||||||
|
new_n = /\d+(\.\d+)?/.match(new).to_a[0]
|
||||||
|
src = src.gsub(/(\[(S|s)ection *)#{old_n}\]\(sec#{old_n}\.src\.md\)/, "\\1#{new_n}](sec#{new_n})")
|
||||||
|
changed = true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
File.write(rule[2], src) if changed
|
||||||
|
end
|
||||||
|
end
|
||||||
|
def get_temp_name
|
||||||
|
"temp_"+Time.now.to_f.to_s.gsub(/\./,'')
|
||||||
|
end
|
|
@ -298,15 +298,18 @@ def change_link src, old_dir, type, new_dir=nil
|
||||||
raise "Illegal type." unless type == "gfm" || type == "html" || type == "latex"
|
raise "Illegal type." unless type == "gfm" || type == "html" || type == "latex"
|
||||||
new_dir = type if new_dir == nil
|
new_dir = type if new_dir == nil
|
||||||
p_new_dir = Pathname.new(new_dir)
|
p_new_dir = Pathname.new(new_dir)
|
||||||
buf = src.partitions(/^ .*\n/)
|
buf = src.partitions(/^~~~.*?^~~~\n/m)
|
||||||
buf = buf.map{|chunk| chunk.partitions(/^~~~.*?^~~~\n/m)}
|
buf = buf.map{|chunk| chunk =~ /\A~~~.*?^~~~\n\z/m ? chunk : chunk.partitions(/(^ .*\n)+/)}.flatten
|
||||||
buf = buf.inject([]){|b,e| b.append(*e)}
|
# buf = buf.inject([]){|b,e| b.append(*e)}
|
||||||
buf = buf.map{|chunk| chunk.partitions(/`.*?`/)}
|
|
||||||
buf = buf.inject([]){|b,e| b.append(*e)}
|
|
||||||
buf = buf.map do |chunk|
|
buf = buf.map do |chunk|
|
||||||
if (chunk =~ /^ .*\n/ || chunk =~ /^~~~.*?^~~~\n/m) || chunk =~ /`.*?`/
|
if (chunk =~ /\A~~~.*?^~~~\n\z/m || chunk =~ /\A(^ .*\n)+\z/)
|
||||||
chunk
|
chunk
|
||||||
else
|
else
|
||||||
|
# change inline codes (`...`) to escape char ("\e"=0x1B) in the link change procedure temporarily.
|
||||||
|
# This avoids the influence of the change in the inline codes.
|
||||||
|
# So, .src.md files must not include escape code (0x1B).
|
||||||
|
codes = chunk.scan(/`.*?`/)
|
||||||
|
chunk = chunk.gsub(/`.*?`/,"\e")
|
||||||
b = chunk.partitions(/!?\[.*?\]\(.*?\)(\{.*?\})?/)
|
b = chunk.partitions(/!?\[.*?\]\(.*?\)(\{.*?\})?/)
|
||||||
b = b.map do |c|
|
b = b.map do |c|
|
||||||
m = c.match(/(!?\[.*?\])\((.*?)\)(\{.*?\})?/)
|
m = c.match(/(!?\[.*?\])\((.*?)\)(\{.*?\})?/)
|
||||||
|
@ -316,7 +319,9 @@ def change_link src, old_dir, type, new_dir=nil
|
||||||
name = m[1]
|
name = m[1]
|
||||||
target = m[2]
|
target = m[2]
|
||||||
size = m[3]
|
size = m[3]
|
||||||
if target =~ /\.src\.md$/
|
if target.include?("\e")
|
||||||
|
c
|
||||||
|
elsif target =~ /\.src\.md$/
|
||||||
case type
|
case type
|
||||||
when "gfm"
|
when "gfm"
|
||||||
"#{name}(#{File.basename(target).sub(/\.src\.md$/,'.md')})"
|
"#{name}(#{File.basename(target).sub(/\.src\.md$/,'.md')})"
|
||||||
|
@ -348,7 +353,10 @@ def change_link src, old_dir, type, new_dir=nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
b.join
|
c = b.join
|
||||||
|
a = c.split("\e")
|
||||||
|
i = 0
|
||||||
|
codes.inject([a[0]]){|b, code| i+=1; b.append(code, a[i])}.join
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
buf.join
|
buf.join
|
||||||
|
|
|
@ -1,117 +0,0 @@
|
||||||
class Src_file <String
|
|
||||||
def initialize path
|
|
||||||
check_init path
|
|
||||||
super(path)
|
|
||||||
end
|
|
||||||
def replace path
|
|
||||||
check_init path
|
|
||||||
super(path)
|
|
||||||
end
|
|
||||||
|
|
||||||
def check_init path
|
|
||||||
raise "The argument is not String type." unless path.is_a?(String)
|
|
||||||
raise "File #{path} is not exist." unless File.exist?(path)
|
|
||||||
raise "The argment \"#{path}\" doesn't have .src.md suffix." unless path =~ /\.src\.md$/
|
|
||||||
@name = File.basename path, ".src.md"
|
|
||||||
@dirname = File.dirname path
|
|
||||||
end
|
|
||||||
private :check_init
|
|
||||||
|
|
||||||
def path
|
|
||||||
self
|
|
||||||
end
|
|
||||||
def basename
|
|
||||||
@name+".src.md"
|
|
||||||
end
|
|
||||||
def dirname
|
|
||||||
@dirname
|
|
||||||
end
|
|
||||||
def to_md
|
|
||||||
@name+".md"
|
|
||||||
end
|
|
||||||
def to_html
|
|
||||||
@name+".html"
|
|
||||||
end
|
|
||||||
def to_tex
|
|
||||||
@name+".tex"
|
|
||||||
end
|
|
||||||
def c_files
|
|
||||||
File.read(self).scan(/^@@@include\n.*?@@@\n/m).map{|s| s.each_line.to_a}.flatten\
|
|
||||||
.reject{|line| line =~ /@@@include\n|@@@\n/}\
|
|
||||||
.map{|line| @dirname+"/"+(line.match(/\S*/)[0])}
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
class Sec_file < Src_file
|
|
||||||
def initialize path
|
|
||||||
raise "The argment \"#{path}\" doesn't have secXX.src.md form. (XX is int or float.)" unless path =~ /sec\d+(\.\d+)?\.src\.md$/
|
|
||||||
super(path)
|
|
||||||
end
|
|
||||||
def num # the return value is String
|
|
||||||
@name.match(/\d+(\.\d+)?/)[0]
|
|
||||||
end
|
|
||||||
def to_f
|
|
||||||
self.num.to_f
|
|
||||||
end
|
|
||||||
def <=> other
|
|
||||||
if other.instance_of?(Sec_file)
|
|
||||||
self.to_f <=> other.to_f
|
|
||||||
else
|
|
||||||
nil
|
|
||||||
end
|
|
||||||
end
|
|
||||||
# Note: is_i? indicates the number is integer mathematically. For example, 2.0 is an integer.
|
|
||||||
# It doesn't mean the class of the number is Integer.
|
|
||||||
def is_i?
|
|
||||||
self.to_f == self.to_f.floor
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
class Sec_files < Array
|
|
||||||
def initialize sec_files
|
|
||||||
raise "#{sec_files} is not an array." unless sec_files.instance_of? Array
|
|
||||||
sec_files.each do |sec_file|
|
|
||||||
raise "#{sec_file} is not an instance of Sec_file." unless sec_file.instance_of? Sec_file
|
|
||||||
end
|
|
||||||
super(sec_files)
|
|
||||||
end
|
|
||||||
def renum!
|
|
||||||
temp = get_temp_name()
|
|
||||||
self.sort!
|
|
||||||
rename_rule = []
|
|
||||||
self.each_with_index do |file, i|
|
|
||||||
# rule: sec_file, filename_old, temporary_file, filename_new, number_old, number_new
|
|
||||||
# Be careful that the sec_file will change from filename_old to filename_new. String is mutable!
|
|
||||||
rename_rule << [file, String.new(file), file+temp, file.gsub(/\d+(\.\d+)?\.src\.md$/,"#{i+1}.src.md"),\
|
|
||||||
file.match(/(\d+(\.\d+)?)\.src\.md$/)[1], (i+1).to_s]
|
|
||||||
end
|
|
||||||
rename_rule.each do |rule|
|
|
||||||
File.rename rule[1], rule[2] if rule[1] != rule[3]
|
|
||||||
end
|
|
||||||
rename_rule.each do |rule|
|
|
||||||
File.rename rule[2], rule[3] if rule[1] != rule[3]
|
|
||||||
rule[0].replace rule[3]
|
|
||||||
end
|
|
||||||
self.each do |file|
|
|
||||||
org = File.read(file)
|
|
||||||
new = File.read(file)
|
|
||||||
rename_rule.each do |rule|
|
|
||||||
if rule[1] != rule[3]
|
|
||||||
new = new.gsub(/(\[(S|s)ection *)#{rule[4]}\]\(sec#{rule[4]}\.src\.md\)/, "\\1#{rule[4]}](#{rule[2]})")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
rename_rule.each do |rule|
|
|
||||||
if rule[1] != rule[3]
|
|
||||||
new = new.gsub(/(\[(S|s)ection *)#{rule[4]}\]\(#{rule[2]}\)/, "\\1#{rule[5]}](sec#{rule[5]}.src.md)")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
File.write(file, new) unless new == org
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
|
||||||
def get_temp_name
|
|
||||||
"temp_"+Time.now.to_f.to_s.gsub(/\./,'')
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
|
@ -304,7 +304,7 @@ In addition, some other conversions are made by `src2md` method.
|
||||||
|
|
||||||
- Relative links are changed according to the change of the base directory.
|
- Relative links are changed according to the change of the base directory.
|
||||||
- Size option in image link is removed when the destination is GFM or html.
|
- Size option in image link is removed when the destination is GFM or html.
|
||||||
- Relative link is removed when the destination is latex.
|
- Relative link is removed when the destination is html and/or latex.
|
||||||
|
|
||||||
The order of the conversions are:
|
The order of the conversions are:
|
||||||
|
|
||||||
|
@ -449,6 +449,15 @@ Type `rake html` to generate html files.
|
||||||
First, it generates pandoc's markdown files under `docs` directory.
|
First, it generates pandoc's markdown files under `docs` directory.
|
||||||
Then, pandoc converts them to html files.
|
Then, pandoc converts them to html files.
|
||||||
The width and height of image files are removed.
|
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.
|
`index.html` is the top html file.
|
||||||
If you want to clean html files, type `rake clobber`
|
If you want to clean html files, type `rake clobber`
|
||||||
|
|
35
test/test_lib_renumber.rb
Normal file
35
test/test_lib_renumber.rb
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
# test_lib_sec_file.rb
|
||||||
|
require 'minitest/autorun'
|
||||||
|
require 'fileutils'
|
||||||
|
require_relative "../lib/lib_renumber.rb"
|
||||||
|
|
||||||
|
|
||||||
|
class Test_lib_renumber < Minitest::Test
|
||||||
|
include FileUtils
|
||||||
|
def test_renumber
|
||||||
|
table = [
|
||||||
|
["sec4.src.md", "sample5\n", "sec5.src.md"],
|
||||||
|
["sec0.5.src.md", "sample2\n", "sec2.src.md"],
|
||||||
|
["sec1.5.src.md", "sample4\n", "sec4.src.md"],
|
||||||
|
["sec0.src.md", "sample1\n", "sec1.src.md"],
|
||||||
|
["sec5.5.src.md", "sample6\n", "sec6.src.md"],
|
||||||
|
["sec1.src.md", "sample3\n", "sec3.src.md"]
|
||||||
|
]
|
||||||
|
temp_dir = get_temp_name()
|
||||||
|
Dir.mkdir temp_dir unless Dir.exist? temp_dir
|
||||||
|
table = table.map{|t| ["#{temp_dir}/#{t[0]}", t[1], "#{temp_dir}/#{t[2]}"]}
|
||||||
|
table.each{|t| File.write(t[0], t[1])}
|
||||||
|
files = table.map{|t| t[0]}
|
||||||
|
renumber files
|
||||||
|
table.each do |t|
|
||||||
|
t << File.read(t[2])
|
||||||
|
end
|
||||||
|
remove_entry_secure(temp_dir)
|
||||||
|
table.each do |t|
|
||||||
|
assert_equal t[1], t[3]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
def get_temp_name
|
||||||
|
"temp_"+Time.now.to_f.to_s.gsub(/\./,'')
|
||||||
|
end
|
||||||
|
end
|
|
@ -847,6 +847,19 @@ class Test_lib_src_file < Minitest::Test
|
||||||
assert_equal "[Section 3](sec3.md)", change_link("[Section 3](sec3.src.md)", "src", "gfm")
|
assert_equal "[Section 3](sec3.md)", change_link("[Section 3](sec3.src.md)", "src", "gfm")
|
||||||
assert_equal "[Section 3](sec3.html)", change_link("[Section 3](sec3.src.md)", "src", "html")
|
assert_equal "[Section 3](sec3.html)", change_link("[Section 3](sec3.src.md)", "src", "html")
|
||||||
assert_equal "Section 3", change_link("[Section 3](sec3.src.md)", "src", "latex")
|
assert_equal "Section 3", change_link("[Section 3](sec3.src.md)", "src", "latex")
|
||||||
|
src_src = <<~'EOS'
|
||||||
|
[Section 1](`sec1.src.md`)
|
||||||
|
[`document`](../doc/document.src.md)
|
||||||
|
`![image](../image/image.png){width=9.0cm height=6.0cm}``
|
||||||
|
[Github`](`https://github.com/ToshioCP)
|
||||||
|
EOS
|
||||||
|
dst_src = <<~'EOS'
|
||||||
|
[Section 1](`sec1.src.md`)
|
||||||
|
[`document`](document.md)
|
||||||
|
`![image](../image/image.png){width=9.0cm height=6.0cm}``
|
||||||
|
[Github`](`https://github.com/ToshioCP)
|
||||||
|
EOS
|
||||||
|
assert_equal dst_src, change_link(src_src, "src", "gfm", "gfm")
|
||||||
end
|
end
|
||||||
def test_src2md
|
def test_src2md
|
||||||
temp = "temp"
|
temp = "temp"
|
||||||
|
@ -865,11 +878,11 @@ class Test_lib_src_file < Minitest::Test
|
||||||
remove_entry_secure(temp)
|
remove_entry_secure(temp)
|
||||||
|
|
||||||
# If you want to see the difference
|
# If you want to see the difference
|
||||||
# Diff::LCS.diff(files_src2md()[:sample_md_gfm].each_line.to_a, dst_md["gfm"].each_line.to_a).each do |array|
|
Diff::LCS.diff(files_src2md()[:sample_md_gfm].each_line.to_a, dst_md["gfm"].each_line.to_a).each do |array|
|
||||||
# array.each do |change|
|
array.each do |change|
|
||||||
# print "#{change.action} #{change.position.to_s.chomp}: #{change.element.to_s.chomp}\n"
|
print "#{change.action} #{change.position.to_s.chomp}: #{change.element.to_s.chomp}\n"
|
||||||
# end
|
end
|
||||||
# end
|
end
|
||||||
# Diff::LCS.diff(files()[:sample_md_latex].each_line.to_a, dst_md["latex"].each_line.to_a).each do |array|
|
# Diff::LCS.diff(files()[:sample_md_latex].each_line.to_a, dst_md["latex"].each_line.to_a).each do |array|
|
||||||
# array.each do |change|
|
# array.each do |change|
|
||||||
# print "#{change.action} #{change.position.to_s.chomp}: #{change.element.to_s.chomp}\n"
|
# print "#{change.action} #{change.position.to_s.chomp}: #{change.element.to_s.chomp}\n"
|
||||||
|
|
|
@ -1,149 +0,0 @@
|
||||||
# test_lib_sec_file.rb
|
|
||||||
require 'minitest/autorun'
|
|
||||||
require 'fileutils'
|
|
||||||
require_relative "../lib/lib_src_file.rb"
|
|
||||||
|
|
||||||
module Prepare_test
|
|
||||||
def files_srcfile
|
|
||||||
src_text = <<~'EOS'
|
|
||||||
This is a source file.
|
|
||||||
EOS
|
|
||||||
|
|
||||||
sample_c = <<~'EOS'
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
int
|
|
||||||
main (int argc, char **argv) {
|
|
||||||
printf ("Hello world.\n");
|
|
||||||
}
|
|
||||||
EOS
|
|
||||||
|
|
||||||
sec1_text = <<~'EOS'
|
|
||||||
This is a test file.
|
|
||||||
The sorce of `sample.c` is:
|
|
||||||
|
|
||||||
@@@include
|
|
||||||
sample.c main
|
|
||||||
@@@
|
|
||||||
|
|
||||||
It is the simplest C program.
|
|
||||||
EOS
|
|
||||||
|
|
||||||
sec2_text = <<~'EOS'
|
|
||||||
To compile the C source file `sample.c`, type:
|
|
||||||
|
|
||||||
~~~
|
|
||||||
$ gcc sample.c
|
|
||||||
~~~
|
|
||||||
|
|
||||||
Then executable file `a.out` is generated.
|
|
||||||
|
|
||||||
@@@shell
|
|
||||||
ls
|
|
||||||
@@@
|
|
||||||
|
|
||||||
To execute it, type:
|
|
||||||
|
|
||||||
~~~
|
|
||||||
$ ./a.out
|
|
||||||
~~~
|
|
||||||
|
|
||||||
The source code is in [Section 1](sec1.src.md)
|
|
||||||
EOS
|
|
||||||
|
|
||||||
sec05_text = <<~'EOS'
|
|
||||||
Prerequisite
|
|
||||||
|
|
||||||
- Linux OS like Ubuntu or Debian.
|
|
||||||
- gcc
|
|
||||||
EOS
|
|
||||||
|
|
||||||
[
|
|
||||||
["srcfile.src.md", src_text],
|
|
||||||
["sample.c", sample_c],
|
|
||||||
["sec1.src.md", sec1_text],
|
|
||||||
["sec2.src.md", sec2_text],
|
|
||||||
["sec0.5.src.md", sec05_text]
|
|
||||||
]
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
class Test_lib_src_file < Minitest::Test
|
|
||||||
include FileUtils
|
|
||||||
include Prepare_test
|
|
||||||
def setup
|
|
||||||
# Create sample file
|
|
||||||
@temp = get_temp_name()
|
|
||||||
Dir.mkdir @temp unless Dir.exist? @temp
|
|
||||||
files_srcfile().each do |f|
|
|
||||||
File.write "#{@temp}/#{f[0]}", f[1]
|
|
||||||
end
|
|
||||||
end
|
|
||||||
def teardown
|
|
||||||
remove_entry_secure(@temp)
|
|
||||||
end
|
|
||||||
def test_src_file
|
|
||||||
src = Src_file.new "#{@temp}/srcfile.src.md"
|
|
||||||
test_items = [
|
|
||||||
["path", "#{@temp}/srcfile.src.md"],
|
|
||||||
["basename", "srcfile.src.md"],
|
|
||||||
["dirname", "#{@temp}"],
|
|
||||||
["to_md", "srcfile.md"],
|
|
||||||
["to_html", "srcfile.html"],
|
|
||||||
["to_tex", "srcfile.tex"],
|
|
||||||
]
|
|
||||||
test_items.each do |item|
|
|
||||||
assert_equal item[1], src.public_send(item[0].to_sym)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
def test_sec_file
|
|
||||||
src_sec05 = Sec_file.new "#{@temp}/sec0.5.src.md"
|
|
||||||
src_sec1 = Sec_file.new "#{@temp}/sec1.src.md"
|
|
||||||
src_sec2 = Sec_file.new "#{@temp}/sec2.src.md"
|
|
||||||
test_items = [
|
|
||||||
["path", "#{@temp}/sec1.src.md"],
|
|
||||||
["basename", "sec1.src.md"],
|
|
||||||
["dirname", "#{@temp}"],
|
|
||||||
["c_files", [ "#{@temp}/sample.c" ]],
|
|
||||||
["to_md", "sec1.md"],
|
|
||||||
["to_html", "sec1.html"],
|
|
||||||
["to_tex", "sec1.tex"],
|
|
||||||
["num", "1"],
|
|
||||||
["to_f", 1.0],
|
|
||||||
["<=>", src_sec05, 1],
|
|
||||||
["<=>", src_sec1, 0],
|
|
||||||
["<=>", src_sec2, -1],
|
|
||||||
["is_i?", true]
|
|
||||||
]
|
|
||||||
test_items.each do |item|
|
|
||||||
if item.size == 2
|
|
||||||
assert_equal item[1], src_sec1.public_send(item[0].to_sym)
|
|
||||||
else
|
|
||||||
assert_equal item[2], src_sec1.public_send(item[0].to_sym, item[1])
|
|
||||||
end
|
|
||||||
end
|
|
||||||
refute src_sec05.is_i?
|
|
||||||
end
|
|
||||||
def test_sec_files
|
|
||||||
temp_renum = "temp_renum"+get_temp_name()
|
|
||||||
unless Dir.exist? temp_renum
|
|
||||||
Dir.mkdir temp_renum
|
|
||||||
end
|
|
||||||
files_srcfile().each do |f|
|
|
||||||
File.write "#{temp_renum}/#{f[0]}", f[1]
|
|
||||||
end
|
|
||||||
src_sec05 = Sec_file.new "#{temp_renum}/sec0.5.src.md"
|
|
||||||
src_sec1 = Sec_file.new "#{temp_renum}/sec1.src.md"
|
|
||||||
src_sec2 = Sec_file.new "#{temp_renum}/sec2.src.md"
|
|
||||||
sec_files = Sec_files.new [src_sec05, src_sec1, src_sec2]
|
|
||||||
sec_files.renum!
|
|
||||||
line_actual = File.read(src_sec2).match(/The source code is in \[Section \d\]\(sec\d.src.md\)\n/).to_a[0]
|
|
||||||
remove_entry_secure(temp_renum)
|
|
||||||
assert_equal ["#{temp_renum}/sec1.src.md", "#{temp_renum}/sec2.src.md", "#{temp_renum}/sec3.src.md"], sec_files
|
|
||||||
assert_equal "The source code is in [Section 2](sec2.src.md)\n", line_actual
|
|
||||||
end
|
|
||||||
private
|
|
||||||
def get_temp_name
|
|
||||||
"temp_"+Time.now.to_f.to_s.gsub(/\./,'')
|
|
||||||
end
|
|
||||||
end
|
|
57
test/test_rakefile.rb
Normal file
57
test/test_rakefile.rb
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
# test_lib_sec_file.rb
|
||||||
|
require 'minitest/autorun'
|
||||||
|
require 'fileutils'
|
||||||
|
# require_relative "../Rakefile"
|
||||||
|
|
||||||
|
|
||||||
|
class Test_rakefile < Minitest::Test
|
||||||
|
include FileUtils
|
||||||
|
def test_rakefile
|
||||||
|
rakefile = File.read("../Rakefile")
|
||||||
|
c_files = rakefile.match(/^def c_files.*?^end\n/m)[0]
|
||||||
|
eval c_files
|
||||||
|
src = <<~'EOS'
|
||||||
|
## meson.build
|
||||||
|
|
||||||
|
@@@include
|
||||||
|
tfe5/meson.build
|
||||||
|
@@@
|
||||||
|
|
||||||
|
## tfe.gresource.xml
|
||||||
|
|
||||||
|
@@@include
|
||||||
|
tfe5/tfe.gresource.xml
|
||||||
|
@@@
|
||||||
|
|
||||||
|
## tfe.ui
|
||||||
|
|
||||||
|
@@@include
|
||||||
|
tfe5/tfe.ui
|
||||||
|
@@@
|
||||||
|
|
||||||
|
## tfe.h
|
||||||
|
|
||||||
|
@@@include
|
||||||
|
tfe5/tfe.h
|
||||||
|
@@@
|
||||||
|
|
||||||
|
## tfeapplication.c
|
||||||
|
|
||||||
|
@@@include
|
||||||
|
tfe5/tfeapplication.c app_startup app_open
|
||||||
|
@@@
|
||||||
|
EOS
|
||||||
|
temp_dir = get_temp_name()
|
||||||
|
Dir.mkdir temp_dir unless Dir.exist? temp_dir
|
||||||
|
path = "#{temp_dir}/secXX.src.md"
|
||||||
|
File.write(path, src)
|
||||||
|
expected = ["tfe5/meson.build", "tfe5/tfe.gresource.xml", "tfe5/tfe.ui", "tfe5/tfe.h", "tfe5/tfeapplication.c"]\
|
||||||
|
.map{|f| "#{temp_dir}/#{f}"}
|
||||||
|
actual = c_files(path)
|
||||||
|
remove_entry_secure(temp_dir)
|
||||||
|
assert_equal expected.sort, actual.sort
|
||||||
|
end
|
||||||
|
def get_temp_name
|
||||||
|
"temp_"+Time.now.to_f.to_s.gsub(/\./,'')
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in a new issue