Compare commits
52 commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0bd0bd3877 | ||
|
|
a04d029226 | ||
|
|
587098c158 | ||
|
|
6f16960ec2 | ||
|
|
e58dee0113 | ||
|
|
775e950be5 | ||
|
|
0d0aaa7e29 | ||
|
|
89c4bb2625 | ||
|
|
0cd37a40ef | ||
|
|
62aa71babf | ||
|
|
a6cec6fe80 | ||
|
|
106efcb56b | ||
|
|
b4c5e06295 | ||
|
|
382641aed8 | ||
|
|
a133539b15 | ||
|
|
aa25b732f5 | ||
|
|
618906f3f2 | ||
|
|
f0587c9a8f | ||
|
|
b541d04623 | ||
|
|
2a67799c8a | ||
|
|
54b6e49fdc | ||
|
|
a440c07e35 | ||
|
|
8337b4b817 | ||
|
|
81856ba7d9 | ||
|
|
32ff8d601f | ||
|
|
0c7010e381 | ||
|
|
7fa4dd3ed5 | ||
|
|
edfe80ca13 | ||
|
|
989058e4d7 | ||
|
|
c6417fb0d3 | ||
|
|
3b3ab43856 | ||
|
|
112eef2a3f | ||
|
|
a57027acdd | ||
|
|
5986e1f090 | ||
|
|
4e36057f75 | ||
|
|
b71202faf2 | ||
|
|
62b6e46702 | ||
|
|
063a45c1da | ||
|
|
0fd94db2e6 | ||
|
|
9c62e0e844 | ||
|
|
440cba53d3 | ||
|
|
dfd0f80a19 | ||
|
|
cdb74e8e4f | ||
|
|
e253f79698 | ||
|
|
4fe1376fce | ||
|
|
651fb40bb6 | ||
|
|
07cc8f6600 | ||
|
|
a7b8116357 | ||
|
|
4ed8b34d0f | ||
|
|
9fcb01c621 | ||
|
|
375db8c398 | ||
|
|
d073c81deb |
55 changed files with 705 additions and 656 deletions
|
|
@ -1,4 +1,4 @@
|
||||||
[](https://app.wercker.com/project/bykey/389477226e537a45143ea91336dca281)
|
[](https://app.wercker.com/project/byKey/8d96ab89960da21d87a545a25acae54c)
|
||||||
|
|
||||||
This repo contains the sources for the Nim by Example book.
|
This repo contains the sources for the Nim by Example book.
|
||||||
|
|
||||||
|
|
|
||||||
50
Rules
50
Rules
|
|
@ -13,35 +13,59 @@
|
||||||
# item, use the pattern “/about/*/”; “/about/*” will also select the parent,
|
# item, use the pattern “/about/*/”; “/about/*” will also select the parent,
|
||||||
# because “*” matches zero or more characters.
|
# because “*” matches zero or more characters.
|
||||||
|
|
||||||
compile '*' do
|
compile '/assets/css/*' do
|
||||||
if item.identifier == '/toc/'
|
filter :erb
|
||||||
|
filter :rainpress if File.basename(item[:content_filename], ".*") == 'all'
|
||||||
|
end
|
||||||
|
|
||||||
|
compile '/assets/js/*' do
|
||||||
|
filter :erb
|
||||||
|
:uglify_js if File.basename(item[:content_filename], ".*") == 'all'
|
||||||
|
end
|
||||||
|
|
||||||
|
compile '/content/*' do
|
||||||
|
if item.identifier.to_s == '/content/toc/'
|
||||||
filter :kramdown
|
filter :kramdown
|
||||||
layout 'blank'
|
layout 'blank'
|
||||||
|
elsif item.identifier.to_s == '/content/footer/'
|
||||||
|
layout 'blank'
|
||||||
elsif item[:extension] == 'md'
|
elsif item[:extension] == 'md'
|
||||||
filter :kramdown, {:input => 'GFM'}
|
filter :kramdown, {:input => 'GFM'}
|
||||||
filter :colorize_syntax, :default_colorizer => :pygmentize
|
filter :colorize_syntax, :default_colorizer => :pygmentize
|
||||||
filter :relativize_paths, :type => :html
|
filter :relativize_paths, :type => :html
|
||||||
layout 'default'
|
layout 'default'
|
||||||
elsif item[:extension] == 'css'
|
|
||||||
# don’t filter stylesheets
|
|
||||||
elsif item.binary?
|
|
||||||
# don’t filter binary items
|
|
||||||
else
|
else
|
||||||
filter :erb
|
filter :erb
|
||||||
layout 'default'
|
layout 'default'
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
route '*' do
|
route '/assets/css/*' do
|
||||||
if item[:extension] == 'css'
|
# if not debug mode, only let all.css through
|
||||||
# Write item with identifier /foo/ to /foo.css
|
unless @config[:debug]
|
||||||
item.identifier.chop + '.css'
|
item.identifier.to_s.chop + '.css' if File.basename(item[:content_filename], ".*") == 'all'
|
||||||
elsif item.binary?
|
else
|
||||||
|
item.identifier.to_s.chop + '.css'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
route '/assets/js/*' do
|
||||||
|
# if not debug mode, only let all.js through
|
||||||
|
unless @config[:debug]
|
||||||
|
item.identifier.to_s.chop + '.js' if File.basename(item[:content_filename], ".*") == 'all'
|
||||||
|
else
|
||||||
|
item.identifier.to_s.chop + '.js'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
route '/content/*' do
|
||||||
|
if item.binary?
|
||||||
# Write item with identifier /foo/ to /foo.ext
|
# Write item with identifier /foo/ to /foo.ext
|
||||||
item.identifier.chop + '.' + item[:extension]
|
item.identifier.to_s.sub("/content", "").chop + '.' + item[:extension]
|
||||||
else
|
else
|
||||||
# Write item with identifier /foo/ to /foo/index.html
|
# Write item with identifier /foo/ to /foo/index.html
|
||||||
item.identifier + 'index.html'
|
item.identifier.to_s.sub("/content", "") + 'index.html'
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
||||||
1
content/assets/css/all.css
Normal file
1
content/assets/css/all.css
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
<%= all_css @config[:stylesheets] %>
|
||||||
72
content/assets/css/colorful.css
Normal file
72
content/assets/css/colorful.css
Normal file
|
|
@ -0,0 +1,72 @@
|
||||||
|
/* pygments-css colorful */
|
||||||
|
code[class^='language-'] .gp {
|
||||||
|
color: #c65d09;
|
||||||
|
font-weight: bold;
|
||||||
|
/* NOTE: Hacks to allow copy-paste */
|
||||||
|
-webkit-touch-callout: none;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-khtml-user-select: none;
|
||||||
|
-moz-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
user-select: none;
|
||||||
|
} /* Generic.Prompt */
|
||||||
|
body:not(.darkmode) code[class^='language-'] .hll { background-color: #ffffcc }
|
||||||
|
body:not(.darkmode) code[class^='language-'] .c { color: #808080 } /* Comment */
|
||||||
|
body:not(.darkmode) code[class^='language-'] .err { color: #F00000; background-color: #F0A0A0 } /* Error */
|
||||||
|
body:not(.darkmode) code[class^='language-'] .k { color: #008000; font-weight: bold } /* Keyword */
|
||||||
|
body:not(.darkmode) code[class^='language-'] .o { color: #303030 } /* Operator */
|
||||||
|
body:not(.darkmode) code[class^='language-'] .cm { color: #808080 } /* Comment.Multiline */
|
||||||
|
body:not(.darkmode) code[class^='language-'] .cp { color: #507090 } /* Comment.Preproc */
|
||||||
|
body:not(.darkmode) code[class^='language-'] .c1 { color: #808080 } /* Comment.Single */
|
||||||
|
body:not(.darkmode) code[class^='language-'] .cs { color: #cc0000; font-weight: bold } /* Comment.Special */
|
||||||
|
body:not(.darkmode) code[class^='language-'] .gd { color: #A00000 } /* Generic.Deleted */
|
||||||
|
body:not(.darkmode) code[class^='language-'] .ge { font-style: italic } /* Generic.Emph */
|
||||||
|
body:not(.darkmode) code[class^='language-'] .gr { color: #FF0000 } /* Generic.Error */
|
||||||
|
body:not(.darkmode) code[class^='language-'] .gh { color: #000080; font-weight: bold } /* Generic.Heading */
|
||||||
|
body:not(.darkmode) code[class^='language-'] .gi { color: #00A000 } /* Generic.Inserted */
|
||||||
|
body:not(.darkmode) code[class^='language-'] .go { color: #808080 } /* Generic.Output */
|
||||||
|
body:not(.darkmode) code[class^='language-'] .gs { font-weight: bold } /* Generic.Strong */
|
||||||
|
body:not(.darkmode) code[class^='language-'] .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
|
||||||
|
body:not(.darkmode) code[class^='language-'] .gt { color: #0040D0 } /* Generic.Traceback */
|
||||||
|
body:not(.darkmode) code[class^='language-'] .kc { color: #008000; font-weight: bold } /* Keyword.Constant */
|
||||||
|
body:not(.darkmode) code[class^='language-'] .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
|
||||||
|
body:not(.darkmode) code[class^='language-'] .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */
|
||||||
|
body:not(.darkmode) code[class^='language-'] .kp { color: #003080; font-weight: bold } /* Keyword.Pseudo */
|
||||||
|
body:not(.darkmode) code[class^='language-'] .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
|
||||||
|
body:not(.darkmode) code[class^='language-'] .kt { color: #303090; font-weight: bold } /* Keyword.Type */
|
||||||
|
body:not(.darkmode) code[class^='language-'] .m { color: #6000E0; font-weight: bold } /* Literal.Number */
|
||||||
|
body:not(.darkmode) code[class^='language-'] .s { background-color: #fff0f0 } /* Literal.String */
|
||||||
|
body:not(.darkmode) code[class^='language-'] .na { color: #0000C0 } /* Name.Attribute */
|
||||||
|
body:not(.darkmode) code[class^='language-'] .nb { color: #007020 } /* Name.Builtin */
|
||||||
|
body:not(.darkmode) code[class^='language-'] .nc { color: #B00060; font-weight: bold } /* Name.Class */
|
||||||
|
body:not(.darkmode) code[class^='language-'] .no { color: #003060; font-weight: bold } /* Name.Constant */
|
||||||
|
body:not(.darkmode) code[class^='language-'] .nd { color: #505050; font-weight: bold } /* Name.Decorator */
|
||||||
|
body:not(.darkmode) code[class^='language-'] .ni { color: #800000; font-weight: bold } /* Name.Entity */
|
||||||
|
body:not(.darkmode) code[class^='language-'] .ne { color: #F00000; font-weight: bold } /* Name.Exception */
|
||||||
|
body:not(.darkmode) code[class^='language-'] .nf { color: #0060B0; font-weight: bold } /* Name.Function */
|
||||||
|
body:not(.darkmode) code[class^='language-'] .nl { color: #907000; font-weight: bold } /* Name.Label */
|
||||||
|
body:not(.darkmode) code[class^='language-'] .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */
|
||||||
|
body:not(.darkmode) code[class^='language-'] .nt { color: #007000 } /* Name.Tag */
|
||||||
|
body:not(.darkmode) code[class^='language-'] .nv { color: #906030 } /* Name.Variable */
|
||||||
|
body:not(.darkmode) code[class^='language-'] .ow { color: #000000; font-weight: bold } /* Operator.Word */
|
||||||
|
body:not(.darkmode) code[class^='language-'] .w { color: #bbbbbb } /* Text.Whitespace */
|
||||||
|
body:not(.darkmode) code[class^='language-'] .mf { color: #6000E0; font-weight: bold } /* Literal.Number.Float */
|
||||||
|
body:not(.darkmode) code[class^='language-'] .mh { color: #005080; font-weight: bold } /* Literal.Number.Hex */
|
||||||
|
body:not(.darkmode) code[class^='language-'] .mi { color: #0000D0; font-weight: bold } /* Literal.Number.Integer */
|
||||||
|
body:not(.darkmode) code[class^='language-'] .mo { color: #4000E0; font-weight: bold } /* Literal.Number.Oct */
|
||||||
|
body:not(.darkmode) code[class^='language-'] .sb { background-color: #fff0f0 } /* Literal.String.Backtick */
|
||||||
|
body:not(.darkmode) code[class^='language-'] .sc { color: #0040D0 } /* Literal.String.Char */
|
||||||
|
body:not(.darkmode) code[class^='language-'] .sd { color: #D04020 } /* Literal.String.Doc */
|
||||||
|
body:not(.darkmode) code[class^='language-'] .s2 { background-color: #fff0f0 } /* Literal.String.Double */
|
||||||
|
body:not(.darkmode) code[class^='language-'] .se { color: #606060; font-weight: bold; background-color: #fff0f0 } /* Literal.String.Escape */
|
||||||
|
body:not(.darkmode) code[class^='language-'] .sh { background-color: #fff0f0 } /* Literal.String.Heredoc */
|
||||||
|
body:not(.darkmode) code[class^='language-'] .si { background-color: #e0e0e0 } /* Literal.String.Interpol */
|
||||||
|
body:not(.darkmode) code[class^='language-'] .sx { color: #D02000; background-color: #fff0f0 } /* Literal.String.Other */
|
||||||
|
body:not(.darkmode) code[class^='language-'] .sr { color: #000000; background-color: #fff0ff } /* Literal.String.Regex */
|
||||||
|
body:not(.darkmode) code[class^='language-'] .s1 { background-color: #fff0f0 } /* Literal.String.Single */
|
||||||
|
body:not(.darkmode) code[class^='language-'] .ss { color: #A06000 } /* Literal.String.Symbol */
|
||||||
|
body:not(.darkmode) code[class^='language-'] .bp { color: #007020 } /* Name.Builtin.Pseudo */
|
||||||
|
body:not(.darkmode) code[class^='language-'] .vc { color: #306090 } /* Name.Variable.Class */
|
||||||
|
body:not(.darkmode) code[class^='language-'] .vg { color: #d07000; font-weight: bold } /* Name.Variable.Global */
|
||||||
|
body:not(.darkmode) code[class^='language-'] .vi { color: #3030B0 } /* Name.Variable.Instance */
|
||||||
|
body:not(.darkmode) code[class^='language-'] .il { color: #0000D0; font-weight: bold } /* Literal.Number.Integer.Long */
|
||||||
8
content/assets/css/cotton_candy.css
Normal file
8
content/assets/css/cotton_candy.css
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
#main code, code * { color: #675D69; }
|
||||||
|
code[class^='language-'] .k { color: #143A77; }
|
||||||
|
code[class^='language-'] .kp { color: #8C5DC7; }
|
||||||
|
code[class^='language-'] .kd { color: #8C5DC7; }
|
||||||
|
code[class^='language-'] .mi { color: #8C5DC7; }
|
||||||
|
code[class^='language-'] .s { color: #0060B0; }
|
||||||
|
code[class^='language-'] .c { color: #91B9A3; }
|
||||||
|
code[class^='language-'] .o { color: #009DE7; }
|
||||||
133
content/assets/css/main.css
Normal file
133
content/assets/css/main.css
Normal file
|
|
@ -0,0 +1,133 @@
|
||||||
|
body {
|
||||||
|
background: #F5F7F6;
|
||||||
|
color: #000000;
|
||||||
|
margin: 0; padding: 0;
|
||||||
|
max-width: 720px;
|
||||||
|
|
||||||
|
text-rendering: optimizelegibility;
|
||||||
|
|
||||||
|
font-family: Palatino, serif;
|
||||||
|
line-height: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebar {
|
||||||
|
margin: 15px;
|
||||||
|
float: left;
|
||||||
|
width: 205px;
|
||||||
|
padding: 10px 0;
|
||||||
|
|
||||||
|
background-color: #FFF;
|
||||||
|
box-shadow: 0px 0px 5px 0px rgba(0,0,0,0.5);
|
||||||
|
|
||||||
|
transition: margin-left 1s;
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebar.collapsed { margin-left: -180px; }
|
||||||
|
|
||||||
|
#sidebar ul { padding: 0 1em; margin: 0; list-style-type: none; }
|
||||||
|
#sidebar li:before { content: '⁃'; padding-right: 0.5em; color: black; }
|
||||||
|
#sidebar li.visited:before { content: '✔'; padding-right: 0.2em; color: green; }
|
||||||
|
|
||||||
|
|
||||||
|
.abs-hamburger {
|
||||||
|
position: relative;
|
||||||
|
width: 0; height: 0;
|
||||||
|
}
|
||||||
|
.nav-toggle {
|
||||||
|
position: absolute;
|
||||||
|
left: 175px;
|
||||||
|
width: 25px; height: 25px;
|
||||||
|
cursor: pointer;
|
||||||
|
margin-right: 5px;
|
||||||
|
margin-bottom: 5px;
|
||||||
|
}
|
||||||
|
.nav-toggle span,
|
||||||
|
.nav-toggle span:before,
|
||||||
|
.nav-toggle span:after {
|
||||||
|
border-radius: 1px;
|
||||||
|
height: 5px;
|
||||||
|
width: 25px;
|
||||||
|
background: white;
|
||||||
|
position: absolute;
|
||||||
|
display: block;
|
||||||
|
content: '';
|
||||||
|
box-shadow: inset 0px 0px 2px 0px #000;
|
||||||
|
}
|
||||||
|
.nav-toggle span:before { top: -8px; }
|
||||||
|
.nav-toggle span:after { bottom: -8px; }
|
||||||
|
.nav-toggle span { margin-top: 9.5px; }
|
||||||
|
|
||||||
|
|
||||||
|
#nextprev {
|
||||||
|
overflow: hidden;
|
||||||
|
padding: .5em 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.text-icon { font-size: 5em; }
|
||||||
|
#arrow-prev { float: left; }
|
||||||
|
#arrow-next { float: right; }
|
||||||
|
|
||||||
|
|
||||||
|
article {
|
||||||
|
margin: 15px;
|
||||||
|
|
||||||
|
transition: max-width 1s;
|
||||||
|
}
|
||||||
|
article.expanded { max-width: 680px; }
|
||||||
|
|
||||||
|
|
||||||
|
a { text-decoration: none; }
|
||||||
|
a:link, a:visited { color: #B45D47; }
|
||||||
|
a:hover { color: #FE3B3B; }
|
||||||
|
|
||||||
|
a.disabled, a:link.disabled, a:visited.disabled { color: #999; pointer-events: none; }
|
||||||
|
a:hover.disabled { color: #888; }
|
||||||
|
|
||||||
|
|
||||||
|
pre, code { font-family: Monaco, Menlo, Consolas, "Courier New", monospace; }
|
||||||
|
code {
|
||||||
|
border-radius: 1px;
|
||||||
|
background-color: #FFF;
|
||||||
|
padding: 0.2em;
|
||||||
|
}
|
||||||
|
pre code {
|
||||||
|
display: block;
|
||||||
|
padding: 1em;
|
||||||
|
white-space: pre-wrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
h1, h2, h3, h4, h5, h6 { line-height: 125%; }
|
||||||
|
|
||||||
|
|
||||||
|
footer {
|
||||||
|
margin-top: 50px;
|
||||||
|
clear: both;
|
||||||
|
|
||||||
|
text-align: center;
|
||||||
|
color: #777;
|
||||||
|
}
|
||||||
|
footer ul { list-style: none; margin: 0; padding: 0; }
|
||||||
|
footer li { display: inline; }
|
||||||
|
footer li+li:before { content: '|'; }
|
||||||
|
footer a:link, footer a:visited { color: #777; }
|
||||||
|
footer a:hover { color: #999; }
|
||||||
|
|
||||||
|
.notransition {
|
||||||
|
-webkit-transition: none !important;
|
||||||
|
-moz-transition: none !important;
|
||||||
|
-o-transition: none !important;
|
||||||
|
-ms-transition: none !important;
|
||||||
|
transition: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@media screen and (min-width: 925px) {
|
||||||
|
body { margin: 0 auto; }
|
||||||
|
body #sidebar.collapsed, body #sidebar { margin-left: -205px; }
|
||||||
|
body article.expanded, body article { max-width: none; width: none; min-width: none; }
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (max-width: 1200px) {
|
||||||
|
body { margin-right: 0; }
|
||||||
|
}
|
||||||
64
content/assets/css/monokai.css
Normal file
64
content/assets/css/monokai.css
Normal file
|
|
@ -0,0 +1,64 @@
|
||||||
|
body.darkmode code[class^='language-'] { background-color: #333; color: #f8f8f2}
|
||||||
|
body.darkmode code[class^='language-'] .hll { background-color: #49483e }
|
||||||
|
body.darkmode code[class^='language-'] .c { color: #75715e } /* Comment */
|
||||||
|
body.darkmode code[class^='language-'] .err { color: #960050; background-color: #1e0010 } /* Error */
|
||||||
|
body.darkmode code[class^='language-'] .k { color: #66d9ef } /* Keyword */
|
||||||
|
body.darkmode code[class^='language-'] .l { color: #ae81ff } /* Literal */
|
||||||
|
body.darkmode code[class^='language-'] .n { color: #f8f8f2 } /* Name */
|
||||||
|
body.darkmode code[class^='language-'] .o { color: #f92672 } /* Operator */
|
||||||
|
body.darkmode code[class^='language-'] .p { color: #f8f8f2 } /* Punctuation */
|
||||||
|
body.darkmode code[class^='language-'] .cm { color: #75715e } /* Comment.Multiline */
|
||||||
|
body.darkmode code[class^='language-'] .cp { color: #75715e } /* Comment.Preproc */
|
||||||
|
body.darkmode code[class^='language-'] .c1 { color: #75715e } /* Comment.Single */
|
||||||
|
body.darkmode code[class^='language-'] .cs { color: #75715e } /* Comment.Special */
|
||||||
|
body.darkmode code[class^='language-'] .ge { font-style: italic } /* Generic.Emph */
|
||||||
|
body.darkmode code[class^='language-'] .gs { font-weight: bold } /* Generic.Strong */
|
||||||
|
body.darkmode code[class^='language-'] .kc { color: #66d9ef } /* Keyword.Constant */
|
||||||
|
body.darkmode code[class^='language-'] .kd { color: #66d9ef } /* Keyword.Declaration */
|
||||||
|
body.darkmode code[class^='language-'] .kn { color: #f92672 } /* Keyword.Namespace */
|
||||||
|
body.darkmode code[class^='language-'] .kp { color: #66d9ef } /* Keyword.Pseudo */
|
||||||
|
body.darkmode code[class^='language-'] .kr { color: #66d9ef } /* Keyword.Reserved */
|
||||||
|
body.darkmode code[class^='language-'] .kt { color: #66d9ef } /* Keyword.Type */
|
||||||
|
body.darkmode code[class^='language-'] .ld { color: #e6db74 } /* Literal.Date */
|
||||||
|
body.darkmode code[class^='language-'] .m { color: #ae81ff } /* Literal.Number */
|
||||||
|
body.darkmode code[class^='language-'] .s { color: #e6db74 } /* Literal.String */
|
||||||
|
body.darkmode code[class^='language-'] .na { color: #a6e22e } /* Name.Attribute */
|
||||||
|
body.darkmode code[class^='language-'] .nb { color: #f8f8f2 } /* Name.Builtin */
|
||||||
|
body.darkmode code[class^='language-'] .nc { color: #a6e22e } /* Name.Class */
|
||||||
|
body.darkmode code[class^='language-'] .no { color: #66d9ef } /* Name.Constant */
|
||||||
|
body.darkmode code[class^='language-'] .nd { color: #a6e22e } /* Name.Decorator */
|
||||||
|
body.darkmode code[class^='language-'] .ni { color: #f8f8f2 } /* Name.Entity */
|
||||||
|
body.darkmode code[class^='language-'] .ne { color: #a6e22e } /* Name.Exception */
|
||||||
|
body.darkmode code[class^='language-'] .nf { color: #a6e22e } /* Name.Function */
|
||||||
|
body.darkmode code[class^='language-'] .nl { color: #f8f8f2 } /* Name.Label */
|
||||||
|
body.darkmode code[class^='language-'] .nn { color: #f8f8f2 } /* Name.Namespace */
|
||||||
|
body.darkmode code[class^='language-'] .nx { color: #a6e22e } /* Name.Other */
|
||||||
|
body.darkmode code[class^='language-'] .py { color: #f8f8f2 } /* Name.Property */
|
||||||
|
body.darkmode code[class^='language-'] .nt { color: #f92672 } /* Name.Tag */
|
||||||
|
body.darkmode code[class^='language-'] .nv { color: #f8f8f2 } /* Name.Variable */
|
||||||
|
body.darkmode code[class^='language-'] .ow { color: #f92672 } /* Operator.Word */
|
||||||
|
body.darkmode code[class^='language-'] .w { color: #f8f8f2 } /* Text.Whitespace */
|
||||||
|
body.darkmode code[class^='language-'] .mf { color: #ae81ff } /* Literal.Number.Float */
|
||||||
|
body.darkmode code[class^='language-'] .mh { color: #ae81ff } /* Literal.Number.Hex */
|
||||||
|
body.darkmode code[class^='language-'] .mi { color: #ae81ff } /* Literal.Number.Integer */
|
||||||
|
body.darkmode code[class^='language-'] .mo { color: #ae81ff } /* Literal.Number.Oct */
|
||||||
|
body.darkmode code[class^='language-'] .sb { color: #e6db74 } /* Literal.String.Backtick */
|
||||||
|
body.darkmode code[class^='language-'] .sc { color: #e6db74 } /* Literal.String.Char */
|
||||||
|
body.darkmode code[class^='language-'] .sd { color: #e6db74 } /* Literal.String.Doc */
|
||||||
|
body.darkmode code[class^='language-'] .s2 { color: #e6db74 } /* Literal.String.Double */
|
||||||
|
body.darkmode code[class^='language-'] .se { color: #ae81ff } /* Literal.String.Escape */
|
||||||
|
body.darkmode code[class^='language-'] .sh { color: #e6db74 } /* Literal.String.Heredoc */
|
||||||
|
body.darkmode code[class^='language-'] .si { color: #e6db74 } /* Literal.String.Interpol */
|
||||||
|
body.darkmode code[class^='language-'] .sx { color: #e6db74 } /* Literal.String.Other */
|
||||||
|
body.darkmode code[class^='language-'] .sr { color: #e6db74 } /* Literal.String.Regex */
|
||||||
|
body.darkmode code[class^='language-'] .s1 { color: #e6db74 } /* Literal.String.Single */
|
||||||
|
body.darkmode code[class^='language-'] .ss { color: #e6db74 } /* Literal.String.Symbol */
|
||||||
|
body.darkmode code[class^='language-'] .bp { color: #f8f8f2 } /* Name.Builtin.Pseudo */
|
||||||
|
body.darkmode code[class^='language-'] .vc { color: #f8f8f2 } /* Name.Variable.Class */
|
||||||
|
body.darkmode code[class^='language-'] .vg { color: #f8f8f2 } /* Name.Variable.Global */
|
||||||
|
body.darkmode code[class^='language-'] .vi { color: #f8f8f2 } /* Name.Variable.Instance */
|
||||||
|
body.darkmode code[class^='language-'] .il { color: #ae81ff } /* Literal.Number.Integer.Long */
|
||||||
|
body.darkmode code[class^='language-'] .gh { } /* Generic Heading & Diff Header */
|
||||||
|
body.darkmode code[class^='language-'] .gu { color: #75715e; } /* Generic.Subheading & Diff Unified/Comment? */
|
||||||
|
body.darkmode code[class^='language-'] .gd { color: #f92672; } /* Generic.Deleted & Diff Deleted */
|
||||||
|
body.darkmode code[class^='language-'] .gi { color: #a6e22e; } /* Generic.Inserted & Diff Inserted */
|
||||||
1
content/assets/css/normalize.css
vendored
Normal file
1
content/assets/css/normalize.css
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}
|
||||||
1
content/assets/js/all.js
Normal file
1
content/assets/js/all.js
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
<%= all_js @config[:scripts] %>
|
||||||
87
content/assets/js/main.js
Normal file
87
content/assets/js/main.js
Normal file
|
|
@ -0,0 +1,87 @@
|
||||||
|
function setVisibleTags(){
|
||||||
|
var tocLinks = document.querySelectorAll("#sidebar a:link, a:visited");
|
||||||
|
for(var i = 0; i < tocLinks.length; i++){
|
||||||
|
if(localStorage.getItem(tocLinks[i].getAttribute("href")) != null){
|
||||||
|
tocLinks[i].parentNode.classList.add("visited");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateSidebar(notransition) {
|
||||||
|
if (notransition) {
|
||||||
|
document.querySelectorAll("#sidebar")[0].classList.add("notransition");
|
||||||
|
document.querySelectorAll("article")[0].classList.add("notransition");
|
||||||
|
}
|
||||||
|
localStorage.setItem("openside", window.sidebarExpanded);
|
||||||
|
if (!window.sidebarExpanded) {
|
||||||
|
document.querySelectorAll("#sidebar")[0].classList.add("collapsed");
|
||||||
|
document.querySelectorAll("article")[0].classList.add("expanded");
|
||||||
|
} else {
|
||||||
|
document.querySelectorAll("#sidebar")[0].classList.remove("collapsed");
|
||||||
|
document.querySelectorAll("article")[0].classList.remove("expanded");
|
||||||
|
}
|
||||||
|
if (notransition) {
|
||||||
|
setTimeout(function(){
|
||||||
|
document.querySelectorAll("#sidebar")[0].classList.remove("notransition");
|
||||||
|
document.querySelectorAll("article")[0].classList.remove("notransition");
|
||||||
|
}, 100);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function sidebarClick() {
|
||||||
|
window.sidebarExpanded = !window.sidebarExpanded;
|
||||||
|
updateSidebar(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
function getNextPrev() {
|
||||||
|
// thanks iznogoodd from #nim @ freenode.net
|
||||||
|
var links = document.querySelectorAll('#sidebar a[href]');
|
||||||
|
|
||||||
|
var nav = {prev: null, next: null};
|
||||||
|
for(var i = 0; i < links.length; i++){
|
||||||
|
var item = links.item(i);
|
||||||
|
if(item && item.getAttribute('href') === window.location.pathname){
|
||||||
|
nav.prev = links.item(i - 1) && links.item(i - 1).getAttribute('href');
|
||||||
|
nav.next = links.item(i + 1) && links.item(i + 1).getAttribute('href');
|
||||||
|
return nav;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateNextPrevButtons() {
|
||||||
|
var nav = getNextPrev();
|
||||||
|
|
||||||
|
var prev = document.getElementById("arrow-prev");
|
||||||
|
var next = document.getElementById("arrow-next");
|
||||||
|
|
||||||
|
if (nav.prev != null) { prev.classList.remove("disabled"); prev.href = nav.prev; }
|
||||||
|
if (nav.next != null) { next.classList.remove("disabled"); next.href = nav.next; }
|
||||||
|
}
|
||||||
|
|
||||||
|
var darkmodeOn = (localStorage.getItem("darkmode") === "true");
|
||||||
|
function toggleDarkMode() {
|
||||||
|
darkmodeOn = !darkmodeOn;
|
||||||
|
document.getElementsByTagName("body")[0].classList.toggle("darkmode");
|
||||||
|
localStorage.setItem("darkmode", darkmodeOn);
|
||||||
|
}
|
||||||
|
|
||||||
|
function initDarkMode() {
|
||||||
|
if (darkmodeOn)
|
||||||
|
document.getElementsByTagName("body")[0].classList.add("darkmode");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
var isMobile = window.screen.width < 720;
|
||||||
|
if (localStorage.getItem("openside") === null) {
|
||||||
|
window.sidebarExpanded = !isMobile;
|
||||||
|
} else {
|
||||||
|
window.sidebarExpanded = (localStorage.getItem("openside") === "true");
|
||||||
|
}
|
||||||
|
|
||||||
|
localStorage.setItem(window.location.pathname, true);
|
||||||
|
window.onload = function(){
|
||||||
|
updateSidebar(true);
|
||||||
|
initDarkMode();
|
||||||
|
setVisibleTags();
|
||||||
|
updateNextPrevButtons();
|
||||||
|
}
|
||||||
|
|
@ -4,7 +4,7 @@ title: Arrays
|
||||||
|
|
||||||
# Arrays
|
# Arrays
|
||||||
|
|
||||||
The arrays in Nim are like classic C arrays, their size is specified at compile-time and cannot given or changed at runtime.
|
The arrays in Nim are like classic C arrays, their size is specified at compile-time and cannot be given or changed at runtime.
|
||||||
|
|
||||||
``` nimrod
|
``` nimrod
|
||||||
type
|
type
|
||||||
|
|
@ -6,11 +6,11 @@ title: Blocks
|
||||||
|
|
||||||
Blocks can be introduced in two different ways: by indenting statements or with `()`s.
|
Blocks can be introduced in two different ways: by indenting statements or with `()`s.
|
||||||
|
|
||||||
The first way ist to use indenting, e.g. using `if-elif-else`, `while`, `for` statements, or the `block` statement.
|
The first way is to use indenting, e.g. using `if-elif-else`, `while`, `for` statements, or the `block` statement.
|
||||||
|
|
||||||
``` nimrod
|
``` nimrod
|
||||||
if true:
|
if true:
|
||||||
echo "Nimrod is great!"
|
echo "Nim is great!"
|
||||||
|
|
||||||
while false:
|
while false:
|
||||||
echo "This line is never output!"
|
echo "This line is never output!"
|
||||||
|
|
@ -54,7 +54,7 @@ Another feature of case statements is that the possible values are narrowed, mea
|
||||||
|
|
||||||
``` nimrod
|
``` nimrod
|
||||||
let x = 2
|
let x = 2
|
||||||
case (x and 3) + 7:
|
case (x and 0b11) + 7:
|
||||||
of 7: echo "A"
|
of 7: echo "A"
|
||||||
of 8: echo "B"
|
of 8: echo "B"
|
||||||
of 9: echo "C"
|
of 9: echo "C"
|
||||||
2
content/content/footer.md
Normal file
2
content/content/footer.md
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
<li><a href="https://github.com/flaviut/nim-by-example">Contribute</a></li><li
|
||||||
|
><a href="#" onclick="toggleDarkMode(); return false;">Toggle dark mode</a></li>
|
||||||
|
|
@ -7,7 +7,7 @@ When installing Nim, you have two options: downloading a copy directly from git,
|
||||||
## Downloading a Nim Distribution
|
## Downloading a Nim Distribution
|
||||||
To get started with Nim, head over to the [downloads page](http://nim-lang.org/download.html) and download the version you'd like.
|
To get started with Nim, head over to the [downloads page](http://nim-lang.org/download.html) and download the version you'd like.
|
||||||
|
|
||||||
The Windows distribution comes with the MinGW compiler, which is recommended, but if you'd like to use your own compiler, download the version without MinGW.
|
The Windows distribution comes with the MinGW compiler, which is recommended, but if you'd like to use your own compiler, download the version without MinGW. If you get an error like `Error: unhandled exception: The system cannot find the file specified.`, then make sure that the C compiler is on your path.
|
||||||
|
|
||||||
On Mac and Linux, it is recommended to use either GCC or Clang.
|
On Mac and Linux, it is recommended to use either GCC or Clang.
|
||||||
|
|
||||||
|
|
@ -17,9 +17,9 @@ Once you have downloaded the appropriate distribution and extracted the files so
|
||||||
To install Nim from git, ensure that you have gcc installed on Windows, Linux, and BSDs and clang on Mac. Afterwards, run the following series of commands to download and bootstrap Nim:
|
To install Nim from git, ensure that you have gcc installed on Windows, Linux, and BSDs and clang on Mac. Afterwards, run the following series of commands to download and bootstrap Nim:
|
||||||
|
|
||||||
```console
|
```console
|
||||||
$ git clone -b master git://github.com/Araq/Nimrod.git
|
$ git clone -b master git://github.com/Araq/Nim.git
|
||||||
$ cd Nimrod
|
$ cd Nim
|
||||||
$ git clone --depth 1 git://github.com/nimrod-code/csources
|
$ git clone --depth 1 git://github.com/nim-lang/csources
|
||||||
$ cd csources
|
$ cd csources
|
||||||
$ sh build.sh # Replace with build.bat on windows
|
$ sh build.sh # Replace with build.bat on windows
|
||||||
$ cd ..
|
$ cd ..
|
||||||
|
|
@ -11,7 +11,7 @@ When inside a loop, `continue` can be used to skip the rest of the loop body and
|
||||||
Along with [its other uses](/block/), the `block` statement can be used to create a label so that it's possible to break out of nested loops.
|
Along with [its other uses](/block/), the `block` statement can be used to create a label so that it's possible to break out of nested loops.
|
||||||
|
|
||||||
<!--skip-->``` nim
|
<!--skip-->``` nim
|
||||||
import strutils, math
|
import strutils, random
|
||||||
|
|
||||||
randomize()
|
randomize()
|
||||||
let answer = random(10) + 1
|
let answer = random(10) + 1
|
||||||
|
|
@ -4,7 +4,7 @@ title: Object Oriented Programming
|
||||||
|
|
||||||
# Object Oriented Programming
|
# Object Oriented Programming
|
||||||
|
|
||||||
Object oriented programming is supported through inheritance and methods, which are virtual procedures. Methods work in the same was as [procs](/procs/), including UFCS, but the runtime type of the object that a method is called with is used to determine which version to call.
|
Object oriented programming is supported through inheritance and methods, which are virtual procedures. Methods work in the same way as [procs](/procs/), including UFCS, but the runtime type of the object that a method is called with is used to determine which version to call.
|
||||||
|
|
||||||
Inheritance is created with the `of` keyword in the type declaration of an object. A method is overridden by creating a new method with parameter types of the subtype.
|
Inheritance is created with the `of` keyword in the type declaration of an object. A method is overridden by creating a new method with parameter types of the subtype.
|
||||||
|
|
||||||
|
|
@ -38,3 +38,19 @@ woof
|
||||||
meow
|
meow
|
||||||
10
|
10
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Testing subtypes
|
||||||
|
|
||||||
|
It is also possible to check if an object is of a given subtype with the `of` keyword. For example,
|
||||||
|
|
||||||
|
``` nimrod
|
||||||
|
echo(animals[0] of Dog)
|
||||||
|
echo(animals[0] of Cat)
|
||||||
|
echo(animals[0] of Animal)
|
||||||
|
```
|
||||||
|
``` console
|
||||||
|
$ nim c -r of_op.nim
|
||||||
|
true
|
||||||
|
false
|
||||||
|
true
|
||||||
|
```
|
||||||
|
|
@ -43,20 +43,16 @@ To get that nice notation, we can use a macro:
|
||||||
```nimrod
|
```nimrod
|
||||||
import macros
|
import macros
|
||||||
|
|
||||||
macro class*(head: expr, body: stmt): stmt {.immediate.} =
|
macro class*(head, body: untyped): untyped =
|
||||||
# The macro is immediate so that it doesn't
|
# The macro is immediate, since all its parameters are untyped.
|
||||||
# resolve identifiers passed to it
|
# This means, it doesn't resolve identifiers passed to it.
|
||||||
|
|
||||||
var typeName, baseName: PNimrodNode
|
var typeName, baseName: NimNode
|
||||||
|
|
||||||
if head.kind == nnkIdent:
|
# flag if object should be exported
|
||||||
# `head` is expression `typeName`
|
var exported: bool
|
||||||
# echo head.treeRepr
|
|
||||||
# --------------------
|
|
||||||
# Ident !"Animal"
|
|
||||||
typeName = head
|
|
||||||
|
|
||||||
elif head.kind == nnkInfix and $head[0] == "of":
|
if head.kind == nnkInfix and head[0].ident == !"of":
|
||||||
# `head` is expression `typeName of baseClass`
|
# `head` is expression `typeName of baseClass`
|
||||||
# echo head.treeRepr
|
# echo head.treeRepr
|
||||||
# --------------------
|
# --------------------
|
||||||
|
|
@ -67,9 +63,57 @@ macro class*(head: expr, body: stmt): stmt {.immediate.} =
|
||||||
typeName = head[1]
|
typeName = head[1]
|
||||||
baseName = head[2]
|
baseName = head[2]
|
||||||
|
|
||||||
|
elif head.kind == nnkInfix and head[0].ident == !"*" and
|
||||||
|
head[2].kind == nnkPrefix and head[2][0].ident == !"of":
|
||||||
|
# `head` is expression `typeName* of baseClass`
|
||||||
|
# echo head.treeRepr
|
||||||
|
# --------------------
|
||||||
|
# Infix
|
||||||
|
# Ident !"*"
|
||||||
|
# Ident !"Animal"
|
||||||
|
# Prefix
|
||||||
|
# Ident !"of"
|
||||||
|
# Ident !"RootObj"
|
||||||
|
typeName = head[1]
|
||||||
|
baseName = head[2][1]
|
||||||
|
exported = true
|
||||||
|
|
||||||
else:
|
else:
|
||||||
quit "Invalid node: " & head.lispRepr
|
quit "Invalid node: " & head.lispRepr
|
||||||
|
|
||||||
|
# The following prints out the AST structure:
|
||||||
|
#
|
||||||
|
# import macros
|
||||||
|
# dumptree:
|
||||||
|
# type X = ref object of Y
|
||||||
|
# z: int
|
||||||
|
# --------------------
|
||||||
|
# StmtList
|
||||||
|
# TypeSection
|
||||||
|
# TypeDef
|
||||||
|
# Ident !"X"
|
||||||
|
# Empty
|
||||||
|
# RefTy
|
||||||
|
# ObjectTy
|
||||||
|
# Empty
|
||||||
|
# OfInherit
|
||||||
|
# Ident !"Y"
|
||||||
|
# RecList
|
||||||
|
# IdentDefs
|
||||||
|
# Ident !"z"
|
||||||
|
# Ident !"int"
|
||||||
|
# Empty
|
||||||
|
|
||||||
|
# create a type section in the result
|
||||||
|
result =
|
||||||
|
if exported:
|
||||||
|
# mark `typeName` with an asterisk
|
||||||
|
quote do:
|
||||||
|
type `typeName`* = ref object of `baseName`
|
||||||
|
else:
|
||||||
|
quote do:
|
||||||
|
type `typeName` = ref object of `baseName`
|
||||||
|
|
||||||
# echo treeRepr(body)
|
# echo treeRepr(body)
|
||||||
# --------------------
|
# --------------------
|
||||||
# StmtList
|
# StmtList
|
||||||
|
|
@ -105,22 +149,26 @@ macro class*(head: expr, body: stmt): stmt {.immediate.} =
|
||||||
# Ident !"this"
|
# Ident !"this"
|
||||||
# Ident !"age"
|
# Ident !"age"
|
||||||
|
|
||||||
# create a new stmtList for the result
|
|
||||||
result = newStmtList()
|
|
||||||
|
|
||||||
# var declarations will be turned into object fields
|
# var declarations will be turned into object fields
|
||||||
var recList = newNimNode(nnkRecList)
|
var recList = newNimNode(nnkRecList)
|
||||||
|
|
||||||
|
# expected name of constructor
|
||||||
|
let ctorName = newIdentNode("new" & $typeName)
|
||||||
|
|
||||||
# Iterate over the statements, adding `this: T`
|
# Iterate over the statements, adding `this: T`
|
||||||
# to the parameters of functions
|
# to the parameters of functions, unless the
|
||||||
|
# function is a constructor
|
||||||
for node in body.children:
|
for node in body.children:
|
||||||
case node.kind:
|
case node.kind:
|
||||||
|
|
||||||
of nnkMethodDef, nnkProcDef:
|
of nnkMethodDef, nnkProcDef:
|
||||||
# inject `this: T` into the arguments
|
# check if it is the ctor proc
|
||||||
let p = copyNimTree(node.params)
|
if node.name.kind != nnkAccQuoted and node.name.basename == ctorName:
|
||||||
p.insert(1, newIdentDefs(ident"this", typeName))
|
# specify the return type of the ctor proc
|
||||||
node.params = p
|
node.params[0] = typeName
|
||||||
|
else:
|
||||||
|
# inject `self: T` into the arguments
|
||||||
|
node.params.insert(1, newIdentDefs(ident("self"), typeName))
|
||||||
result.add(node)
|
result.add(node)
|
||||||
|
|
||||||
of nnkVarSection:
|
of nnkVarSection:
|
||||||
|
|
@ -131,56 +179,25 @@ macro class*(head: expr, body: stmt): stmt {.immediate.} =
|
||||||
else:
|
else:
|
||||||
result.add(node)
|
result.add(node)
|
||||||
|
|
||||||
# The following prints out the AST structure:
|
|
||||||
#
|
|
||||||
# import macros
|
|
||||||
# dumptree:
|
|
||||||
# type X = ref object of Y
|
|
||||||
# z: int
|
|
||||||
# --------------------
|
|
||||||
# TypeSection
|
|
||||||
# TypeDef
|
|
||||||
# Ident !"X"
|
|
||||||
# Empty
|
|
||||||
# RefTy
|
|
||||||
# ObjectTy
|
|
||||||
# Empty
|
|
||||||
# OfInherit
|
|
||||||
# Ident !"Y"
|
|
||||||
# RecList
|
|
||||||
# IdentDefs
|
|
||||||
# Ident !"z"
|
|
||||||
# Ident !"int"
|
|
||||||
# Empty
|
|
||||||
|
|
||||||
result.insert(0,
|
|
||||||
if baseName == nil:
|
|
||||||
quote do:
|
|
||||||
type `typeName` = ref object
|
|
||||||
else:
|
|
||||||
quote do:
|
|
||||||
type `typeName` = ref object of `baseName`
|
|
||||||
)
|
|
||||||
# Inspect the tree structure:
|
# Inspect the tree structure:
|
||||||
#
|
#
|
||||||
# echo result.treeRepr
|
# echo result.treeRepr
|
||||||
# --------------------
|
# --------------------
|
||||||
# StmtList
|
# StmtList
|
||||||
# StmtList
|
# TypeSection
|
||||||
# TypeSection
|
# TypeDef
|
||||||
# TypeDef
|
# Ident !"Animal"
|
||||||
# Ident !"Animal"
|
# Empty
|
||||||
# Empty
|
# RefTy
|
||||||
# RefTy
|
# ObjectTy
|
||||||
# ObjectTy
|
# Empty
|
||||||
# Empty
|
# OfInherit
|
||||||
# OfInherit
|
# Ident !"RootObj"
|
||||||
# Ident !"RootObj"
|
# Empty <= We want to replace this
|
||||||
# Empty <= We want to replace this
|
# MethodDef
|
||||||
# MethodDef
|
# ...
|
||||||
# ...
|
|
||||||
|
|
||||||
result[0][0][0][2][0][2] = recList
|
result[0][0][2][0][2] = recList
|
||||||
|
|
||||||
# Lets inspect the human-readable version of the output
|
# Lets inspect the human-readable version of the output
|
||||||
# echo repr(result)
|
# echo repr(result)
|
||||||
|
|
@ -190,26 +207,45 @@ macro class*(head: expr, body: stmt): stmt {.immediate.} =
|
||||||
# name: string
|
# name: string
|
||||||
# age: int
|
# age: int
|
||||||
#
|
#
|
||||||
# method vocalize(this: Animal): string =
|
# method vocalize(this: Animal): string {.base.} =
|
||||||
# "..."
|
# "..."
|
||||||
#
|
#
|
||||||
# method age_human_yrs(this: Animal): int =
|
# method age_human_yrs(this: Animal): int {.base.} =
|
||||||
# this.age
|
# this.age
|
||||||
|
# ...
|
||||||
|
#
|
||||||
|
# type
|
||||||
|
# Rabbit = ref object of Animal
|
||||||
|
#
|
||||||
|
# proc newRabbit(name: string; age: int): Rabbit =
|
||||||
|
# result = Rabbit(name: name, age: age)
|
||||||
|
#
|
||||||
|
# method vocalize(this: Rabbit): string =
|
||||||
|
# "meep"
|
||||||
|
|
||||||
# ---
|
# ---
|
||||||
|
|
||||||
class Animal of RootObj:
|
class Animal of RootObj:
|
||||||
var name: string
|
var name: string
|
||||||
var age: int
|
var age: int
|
||||||
method vocalize: string = "..."
|
method vocalize: string {.base.} = "..." # use `base` pragma to annonate base methods
|
||||||
method age_human_yrs: int = this.age # `this` is injected
|
method age_human_yrs: int {.base.} = this.age # `this` is injected
|
||||||
|
proc `$`: string = "animal:" & this.name & ":" & $this.age
|
||||||
|
|
||||||
class Dog of Animal:
|
class Dog of Animal:
|
||||||
method vocalize: string = "woof"
|
method vocalize: string = "woof"
|
||||||
method age_human_yrs: int = this.age * 7
|
method age_human_yrs: int = this.age * 7
|
||||||
|
proc `$`: string = "dog:" & this.name & ":" & $this.age
|
||||||
|
|
||||||
class Cat of Animal:
|
class Cat of Animal:
|
||||||
method vocalize: string = "meow"
|
method vocalize: string = "meow"
|
||||||
|
proc `$`: string = "cat:" & this.name & ":" & $this.age
|
||||||
|
|
||||||
|
class Rabbit of Animal:
|
||||||
|
proc newRabbit(name: string, age: int) = # the constructor doesn't need a return type
|
||||||
|
result = Rabbit(name: name, age: age)
|
||||||
|
method vocalize: string = "meep"
|
||||||
|
proc `$`: string = "rabbit:" & this.name & ":" & $this.age
|
||||||
|
|
||||||
# ---
|
# ---
|
||||||
|
|
||||||
|
|
@ -220,6 +256,11 @@ animals.add(Cat(name: "Mitten", age: 10))
|
||||||
for a in animals:
|
for a in animals:
|
||||||
echo a.vocalize()
|
echo a.vocalize()
|
||||||
echo a.age_human_yrs()
|
echo a.age_human_yrs()
|
||||||
|
|
||||||
|
let r = newRabbit("Fluffy", 3)
|
||||||
|
echo r.vocalize()
|
||||||
|
echo r.age_human_yrs()
|
||||||
|
echo r
|
||||||
```
|
```
|
||||||
``` console
|
``` console
|
||||||
$ nim c -r oopmacro.nim
|
$ nim c -r oopmacro.nim
|
||||||
|
|
@ -227,4 +268,7 @@ woof
|
||||||
70
|
70
|
||||||
meow
|
meow
|
||||||
10
|
10
|
||||||
|
meep
|
||||||
|
3
|
||||||
|
rabbit:Fluffy:3
|
||||||
```
|
```
|
||||||
|
|
@ -57,7 +57,7 @@ echo([[1, 2], [3, 4]]) # See varargs for
|
||||||
# how echo works
|
# how echo works
|
||||||
|
|
||||||
proc `^&*^@%`(a, b: string): string =
|
proc `^&*^@%`(a, b: string): string =
|
||||||
## An confusingly named useless operator
|
## A confusingly named useless operator
|
||||||
result = a[0] & b[high(b)]
|
result = a[0] & b[high(b)]
|
||||||
|
|
||||||
assert("foo" ^&*^@% "bar" == "fr")
|
assert("foo" ^&*^@% "bar" == "fr")
|
||||||
|
|
@ -78,7 +78,7 @@ proc `+`(a, b: string): string =
|
||||||
proc `*`[T](a: T, b: int): T =
|
proc `*`[T](a: T, b: int): T =
|
||||||
result = zero
|
result = zero
|
||||||
for i in 0..b:
|
for i in 0..b:
|
||||||
result = result + a
|
result = result + a # calls `+` from line 3
|
||||||
|
|
||||||
assert("a" * 10 == "aaaaaaaaaaa")
|
assert("a" * 10 == "aaaaaaaaaaa")
|
||||||
```
|
```
|
||||||
|
|
@ -20,7 +20,7 @@ $ nim c -r filterclosure.nim
|
||||||
@[64, 128, 256]
|
@[64, 128, 256]
|
||||||
```
|
```
|
||||||
|
|
||||||
Existing procedures can also be passed as functions, but only if they are annotated with the `{.procvar.}` pragma.
|
Existing procedures can also be passed as functions, but only if they are annotated with the `{.procvar.}` pragma. This is because there may be default parameters, which must be specially handled by the compiler.
|
||||||
|
|
||||||
``` nimrod
|
``` nimrod
|
||||||
proc greaterThan32(x: int): bool {.procvar.} = x > 32
|
proc greaterThan32(x: int): bool {.procvar.} = x > 32
|
||||||
|
|
@ -19,14 +19,14 @@ for i, v in a:
|
||||||
for i in 4..100:
|
for i in 4..100:
|
||||||
b.add(i * i)
|
b.add(i * i)
|
||||||
|
|
||||||
b.delete(0) # takes «O(n)» time
|
b.delete(0) # takes O(n) time
|
||||||
b = a[0] & b # Same as original b
|
b = a[0] & b # Same as original b
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
## Immutability
|
## Immutability
|
||||||
|
|
||||||
While sequences are dynamiclly allocated, they are still immutable.
|
Sequences are dynamiclly allocated (i.e. allocated on the heap, not the stack), but they are immutable unless marked as `var`. That means
|
||||||
|
|
||||||
``` nimrod
|
``` nimrod
|
||||||
let a = @[1, 2, 3]
|
let a = @[1, 2, 3]
|
||||||
|
|
@ -40,7 +40,16 @@ var b = @[1, 2, 3]
|
||||||
b.add(4)
|
b.add(4)
|
||||||
```
|
```
|
||||||
|
|
||||||
will work without any problems. If wanted, a seq can be passed to a method with the `var` or `ref` annotation to make it modifiable, so
|
will work without any problems. Sequences passed as "argument by value" are not modifiable. For example, the following will fail to compile.
|
||||||
|
|
||||||
|
``` nimrod
|
||||||
|
def do_something(mySeq: seq[int]) =
|
||||||
|
mySeq[0] = 2 # this is a compile-time error
|
||||||
|
var testSeq = [1, 2, 3]
|
||||||
|
do_something(testSeq)
|
||||||
|
```
|
||||||
|
|
||||||
|
`seq` arguments can be mutable if they are passed as "argument by reference", ie. the parameter is annotated with the `var` or `ref`:
|
||||||
|
|
||||||
``` nimrod
|
``` nimrod
|
||||||
proc foo(mySeq: var seq[int]) =
|
proc foo(mySeq: var seq[int]) =
|
||||||
|
|
@ -51,3 +60,15 @@ foo(thisSeq)
|
||||||
|
|
||||||
assert thisSeq[9] == 999
|
assert thisSeq[9] == 999
|
||||||
```
|
```
|
||||||
|
|
||||||
|
You can copy a sequence passed as "argument by value" and modify the copy:
|
||||||
|
|
||||||
|
``` nimrod
|
||||||
|
def do_something(mySeq: seq[int]) =
|
||||||
|
var varMySeq = mySeq # copy the seq
|
||||||
|
varMySeq[0] = 999
|
||||||
|
assert varMySeq[0] == 999
|
||||||
|
var testSeq = [1, 2, 3]
|
||||||
|
do_something(testSeq)
|
||||||
|
assert testSeq[0] == 1
|
||||||
|
```
|
||||||
|
|
@ -16,7 +16,7 @@ echo """
|
||||||
|
|
||||||
proc re(s: string): string = s
|
proc re(s: string): string = s
|
||||||
|
|
||||||
echo r" "" "
|
echo r".""."
|
||||||
echo re"\b[a-z]++\b"
|
echo re"\b[a-z]++\b"
|
||||||
```
|
```
|
||||||
``` console
|
``` console
|
||||||
|
|
@ -29,15 +29,21 @@ words words words ⚑
|
||||||
<body>
|
<body>
|
||||||
<body/>
|
<body/>
|
||||||
<html/>
|
<html/>
|
||||||
"
|
.".
|
||||||
\b[a-z]++\b
|
\b[a-z]++\b
|
||||||
```
|
```
|
||||||
|
|
||||||
There are several types of strings literals:
|
There are several types of string literals:
|
||||||
|
|
||||||
- Quoted Strings: Created by wrapping the body in triple quotes, they never interpret escape codes
|
- Quoted Strings: Created by wrapping the body in triple quotes, they never interpret escape codes
|
||||||
- Raw Strings: created by prefixing the string with an `r`. There are no escape sequences don't work, except for `"`, which can be escaped as `""`
|
- Raw Strings: created by prefixing the string with an `r`. They do not interpret escape sequences, except for `""`, which is interpreted as `"`. This means that `r"\b[a-z]\b"` is interpreted as `\b[a-z]\b` instead of failing to compile with a syntax error.
|
||||||
- Proc Strings: raw strings, but the method name that prefixes the string is called
|
- Proc Strings: raw strings, but the method name that prefixes the string is called, so that `foo"12\"` -> `foo(r"12\")`.
|
||||||
|
|
||||||
|
Strings are null-terminated, so that `cstring("foo")` requires zero copying. However, you should be careful that the lifetime of the cstring does not exceed the lifetime of the string it is based upon.
|
||||||
|
|
||||||
|
Strings can also almost be thought of as `seq[char]` with respect to assignment semantics. See [seqs][]
|
||||||
|
|
||||||
|
[seqs]: /seqs/#immutability
|
||||||
|
|
||||||
## A note about unicode
|
## A note about unicode
|
||||||
Unicode symbols are allowed in strings, but are not treated in any special way, so if you want count glyphs or uppercase unicode symbols, you must use the `unicode` module.
|
Unicode symbols are allowed in strings, but are not treated in any special way, so if you want count glyphs or uppercase unicode symbols, you must use the `unicode` module.
|
||||||
|
|
@ -1,5 +1,3 @@
|
||||||
## Pages
|
|
||||||
|
|
||||||
* [Getting Started](/getting_started/)
|
* [Getting Started](/getting_started/)
|
||||||
* [Hello World](/hello_world/)
|
* [Hello World](/hello_world/)
|
||||||
* [Variables](/variables/)
|
* [Variables](/variables/)
|
||||||
|
|
@ -24,5 +22,4 @@
|
||||||
* [Object Oriented Programming](/oop/)
|
* [Object Oriented Programming](/oop/)
|
||||||
* [OOP Macro](/oop_macro/)
|
* [OOP Macro](/oop_macro/)
|
||||||
|
|
||||||
<!-- * OpenGL * [Triangle](/opengl/triangle/)-->
|
|
||||||
{: #toc-list}
|
{: #toc-list}
|
||||||
|
|
@ -26,7 +26,7 @@ let joe = Animal(name : "Joe",
|
||||||
species : "H. sapiens",
|
species : "H. sapiens",
|
||||||
age : 23)
|
age : 23)
|
||||||
|
|
||||||
assert not carl.dead
|
assert(not carl.dead)
|
||||||
for i in 0..10:
|
for i in 0..10:
|
||||||
carl.sleep()
|
carl.sleep()
|
||||||
assert carl.dead
|
assert carl.dead
|
||||||
|
|
@ -54,9 +54,9 @@ You might ask whether there is a more concise way of initializing reference typ
|
||||||
|
|
||||||
``` nimrod
|
``` nimrod
|
||||||
type
|
type
|
||||||
PAnimal* = ref Animal
|
AnimalRef* = ref Animal
|
||||||
|
|
||||||
let spot = PAnimal(name: "Spot",
|
let spot = AnimalRef(name: "Spot",
|
||||||
species: "C. lupus",
|
species: "C. lupus",
|
||||||
age: 1)
|
age: 1)
|
||||||
```
|
```
|
||||||
Binary file not shown.
|
|
@ -1,14 +0,0 @@
|
||||||
<?xml version="1.0" standalone="no"?>
|
|
||||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
|
||||||
<svg xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<metadata>Copyright (C) 2014 by original authors @ fontello.com</metadata>
|
|
||||||
<defs>
|
|
||||||
<font id="fontello" horiz-adv-x="1000" >
|
|
||||||
<font-face font-family="fontello" font-weight="400" font-stretch="normal" units-per-em="1000" ascent="850" descent="-150" />
|
|
||||||
<missing-glyph horiz-adv-x="1000" />
|
|
||||||
<glyph glyph-name="check" unicode="" d="m932 534q0-22-15-38l-404-404-76-76q-16-15-38-15t-38 15l-76 76-202 202q-15 16-15 38t15 38l76 76q16 16 38 16t38-16l164-165 366 367q16 16 38 16t38-16l76-76q15-16 15-38z" horiz-adv-x="1000" />
|
|
||||||
<glyph glyph-name="star" unicode="" d="m634 290l171 165-235 35-106 213-105-213-236-35 171-165-41-235 211 111 211-111z m295 199q0-12-15-27l-203-197 48-279q1-4 1-12 0-28-23-28-10 0-22 7l-251 132-250-132q-13-7-23-7-11 0-17 9t-6 19q0 4 1 12l48 279-203 197q-14 15-14 27 0 21 31 26l280 40 126 254q11 23 27 23t28-23l125-254 280-40q32-5 32-26z" horiz-adv-x="928.6" />
|
|
||||||
<glyph glyph-name="fork" unicode="" d="m161 29q0 22-16 38t-38 15-38-15-15-38 15-38 38-16 38 16 16 38z m0 642q0 23-16 38t-38 16-38-16-15-38 15-38 38-15 38 15 16 38z m357-71q0 22-16 38t-38 16-38-16-15-38 15-38 38-16 38 16 16 38z m53 0q0-29-14-54t-39-39q-1-160-126-231-38-21-114-45-71-22-94-39t-23-56v-15q24-14 39-39t14-53q0-45-31-76t-76-32-76 32-31 76q0 29 15 53t39 39v458q-25 14-39 39t-15 53q0 45 31 76t76 32 76-32 31-76q0-29-14-53t-39-39v-278q30 15 86 32 30 10 49 17t39 17 33 22 22 29 16 38 5 51q-25 14-39 39t-15 54q0 45 31 76t76 31 76-31 31-76z" horiz-adv-x="571.4" />
|
|
||||||
</font>
|
|
||||||
</defs>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 1.6 KiB |
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
Before Width: | Height: | Size: 105 KiB |
|
|
@ -1,132 +0,0 @@
|
||||||
---
|
|
||||||
title: OpenGL - Triangle
|
|
||||||
---
|
|
||||||
# OpenGL: Triangle
|
|
||||||
|
|
||||||
The following code depends on the ``opengl`` and ``nim-glfw`` packages which
|
|
||||||
can be installed via babel by executing ``babel install opengl@#head nim-glfw@#head``.
|
|
||||||
You will need the GLFW DLL in order to run this on Windows.
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
One thing to keep in mind when writing OpenGL code in Nim is that ``float``
|
|
||||||
is actually ``float64``. But vertices must be ``float32`` so you must explicitly
|
|
||||||
specify that by casting or using ``'f32`` as is done in the example.
|
|
||||||
|
|
||||||
```nimrod
|
|
||||||
import os, glfw/glfw, opengl, times, math
|
|
||||||
|
|
||||||
proc assertShader(shader: GLuint) =
|
|
||||||
var status: GLint
|
|
||||||
glGetShaderiv(shader, GL_COMPILE_STATUS, addr status)
|
|
||||||
if status != GL_TRUE:
|
|
||||||
var buff: array[512, char]
|
|
||||||
glGetShaderInfoLog(shader, 512, nil, buff)
|
|
||||||
echo(buff)
|
|
||||||
assert false
|
|
||||||
|
|
||||||
const
|
|
||||||
vertexSource = """
|
|
||||||
#version 150
|
|
||||||
|
|
||||||
in vec2 position;
|
|
||||||
in vec3 color;
|
|
||||||
|
|
||||||
out vec3 Color;
|
|
||||||
|
|
||||||
void main()
|
|
||||||
{
|
|
||||||
Color = color;
|
|
||||||
gl_Position = vec4(position, 0.0, 1.0);
|
|
||||||
}
|
|
||||||
"""
|
|
||||||
fragmentSource = """
|
|
||||||
#version 150
|
|
||||||
|
|
||||||
in vec3 Color;
|
|
||||||
|
|
||||||
out vec4 outColor;
|
|
||||||
|
|
||||||
void main()
|
|
||||||
{
|
|
||||||
outColor = vec4(Color, 1.0);
|
|
||||||
}
|
|
||||||
"""
|
|
||||||
|
|
||||||
|
|
||||||
proc setup(shaderProgram: var TGLUint) =
|
|
||||||
var vertices = [
|
|
||||||
0.0'f32, 0.5, 1, 0, 0,
|
|
||||||
0.5, -0.5, 0, 1, 0,
|
|
||||||
-0.5, -0.5, 0, 0, 1
|
|
||||||
]
|
|
||||||
echo(vertices.repr)
|
|
||||||
var vertexBuffer: GLuint
|
|
||||||
glGenBuffers(1, addr vertexBuffer)
|
|
||||||
echo("Verter Buff: ", vertexBuffer)
|
|
||||||
|
|
||||||
var vertexArray: GLuint
|
|
||||||
glGenVertexArrays(1, addr vertexArray)
|
|
||||||
glBindVertexArray(vertexArray)
|
|
||||||
|
|
||||||
|
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer)
|
|
||||||
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices).int32, addr vertices,
|
|
||||||
GL_STATIC_DRAW)
|
|
||||||
|
|
||||||
var vertexShader = glCreateShader(GL_VERTEX_SHADER)
|
|
||||||
var vertexSrcArray = [vertexSource.cstring]
|
|
||||||
glShaderSource(vertexShader, 1, cast[cstringArray](addr vertexSrcArray), nil)
|
|
||||||
glCompileShader(vertexShader)
|
|
||||||
assertShader(vertexShader)
|
|
||||||
|
|
||||||
var fragmentShader = glCreateShader(GL_FRAGMENT_SHADER)
|
|
||||||
var fragmentSrcArray = [fragmentSource.cstring]
|
|
||||||
glShaderSource(fragmentShader, 1, cast[cstringArray](addr fragmentSrcArray),
|
|
||||||
nil)
|
|
||||||
glCompileShader(fragmentShader)
|
|
||||||
assertShader(fragmentShader)
|
|
||||||
|
|
||||||
shaderProgram = glCreateProgram()
|
|
||||||
glAttachShader(shaderProgram, vertexShader)
|
|
||||||
glAttachShader(shaderProgram, fragmentShader)
|
|
||||||
|
|
||||||
# Apparently this is not necessary according to http://open.gl
|
|
||||||
glBindFragDataLocation(shaderProgram, 0, "outColor")
|
|
||||||
|
|
||||||
glLinkProgram(shaderProgram)
|
|
||||||
glUseProgram(shaderProgram)
|
|
||||||
|
|
||||||
# Vertex data <-> attributes
|
|
||||||
var posAttrib = glGetAttribLocation(shaderProgram, "position").gluint
|
|
||||||
glEnableVertexAttribArray(posAttrib)
|
|
||||||
glVertexAttribPointer(posAttrib, 2, cGL_FLOAT, false,
|
|
||||||
5*sizeof(GLFloat).int32, nil)
|
|
||||||
|
|
||||||
var colAttrib = glGetAttribLocation(shaderProgram, "color").gluint
|
|
||||||
glEnableVertexAttribArray(colAttrib)
|
|
||||||
glVertexAttribPointer(colAttrib, 3, cGL_FLOAT, false,
|
|
||||||
5*sizeof(GLFloat).int32,
|
|
||||||
cast[pointer](2*sizeof(GLFloat)))
|
|
||||||
|
|
||||||
when isMainModule:
|
|
||||||
glfw.init()
|
|
||||||
var win = newWin()
|
|
||||||
win.makeContextCurrent()
|
|
||||||
|
|
||||||
loadExtensions()
|
|
||||||
|
|
||||||
var shaderProgram: TGLuint
|
|
||||||
setup(shaderProgram)
|
|
||||||
|
|
||||||
while not win.shouldClose:
|
|
||||||
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT)
|
|
||||||
|
|
||||||
glDrawArrays(GL_TRIANGLES, 0, 3)
|
|
||||||
win.swapBufs()
|
|
||||||
|
|
||||||
pollEvents()
|
|
||||||
|
|
||||||
win.destroy()
|
|
||||||
glfw.terminate()
|
|
||||||
```
|
|
||||||
|
|
@ -1,72 +0,0 @@
|
||||||
/* pygments-css colorful */
|
|
||||||
code[class^='language-'] .hll:not([id^='MathJax']) { background-color: #ffffcc }
|
|
||||||
code[class^='language-'] .c:not([id^='MathJax']) { color: #808080 } /* Comment */
|
|
||||||
code[class^='language-'] .err:not([id^='MathJax']) { color: #F00000; background-color: #F0A0A0 } /* Error */
|
|
||||||
code[class^='language-'] .k:not([id^='MathJax']) { color: #008000; font-weight: bold } /* Keyword */
|
|
||||||
code[class^='language-'] .o:not([id^='MathJax']) { color: #303030 } /* Operator */
|
|
||||||
code[class^='language-'] .cm:not([id^='MathJax']) { color: #808080 } /* Comment.Multiline */
|
|
||||||
code[class^='language-'] .cp:not([id^='MathJax']) { color: #507090 } /* Comment.Preproc */
|
|
||||||
code[class^='language-'] .c1:not([id^='MathJax']) { color: #808080 } /* Comment.Single */
|
|
||||||
code[class^='language-'] .cs:not([id^='MathJax']) { color: #cc0000; font-weight: bold } /* Comment.Special */
|
|
||||||
code[class^='language-'] .gd:not([id^='MathJax']) { color: #A00000 } /* Generic.Deleted */
|
|
||||||
code[class^='language-'] .ge:not([id^='MathJax']) { font-style: italic } /* Generic.Emph */
|
|
||||||
code[class^='language-'] .gr:not([id^='MathJax']) { color: #FF0000 } /* Generic.Error */
|
|
||||||
code[class^='language-'] .gh:not([id^='MathJax']) { color: #000080; font-weight: bold } /* Generic.Heading */
|
|
||||||
code[class^='language-'] .gi:not([id^='MathJax']) { color: #00A000 } /* Generic.Inserted */
|
|
||||||
code[class^='language-'] .go:not([id^='MathJax']) { color: #808080 } /* Generic.Output */
|
|
||||||
code[class^='language-'] .gp:not([id^='MathJax']) {
|
|
||||||
color: #c65d09;
|
|
||||||
font-weight: bold;
|
|
||||||
/* NOTE: Hacks to allow copy-paste */
|
|
||||||
-webkit-touch-callout: none;
|
|
||||||
-webkit-user-select: none;
|
|
||||||
-khtml-user-select: none;
|
|
||||||
-moz-user-select: none;
|
|
||||||
-ms-user-select: none;
|
|
||||||
user-select: none;
|
|
||||||
} /* Generic.Prompt */
|
|
||||||
code[class^='language-'] .gs:not([id^='MathJax']) { font-weight: bold } /* Generic.Strong */
|
|
||||||
code[class^='language-'] .gu:not([id^='MathJax']) { color: #800080; font-weight: bold } /* Generic.Subheading */
|
|
||||||
code[class^='language-'] .gt:not([id^='MathJax']) { color: #0040D0 } /* Generic.Traceback */
|
|
||||||
code[class^='language-'] .kc:not([id^='MathJax']) { color: #008000; font-weight: bold } /* Keyword.Constant */
|
|
||||||
code[class^='language-'] .kd:not([id^='MathJax']) { color: #008000; font-weight: bold } /* Keyword.Declaration */
|
|
||||||
code[class^='language-'] .kn:not([id^='MathJax']) { color: #008000; font-weight: bold } /* Keyword.Namespace */
|
|
||||||
code[class^='language-'] .kp:not([id^='MathJax']) { color: #003080; font-weight: bold } /* Keyword.Pseudo */
|
|
||||||
code[class^='language-'] .kr:not([id^='MathJax']) { color: #008000; font-weight: bold } /* Keyword.Reserved */
|
|
||||||
code[class^='language-'] .kt:not([id^='MathJax']) { color: #303090; font-weight: bold } /* Keyword.Type */
|
|
||||||
code[class^='language-'] .m:not([id^='MathJax']) { color: #6000E0; font-weight: bold } /* Literal.Number */
|
|
||||||
code[class^='language-'] .s:not([id^='MathJax']) { background-color: #fff0f0 } /* Literal.String */
|
|
||||||
code[class^='language-'] .na:not([id^='MathJax']) { color: #0000C0 } /* Name.Attribute */
|
|
||||||
code[class^='language-'] .nb:not([id^='MathJax']) { color: #007020 } /* Name.Builtin */
|
|
||||||
code[class^='language-'] .nc:not([id^='MathJax']) { color: #B00060; font-weight: bold } /* Name.Class */
|
|
||||||
code[class^='language-'] .no:not([id^='MathJax']) { color: #003060; font-weight: bold } /* Name.Constant */
|
|
||||||
code[class^='language-'] .nd:not([id^='MathJax']) { color: #505050; font-weight: bold } /* Name.Decorator */
|
|
||||||
code[class^='language-'] .ni:not([id^='MathJax']) { color: #800000; font-weight: bold } /* Name.Entity */
|
|
||||||
code[class^='language-'] .ne:not([id^='MathJax']) { color: #F00000; font-weight: bold } /* Name.Exception */
|
|
||||||
code[class^='language-'] .nf:not([id^='MathJax']) { color: #0060B0; font-weight: bold } /* Name.Function */
|
|
||||||
code[class^='language-'] .nl:not([id^='MathJax']) { color: #907000; font-weight: bold } /* Name.Label */
|
|
||||||
code[class^='language-'] .nn:not([id^='MathJax']) { color: #0e84b5; font-weight: bold } /* Name.Namespace */
|
|
||||||
code[class^='language-'] .nt:not([id^='MathJax']) { color: #007000 } /* Name.Tag */
|
|
||||||
code[class^='language-'] .nv:not([id^='MathJax']) { color: #906030 } /* Name.Variable */
|
|
||||||
code[class^='language-'] .ow:not([id^='MathJax']) { color: #000000; font-weight: bold } /* Operator.Word */
|
|
||||||
code[class^='language-'] .w:not([id^='MathJax']) { color: #bbbbbb } /* Text.Whitespace */
|
|
||||||
code[class^='language-'] .mf:not([id^='MathJax']) { color: #6000E0; font-weight: bold } /* Literal.Number.Float */
|
|
||||||
code[class^='language-'] .mh:not([id^='MathJax']) { color: #005080; font-weight: bold } /* Literal.Number.Hex */
|
|
||||||
code[class^='language-'] .mi:not([id^='MathJax']) { color: #0000D0; font-weight: bold } /* Literal.Number.Integer */
|
|
||||||
code[class^='language-'] .mo:not([id^='MathJax']) { color: #4000E0; font-weight: bold } /* Literal.Number.Oct */
|
|
||||||
code[class^='language-'] .sb:not([id^='MathJax']) { background-color: #fff0f0 } /* Literal.String.Backtick */
|
|
||||||
code[class^='language-'] .sc:not([id^='MathJax']) { color: #0040D0 } /* Literal.String.Char */
|
|
||||||
code[class^='language-'] .sd:not([id^='MathJax']) { color: #D04020 } /* Literal.String.Doc */
|
|
||||||
code[class^='language-'] .s2:not([id^='MathJax']) { background-color: #fff0f0 } /* Literal.String.Double */
|
|
||||||
code[class^='language-'] .se:not([id^='MathJax']) { color: #606060; font-weight: bold; background-color: #fff0f0 } /* Literal.String.Escape */
|
|
||||||
code[class^='language-'] .sh:not([id^='MathJax']) { background-color: #fff0f0 } /* Literal.String.Heredoc */
|
|
||||||
code[class^='language-'] .si:not([id^='MathJax']) { background-color: #e0e0e0 } /* Literal.String.Interpol */
|
|
||||||
code[class^='language-'] .sx:not([id^='MathJax']) { color: #D02000; background-color: #fff0f0 } /* Literal.String.Other */
|
|
||||||
code[class^='language-'] .sr:not([id^='MathJax']) { color: #000000; background-color: #fff0ff } /* Literal.String.Regex */
|
|
||||||
code[class^='language-'] .s1:not([id^='MathJax']) { background-color: #fff0f0 } /* Literal.String.Single */
|
|
||||||
code[class^='language-'] .ss:not([id^='MathJax']) { color: #A06000 } /* Literal.String.Symbol */
|
|
||||||
code[class^='language-'] .bp:not([id^='MathJax']) { color: #007020 } /* Name.Builtin.Pseudo */
|
|
||||||
code[class^='language-'] .vc:not([id^='MathJax']) { color: #306090 } /* Name.Variable.Class */
|
|
||||||
code[class^='language-'] .vg:not([id^='MathJax']) { color: #d07000; font-weight: bold } /* Name.Variable.Global */
|
|
||||||
code[class^='language-'] .vi:not([id^='MathJax']) { color: #3030B0 } /* Name.Variable.Instance */
|
|
||||||
code[class^='language-'] .il:not([id^='MathJax']) { color: #0000D0; font-weight: bold } /* Literal.Number.Integer.Long */
|
|
||||||
|
|
@ -1,8 +0,0 @@
|
||||||
#main code, code * { color: #675D69; }
|
|
||||||
code[class^='language-'] .k:not([id^='MathJax']) { color: #143A77; }
|
|
||||||
code[class^='language-'] .kp:not([id^='MathJax']) { color: #8C5DC7; }
|
|
||||||
code[class^='language-'] .kd:not([id^='MathJax']) { color: #8C5DC7; }
|
|
||||||
code[class^='language-'] .mi:not([id^='MathJax']) { color: #8C5DC7; }
|
|
||||||
code[class^='language-'] .s:not([id^='MathJax']) { color: #0060B0; }
|
|
||||||
code[class^='language-'] .c:not([id^='MathJax']) { color: #91B9A3; }
|
|
||||||
code[class^='language-'] .o:not([id^='MathJax']) { color: #009DE7; }
|
|
||||||
30
content/stylesheets/fontello.css
vendored
30
content/stylesheets/fontello.css
vendored
|
|
@ -1,30 +0,0 @@
|
||||||
@font-face {
|
|
||||||
font-family: 'fontello';
|
|
||||||
src: url('/fonts/fontelloe.eot?23005170');
|
|
||||||
src: url('/fonts/fontelloe.eot?23005170#iefix') format('embedded-opentype'),
|
|
||||||
url('/fonts/fontellow.woff?23005170') format('woff'),
|
|
||||||
url('/fonts/fontellot.ttf?23005170') format('truetype'),
|
|
||||||
url('/fonts/fontellos.svg?23005170#fontello') format('svg');
|
|
||||||
font-weight: normal;
|
|
||||||
font-style: normal;
|
|
||||||
}
|
|
||||||
|
|
||||||
[class^="icon-"]:before, [class*=" icon-"]:before {
|
|
||||||
font-family: "fontello";
|
|
||||||
font-style: normal;
|
|
||||||
font-weight: normal;
|
|
||||||
speak: none;
|
|
||||||
|
|
||||||
display: inline-block;
|
|
||||||
text-decoration: inherit;
|
|
||||||
width: 1em;
|
|
||||||
margin-right: .2em;
|
|
||||||
text-align: center;
|
|
||||||
|
|
||||||
font-variant: normal;
|
|
||||||
text-transform: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.icon-check:before { content: '\e800'; } /* '' */
|
|
||||||
.icon-star:before { content: '\e801'; } /* '' */
|
|
||||||
.icon-fork:before { content: '\e802'; } /* '' */
|
|
||||||
|
|
@ -1,192 +0,0 @@
|
||||||
* {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
|
|
||||||
font-family: Palatino, serif;
|
|
||||||
box-sizing: border-box;
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
|
||||||
background: #F5F7F6;
|
|
||||||
color: black;
|
|
||||||
line-height: 20px;
|
|
||||||
text-rendering: optimizelegibility;
|
|
||||||
}
|
|
||||||
|
|
||||||
a {
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
a:link, a:visited{
|
|
||||||
color: #B45D47;
|
|
||||||
}
|
|
||||||
|
|
||||||
a:hover {
|
|
||||||
color: #FE3B3B;
|
|
||||||
}
|
|
||||||
|
|
||||||
#main {
|
|
||||||
position: absolute;
|
|
||||||
|
|
||||||
left: 255px;
|
|
||||||
|
|
||||||
max-width: 600px;
|
|
||||||
|
|
||||||
margin-bottom: 50px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#main #gh-buttons {
|
|
||||||
float: right;
|
|
||||||
margin-bottom: 22px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#main #starcount {
|
|
||||||
line-height: 20px;
|
|
||||||
font-size: 15px;
|
|
||||||
text-align: center;
|
|
||||||
color: #000;
|
|
||||||
|
|
||||||
position: absolute;
|
|
||||||
display: block;
|
|
||||||
float: right;
|
|
||||||
right: 5px;
|
|
||||||
width: 3em;
|
|
||||||
background: #FFF;
|
|
||||||
border: 1px solid #CCC;
|
|
||||||
border-radius: 3px;
|
|
||||||
|
|
||||||
height: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#main hr {
|
|
||||||
background: #CCC;
|
|
||||||
border: none;
|
|
||||||
margin: 1em;
|
|
||||||
margin-bottom: 1.3em;
|
|
||||||
height: 1px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#main h1 {
|
|
||||||
font-size: 40px;
|
|
||||||
font-weight: normal;
|
|
||||||
|
|
||||||
line-height: 40px;
|
|
||||||
|
|
||||||
letter-spacing: -1px;
|
|
||||||
margin-bottom: 0.75em;
|
|
||||||
}
|
|
||||||
|
|
||||||
#main h2 {
|
|
||||||
margin-top: 1em;
|
|
||||||
}
|
|
||||||
|
|
||||||
#main p {
|
|
||||||
margin: 20px 0px;
|
|
||||||
margin-right: 1em;
|
|
||||||
line-height: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#main ul, #main ol {
|
|
||||||
margin: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#main ul li {
|
|
||||||
list-style-type: square;
|
|
||||||
}
|
|
||||||
|
|
||||||
#main table, th, td {
|
|
||||||
border-collapse: collapse;
|
|
||||||
border: 1px solid #CCC;
|
|
||||||
background-color: #FFF;
|
|
||||||
padding: 3px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#main table {
|
|
||||||
box-shadow: 1px 3px 12px #BBB;
|
|
||||||
margin: 20px 10px 20px 0px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#main code, code * {
|
|
||||||
font-family: Monaco, Menlo, Consolas, "Courier New", monospace;
|
|
||||||
}
|
|
||||||
|
|
||||||
#main code {
|
|
||||||
background: #FFFFFF;
|
|
||||||
padding: 0px 3px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#main pre code { /* Block Code */
|
|
||||||
display: block;
|
|
||||||
word-wrap: break-word;
|
|
||||||
overflow: auto;
|
|
||||||
|
|
||||||
white-space: pre-wrap; /* css-3 */
|
|
||||||
white-space: -moz-pre-wrap; /* Mozilla, since 1999 */
|
|
||||||
white-space: -pre-wrap; /* Opera 4-6 */
|
|
||||||
white-space: -o-pre-wrap; /* Opera 7 */
|
|
||||||
word-wrap: break-word; /* Internet Explorer 5.5+ */
|
|
||||||
|
|
||||||
border-radius: 3px;
|
|
||||||
background:#FFF;
|
|
||||||
box-shadow: 1px 3px 12px #BBB;
|
|
||||||
padding: 10px 15px;
|
|
||||||
margin: 5px 10px 10px 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#main span.line-numbers {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
#sidebar {
|
|
||||||
float: left;
|
|
||||||
margin-top: 20px;
|
|
||||||
margin-left: 20px;
|
|
||||||
width: 211px;
|
|
||||||
|
|
||||||
padding: 20px;
|
|
||||||
padding-left: 30px;
|
|
||||||
|
|
||||||
border-right: 1px solid #ccc;
|
|
||||||
|
|
||||||
font-size: 90%;
|
|
||||||
line-height: 20px;
|
|
||||||
box-sizing: border-box;
|
|
||||||
}
|
|
||||||
|
|
||||||
#sidebar h2 {
|
|
||||||
text-transform: uppercase;
|
|
||||||
font-size: 16px;
|
|
||||||
color: #470000;
|
|
||||||
letter-spacing: 1px;
|
|
||||||
line-height: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#sidebar ul {
|
|
||||||
position: relative;
|
|
||||||
left: 20px;
|
|
||||||
list-style: decimal-leading-zero;
|
|
||||||
list-style-position: outside;
|
|
||||||
}
|
|
||||||
|
|
||||||
#sidebar ul li ul {
|
|
||||||
width: 100px
|
|
||||||
}
|
|
||||||
|
|
||||||
#sidebar #toc-list {
|
|
||||||
left: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#sidebar a.visited:before { /* selected with JS */
|
|
||||||
content: "";
|
|
||||||
font-family: "fontello";
|
|
||||||
position: absolute;
|
|
||||||
left: -43px;
|
|
||||||
color: #EEE;
|
|
||||||
text-shadow: -1px 0 #2B2B2B, 0 1px #2B2B2B, 1px 0 #2B2B2B, 0 -1px #2B2B2B
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Chrome */
|
|
||||||
@media screen and (-webkit-min-device-pixel-ratio:0) {
|
|
||||||
#sidebar ul { text-indent: -5px; }
|
|
||||||
#sidebar #toc-list { left: 25px; }
|
|
||||||
}
|
|
||||||
|
|
@ -1,71 +1,55 @@
|
||||||
<!DOCTYPE HTML>
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
|
||||||
<html lang="en">
|
<html lang="en-US">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<title>Nim by Example - <%= @item[:title] %></title>
|
|
||||||
<link rel="stylesheet" type="text/css" href="http://necolas.github.io/normalize.css/3.0.1/normalize.css">
|
|
||||||
<link rel="stylesheet" href="<%= @items['/stylesheets/main/'].path %>">
|
|
||||||
<link rel="stylesheet" href="<%= @items['/stylesheets/colorful/'].path %>" title="colorful">
|
|
||||||
<link rel="stylesheet" href="<%= @items['/stylesheets/fontello/'].path %>">
|
|
||||||
|
|
||||||
|
<% if @config[:debug] %>
|
||||||
<script type="text/x-mathjax-config">
|
<% for file in @config[:stylesheets] %>
|
||||||
MathJax.Hub.Config({tex2jax: {inlineMath: [['«', '»']]}});
|
<link rel="stylesheet" type="text/css" href="/assets/css/<%= File.basename(file, ".*") %>.css">
|
||||||
MathJax.Hub.config.tex2jax.skipTags = ["script", "noscript", "style", "textarea", "annotation", "annotation-xml"];
|
<% end %>
|
||||||
</script>
|
<% for file in @config[:scripts] %>
|
||||||
<script type="text/javascript" src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_HTML" async></script>
|
<script async src="/assets/js/<%= file %>"></script>
|
||||||
|
<% end %>
|
||||||
|
<% else %>
|
||||||
|
<style>
|
||||||
|
<%= @items["/assets/css/all/"].compiled_content() %>
|
||||||
|
</style>
|
||||||
|
<script async src="/assets/js/all.js"></script>
|
||||||
|
<% end %>
|
||||||
<script>
|
<script>
|
||||||
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
||||||
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
|
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
|
||||||
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
|
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
|
||||||
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
|
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
|
||||||
ga('create', 'UA-58002512-1', 'auto');
|
ga('create', 'UA-58002512-1', 'auto');
|
||||||
ga('require', 'displayfeatures');
|
|
||||||
ga('send', 'pageview');
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<title>Nim by Example - <%= @item[:title] %></title>
|
||||||
|
|
||||||
<meta name="generator" content="nanoc <%= Nanoc::VERSION %>">
|
<meta name="generator" content="nanoc <%= Nanoc::VERSION %>">
|
||||||
<meta http-equiv="Default-Style" content="colorful">
|
<meta http-equiv="Default-Style" content="colorful">
|
||||||
|
<meta name=viewport content="width=device-width, initial-scale=1">
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|
||||||
<div id="sidebar">
|
<div id="sidebar">
|
||||||
<%= @items["/toc/"].compiled_content(:snapshot => :last) %>
|
<div class="abs-hamburger"><div class="nav-toggle" onclick="javascript:sidebarClick();"><span></span></div></div>
|
||||||
|
<nav>
|
||||||
|
<%= @items["/content/toc/"].compiled_content(snapshot: :last) %>
|
||||||
|
</nav>
|
||||||
</div>
|
</div>
|
||||||
<div id="main">
|
|
||||||
<h1 id="gh-buttons"><a class="icon-fork" href="https://github.com/flaviut/nim-by-example/"></a> <a class="icon-star" href="https://github.com/flaviut/nim-by-example/stargazers" /><div id="starcount"></div></a></h1>
|
<article>
|
||||||
<script>
|
|
||||||
function setVisibleTags(){
|
|
||||||
var tocLinks = document.querySelectorAll("#sidebar a:link, a:visited");
|
|
||||||
for(var i = 0; i < tocLinks.length; i++){
|
|
||||||
if(localStorage.getItem(tocLinks[i].getAttribute("href")) != null){
|
|
||||||
tocLinks[i].classList.add("visited");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
var starcount_elem = document.getElementById("starcount");
|
|
||||||
function updateStarCounter(){
|
|
||||||
if(localStorage.getItem("_watchers") != null){
|
|
||||||
starcount_elem.innerHTML = localStorage.getItem("_watchers");
|
|
||||||
}
|
|
||||||
var request = new XMLHttpRequest();
|
|
||||||
// horrible hack... but stargazer output is capped at 30 per request.
|
|
||||||
request.open("GET", "https://api.github.com/search/repositories?q=nim-by-example", true);
|
|
||||||
request.onload = function (e) {
|
|
||||||
var searchResults = JSON.parse(request.responseText);
|
|
||||||
var starcount = searchResults.items[0].stargazers_count;
|
|
||||||
starcount_elem.innerHTML = starcount;
|
|
||||||
localStorage.setItem("_watchers", starcount)
|
|
||||||
};
|
|
||||||
request.onerror = function (e) {
|
|
||||||
console.error(request.statusText);
|
|
||||||
};
|
|
||||||
request.send(null);
|
|
||||||
}
|
|
||||||
updateStarCounter()
|
|
||||||
localStorage.setItem(window.location.pathname, true);
|
|
||||||
setVisibleTags()
|
|
||||||
</script>
|
|
||||||
<%= yield %>
|
<%= yield %>
|
||||||
|
</article>
|
||||||
|
|
||||||
|
<div id=nextprev>
|
||||||
|
<a id=arrow-prev class="text-icon disabled" href="https://please-enable-js/">↽</a>
|
||||||
|
<a id=arrow-next class="text-icon disabled" href="https://please-enable-js/">⇁</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<footer>
|
||||||
|
<%= @items["/content/footer/"].compiled_content(snapshot: :last) %>
|
||||||
|
</footer>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
||||||
19
lib/helpers.rb
Normal file
19
lib/helpers.rb
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
def all_js(files)
|
||||||
|
js_arr = []
|
||||||
|
for file in files
|
||||||
|
item = @items.find{|i| i.identifier == "/assets/js/#{file}/"}
|
||||||
|
puts "File #{file} doesn't exist!" unless item
|
||||||
|
js_arr << item.compiled_content
|
||||||
|
end
|
||||||
|
js_arr.join("\n")
|
||||||
|
end
|
||||||
|
|
||||||
|
def all_css(files)
|
||||||
|
css_arr = []
|
||||||
|
for file in files
|
||||||
|
item = @items.find{|i| i.identifier == "/assets/css/#{file}/"}
|
||||||
|
puts "File #{file} doesn't exist!" unless item
|
||||||
|
css_arr << item.compiled_content
|
||||||
|
end
|
||||||
|
css_arr.join("\n")
|
||||||
|
end
|
||||||
16
nanoc.yaml
16
nanoc.yaml
|
|
@ -29,6 +29,8 @@ prune:
|
||||||
# .git, .svn etc.
|
# .git, .svn etc.
|
||||||
exclude: [ '.git', '.hg', '.svn', 'CVS' ]
|
exclude: [ '.git', '.hg', '.svn', 'CVS' ]
|
||||||
|
|
||||||
|
string_pattern_type: legacy
|
||||||
|
|
||||||
# The data sources where nanoc loads its data from. This is an array of
|
# The data sources where nanoc loads its data from. This is an array of
|
||||||
# hashes; each array element represents a single data source. By default,
|
# hashes; each array element represents a single data source. By default,
|
||||||
# there is only a single data source that reads data from the “content/” and
|
# there is only a single data source that reads data from the “content/” and
|
||||||
|
|
@ -38,6 +40,8 @@ data_sources:
|
||||||
# The type is the identifier of the data source. By default, this will be
|
# The type is the identifier of the data source. By default, this will be
|
||||||
# `filesystem_unified`.
|
# `filesystem_unified`.
|
||||||
type: filesystem_unified
|
type: filesystem_unified
|
||||||
|
identifier_type: legacy
|
||||||
|
encoding: utf-c8
|
||||||
|
|
||||||
# The path where items should be mounted (comparable to mount points in
|
# The path where items should be mounted (comparable to mount points in
|
||||||
# Unix-like systems). This is “/” by default, meaning that items will have
|
# Unix-like systems). This is “/” by default, meaning that items will have
|
||||||
|
|
@ -60,3 +64,15 @@ data_sources:
|
||||||
|
|
||||||
# The default encoding for all files in `content/` and `layouts/`.
|
# The default encoding for all files in `content/` and `layouts/`.
|
||||||
encoding: utf-8
|
encoding: utf-8
|
||||||
|
|
||||||
|
|
||||||
|
debug: false
|
||||||
|
|
||||||
|
scripts:
|
||||||
|
- main
|
||||||
|
|
||||||
|
stylesheets:
|
||||||
|
- normalize
|
||||||
|
- colorful
|
||||||
|
- main
|
||||||
|
- monokai
|
||||||
|
|
|
||||||
|
|
@ -1,29 +0,0 @@
|
||||||
{
|
|
||||||
"folders":
|
|
||||||
[
|
|
||||||
{ "path": "content" },
|
|
||||||
{ "path": "layouts" },
|
|
||||||
{ "path": "lib" },
|
|
||||||
{
|
|
||||||
"path": "./",
|
|
||||||
"folder_exclude_patterns": ["output",
|
|
||||||
"tmp",
|
|
||||||
"content",
|
|
||||||
"layouts",
|
|
||||||
"lib"]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"build_systems":
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"name": "View",
|
|
||||||
"cmd": ["./view"],
|
|
||||||
"working_dir": "$project_path/"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Compile",
|
|
||||||
"cmd": ["nanoc"],
|
|
||||||
"working_dir": "$project_path/"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
@ -1,10 +1,13 @@
|
||||||
import md5, re, os, strutils, osproc
|
import md5, re, os, strutils, osproc
|
||||||
|
|
||||||
let
|
let
|
||||||
markdownFilesGlob = getCurrentDir() / "content" / "*.md"
|
markdownFilesGlob = getCurrentDir() / "content" / "content"
|
||||||
configFilePath = getCurrentDir() / "validcodehashes.txt"
|
configFilePath = getCurrentDir() / "validcodehashes.txt"
|
||||||
|
|
||||||
for filePath in walkFiles(markdownFilesGlob):
|
for filePath in walkDirRec(markdownFilesGlob):
|
||||||
|
if filePath.splitFile.ext != ".md":
|
||||||
|
continue
|
||||||
|
|
||||||
let file = open(filePath, fmRead)
|
let file = open(filePath, fmRead)
|
||||||
let fileContents = file.readAll()
|
let fileContents = file.readAll()
|
||||||
file.close()
|
file.close()
|
||||||
|
|
|
||||||
|
|
@ -1,18 +1,23 @@
|
||||||
|
|
||||||
489fd1e2356eb85f81bac48e45b186a7
|
489fd1e2356eb85f81bac48e45b186a7
|
||||||
|
260d9667bbbc34ce79da5d60efecef02
|
||||||
ade4a4b3b6973bbb44f2e74aee1954f7
|
ade4a4b3b6973bbb44f2e74aee1954f7
|
||||||
ef380e36bcc0ebf11902cefaa10ec31b
|
ef380e36bcc0ebf11902cefaa10ec31b
|
||||||
|
a043c1e16c84d2f1be0a9a6193d30ac0
|
||||||
26ded9e69879069fb8970403e87a24c9
|
26ded9e69879069fb8970403e87a24c9
|
||||||
b243592b06e93bb3cf1f7d62a25abaa3
|
b243592b06e93bb3cf1f7d62a25abaa3
|
||||||
3f3dfdee017d0c329d594e9fe038ed9f
|
3f3dfdee017d0c329d594e9fe038ed9f
|
||||||
cf09b588bb8b3c6979d24dcaff932c68
|
4d390aa1b44e1bb953e12e210985c85a
|
||||||
4bb57235ab6f4f0dd1eea58a769570c5
|
4bb57235ab6f4f0dd1eea58a769570c5
|
||||||
394ca46d1bf22dedef7e6e753bd033c8
|
394ca46d1bf22dedef7e6e753bd033c8
|
||||||
8afe80a509d316a3feb3caa1c985760a
|
8afe80a509d316a3feb3caa1c985760a
|
||||||
0bdba4c56b6172c86726f424b4186baf
|
0bdba4c56b6172c86726f424b4186baf
|
||||||
9551565b83418876b5211869acbcf7cc
|
9551565b83418876b5211869acbcf7cc
|
||||||
ac4fe7f722b390100501e638ce8a9750
|
24614b0b8792a9afc184e4d63e345981
|
||||||
f770b25468d042a02822e90df0848f35
|
d20fe9a9133bee2ef13c3b19ef540958
|
||||||
|
217de4ce8743609c7592a3d75264b17d
|
||||||
|
36c0a24d4e54348f950ff421a33dcd38
|
||||||
|
08b581ad308e3614335426ad8188b1ef
|
||||||
10ae94a28a0d8f23aff5afaa0367cf27
|
10ae94a28a0d8f23aff5afaa0367cf27
|
||||||
1865b827bef365e6422beb6bc076a25d
|
1865b827bef365e6422beb6bc076a25d
|
||||||
398863bccd3691b42500dfa143a3230b
|
398863bccd3691b42500dfa143a3230b
|
||||||
|
|
@ -21,18 +26,31 @@ b8875a112bc13ea83556bcf385c1160b
|
||||||
bee0509ab4bcf36510a85081d563057b
|
bee0509ab4bcf36510a85081d563057b
|
||||||
30111c31170d8cd9979ae7d88fa276e7
|
30111c31170d8cd9979ae7d88fa276e7
|
||||||
0e641a70cbd7b3e955bb29bde934f36e
|
0e641a70cbd7b3e955bb29bde934f36e
|
||||||
ad9e1e896361b0313c3ba66f793f4e6b
|
9c6750cad12656f497e5e6eb6896f5a1
|
||||||
d599ef057eaaac83139eb8f949cef356
|
d599ef057eaaac83139eb8f949cef356
|
||||||
e0e0e0b5724e296371d1704996096343
|
e0e0e0b5724e296371d1704996096343
|
||||||
2d60def87d4fa95e26b9f8eade4b0baa
|
2d60def87d4fa95e26b9f8eade4b0baa
|
||||||
180c2775b35bd48de55453713ccb5828
|
d10f498d7a0d1e8693f7e1612822405f
|
||||||
d01dfb20f1d8c1741eef320e82bfcdc2
|
d01dfb20f1d8c1741eef320e82bfcdc2
|
||||||
4f19f7a7103d8aec86dd2ab995e5a0a8
|
4f19f7a7103d8aec86dd2ab995e5a0a8
|
||||||
fbb7977d27de5251fa736a627aaa8311
|
fbb7977d27de5251fa736a627aaa8311
|
||||||
847d1c4525d9056206a1e4f4855a9e10
|
847d1c4525d9056206a1e4f4855a9e10
|
||||||
e4b29a303e0a22cab1f2bfb769ce66c5
|
e4b29a303e0a22cab1f2bfb769ce66c5
|
||||||
260d9667bbbc34ce79da5d60efecef02
|
9eec8a1ad6f93080de5bcff05d8c5949
|
||||||
24614b0b8792a9afc184e4d63e345981
|
d62e74f9c0aa9077ec40ea4d038927d0
|
||||||
217de4ce8743609c7592a3d75264b17d
|
bf5bdad17535aa70efc569742eb1101f
|
||||||
36c0a24d4e54348f950ff421a33dcd38
|
c3da4dbe65a64c00ebc210a71e821ed9
|
||||||
0b0bdbed7863d3ec82d2d8cb628562ed
|
02b30eadfb0591b8f723dd9277def002
|
||||||
|
d2657654df16c22a97903846ae9b3eec
|
||||||
|
84daadf080ac9b00870727cbb04f4758
|
||||||
|
deea30998a85ce603a7a38bb017de77b
|
||||||
|
a79167cf1a4c8d0347a55cb2676ffae3
|
||||||
|
9c16fb893a312d6bd6b260625a4b9b0c
|
||||||
|
b98257acda2d22827ed107f58c8a5ed8
|
||||||
|
f770b25468d042a02822e90df0848f35
|
||||||
|
397f231567a0f2ccd17a1a2b460d1c89
|
||||||
|
1cf49f03f1017f8babc9c517829266ae
|
||||||
|
4749fe1ac61b589a786fee5466bb4a52
|
||||||
|
abbe9a423e8c585e66f98deb6f7c303b
|
||||||
|
0e4bc99af4cd0c36e5af48ab2f5a5aa3
|
||||||
|
3dec7aae6d5b68e432c47200850be8fc
|
||||||
21
wercker.yml
21
wercker.yml
|
|
@ -1,13 +1,14 @@
|
||||||
box: flaviut/nim-by-example-build-vm@0.0.6
|
box: flaviut/nim-by-example-build-vm:0.1.2
|
||||||
build:
|
build:
|
||||||
steps:
|
steps:
|
||||||
- script:
|
- script:
|
||||||
name: build
|
name: build
|
||||||
code: |
|
code: |
|
||||||
source /home/ubuntu/.rvm/scripts/rvm
|
source /usr/local/rvm/scripts/rvm
|
||||||
git remote add publish $GIT_CREDENTIALS
|
git remote add publish 'git@github.com:nim-by-example/nim-by-example.github.io.git'
|
||||||
git config --global user.email "you@example.com"
|
git config --global user.email 'nim-by-example.github.io'
|
||||||
git config --global user.name "Your Name"
|
git config --global user.name 'Builder'
|
||||||
|
git config --global push.default simple
|
||||||
git checkout master
|
git checkout master
|
||||||
nanoc
|
nanoc
|
||||||
cp -r ./output/. ./
|
cp -r ./output/. ./
|
||||||
|
|
@ -16,7 +17,15 @@ build:
|
||||||
git commit -am'Build Site'
|
git commit -am'Build Site'
|
||||||
deploy:
|
deploy:
|
||||||
steps:
|
steps:
|
||||||
|
- script:
|
||||||
|
name: ssh-keys
|
||||||
|
code: |
|
||||||
|
mkdir -p ~/.ssh/
|
||||||
|
echo 'github.com ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==' > ~/.ssh/known_hosts
|
||||||
|
echo -e "$GIT_CREDENTIALS" > ~/.ssh/id_rsa
|
||||||
|
chmod 0600 ~/.ssh/id_rsa
|
||||||
|
chmod 0644 ~/.ssh/known_hosts
|
||||||
- script:
|
- script:
|
||||||
name: deploy
|
name: deploy
|
||||||
code: |
|
code: |
|
||||||
git push --force publish > /dev/null 2>&1
|
git push --force publish
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue