Create gh-pages branch via GitHub

This commit is contained in:
Gabi Melman 2015-04-10 13:05:50 +03:00
parent ba3c94af39
commit 8c538fba88
5 changed files with 862 additions and 414 deletions

View File

@ -1,142 +1,265 @@
<!doctype html>
<html>
<!DOCTYPE html>
<html lang="en-us">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="chrome=1">
<meta charset="UTF-8">
<title>Spdlog by gabime</title>
<link rel="stylesheet" href="stylesheets/styles.css">
<link rel="stylesheet" href="stylesheets/pygment_trac.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script src="javascripts/respond.js"></script>
<!--[if lt IE 9]>
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<!--[if lt IE 8]>
<link rel="stylesheet" href="stylesheets/ie.css">
<![endif]-->
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" type="text/css" href="stylesheets/normalize.css" media="screen">
<link href='http://fonts.googleapis.com/css?family=Open+Sans:400,700' rel='stylesheet' type='text/css'>
<link rel="stylesheet" type="text/css" href="stylesheets/stylesheet.css" media="screen">
<link rel="stylesheet" type="text/css" href="stylesheets/github-light.css" media="screen">
</head>
<body>
<div id="header">
<nav>
<li class="fork"><a href="https://github.com/gabime/spdlog">View On GitHub</a></li>
<li class="downloads"><a href="https://github.com/gabime/spdlog/zipball/master">ZIP</a></li>
<li class="downloads"><a href="https://github.com/gabime/spdlog/tarball/master">TAR</a></li>
<li class="title">DOWNLOADS</li>
</nav>
</div><!-- end header -->
<section class="page-header">
<h1 class="project-name">Spdlog</h1>
<h2 class="project-tagline">Super fast C++ logging library.</h2>
<a href="https://github.com/gabime/spdlog" class="btn">View on GitHub</a>
<a href="https://github.com/gabime/spdlog/zipball/master" class="btn">Download .zip</a>
<a href="https://github.com/gabime/spdlog/tarball/master" class="btn">Download .tar.gz</a>
</section>
<div class="wrapper">
<section>
<div id="title">
<h1>Spdlog</h1>
<p>Super fast C++ logging library.</p>
<hr>
<span class="credits left">Project maintained by <a href="https://github.com/gabime">gabime</a></span>
<span class="credits right">Hosted on GitHub Pages &mdash; Theme by <a href="https://twitter.com/michigangraham">mattgraham</a></span>
</div>
<h1>
<a name="spdlog" class="anchor" href="#spdlog"><span class="octicon octicon-link"></span></a>spdlog</h1>
<section class="main-content">
<h1>
<a id="spdlog" class="anchor" href="#spdlog" aria-hidden="true"><span class="octicon octicon-link"></span></a>spdlog</h1>
<p>Very fast, header only, C++ logging library.</p>
<h2>
<a name="install" class="anchor" href="#install"><span class="octicon octicon-link"></span></a>Install</h2>
<a id="install" class="anchor" href="#install" aria-hidden="true"><span class="octicon octicon-link"></span></a>Install</h2>
<p>Just copy the files to your build tree and use a C++11 compiler</p>
<h2>
<a name="tested-on" class="anchor" href="#tested-on"><span class="octicon octicon-link"></span></a>Tested on:</h2>
<a id="tested-on" class="anchor" href="#tested-on" aria-hidden="true"><span class="octicon octicon-link"></span></a>Tested on:</h2>
<ul>
<li>gcc 4.8.1 and above</li>
<li>clang 3.5</li>
<li>clang 3.5 (Linux and OSX)</li>
<li>visual studio 2013</li>
<li>mingw with g++ 4.9.x</li>
</ul>
<h2>
<a name="features" class="anchor" href="#features"><span class="octicon octicon-link"></span></a>Features</h2>
<a id="features" class="anchor" href="#features" aria-hidden="true"><span class="octicon octicon-link"></span></a>Features</h2>
<ul>
<li>Very low overhead</li>
<li>Stream like, easy to use interface</li>
<li>Logging levels</li>
<li>Rotating log files</li>
<li>Daily log files</li>
<li>Async logging</li>
<li>Thread safety</li>
<li>Custom formatting</li>
<li>Very fast - performance is the primary goal (see <a href="#benchmarks">benchmarks</a> below).</li>
<li>Headers only.</li>
<li>No dependencies - just copy and use.</li>
<li>Cross platform - Linux / Windows on 32/64 bits.</li>
<li>
<strong>new!</strong> Feature rich <a href="#usage-example">call style</a> using the excellent <a href="http://cppformat.github.io/">cppformat</a> library.</li>
<li>ostream call style is supported too.</li>
<li>Extremely fast asynchronous mode (optional) - using lockfree queues and other tricks to reach millions of calls/sec.</li>
<li>
<a href="https://github.com/gabime/spdlog/wiki/Custom-formatting">Custom</a> formatting.</li>
<li>Multi/Single threaded loggers.</li>
<li>Various log targets:
<ul>
<li>Rotating log files.</li>
<li>Daily log files.</li>
<li>Console logging.</li>
<li>Linux syslog.</li>
<li>Easily extendable with custom log targets (just implement a single function in the <a href="include/spdlog/sinks/sink.h">sink</a> interface).</li>
</ul>
</li>
<li>Severity based filtering - threshold levels can be modified in runtime as well as in compile time.</li>
</ul>
<h2>
<a name="performance" class="anchor" href="#performance"><span class="octicon octicon-link"></span></a>Performance</h2>
<a id="benchmarks" class="anchor" href="#benchmarks" aria-hidden="true"><span class="octicon octicon-link"></span></a>Benchmarks</h2>
<p>The library is very fast.
Here are some benchmarks (Ubuntu, Intel(R) Core(TM) i7-4770 CPU @ 3.40GHz)</p>
<p>Below are some <a href="bench">benchmarks</a> comparing popular log libraries under Ubuntu 64 bit, Intel i7-4770 CPU @ 3.40GHz </p>
<pre><code>*******************************************************************************
Single thread, 250,000 iterations, flush every 1000 lines
*******************************************************************************
rotating_st... 817,860 lines/sec
daily_st... 827,820 lines /sec
<h4>
<a id="synchronous-mode" class="anchor" href="#synchronous-mode" aria-hidden="true"><span class="octicon octicon-link"></span></a>Synchronous mode</h4>
*******************************************************************************
4 threads sharing same logger, 250,000 iterations, flush every 1000 lines
*******************************************************************************
rotating_mt... 1,476,013 lines/sec
daily_mt... 1,477,619 lines/sec
</code></pre>
<p>Time needed to log 1,000,000 lines in synchronous mode (in seconds, the best of 3 runs):</p>
<table>
<thead>
<tr>
<th>threads</th>
<th align="center">boost log</th>
<th align="center">glog</th>
<th align="right">easylogging</th>
<th align="right">spdlog</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td align="center">4.169s</td>
<td align="center">1.066s</td>
<td align="right">0.975s</td>
<td align="right">0.302s</td>
</tr>
<tr>
<td>10</td>
<td align="center">16.029</td>
<td align="center">3.032s</td>
<td align="right">2.857s</td>
<td align="right">0.968s</td>
</tr>
<tr>
<td>100</td>
<td align="center">15.008</td>
<td align="center">1.139s</td>
<td align="right">4.512s</td>
<td align="right">0.497s</td>
</tr>
</tbody>
</table>
<h4>
<a id="asynchronous-mode" class="anchor" href="#asynchronous-mode" aria-hidden="true"><span class="octicon octicon-link"></span></a>Asynchronous mode</h4>
<p>Time needed to log 1,000,000 lines in asynchronous mode, i.e. the time it takes to put them in the async queue (in seconds, the best of 3 runs):</p>
<table>
<thead>
<tr>
<th align="left">threads</th>
<th align="center">g2log <sup>async logger</sup>
</th>
<th align="right">spdlog <sup>async mode</sup>
</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">1</td>
<td align="center">1.850s</td>
<td align="right">0.216s</td>
</tr>
<tr>
<td align="left">10</td>
<td align="center">0.943s</td>
<td align="right">0.173s</td>
</tr>
<tr>
<td align="left">100</td>
<td align="center">0.959s</td>
<td align="right">0.202s</td>
</tr>
</tbody>
</table>
<h2>
<a name="usage-example" class="anchor" href="#usage-example"><span class="octicon octicon-link"></span></a>Usage Example</h2>
<a id="usage-example" class="anchor" href="#usage-example" aria-hidden="true"><span class="octicon octicon-link"></span></a>Usage Example</h2>
<pre><code>#include &lt;iostream&gt;
#include "spdlog/spdlog.h"
<div class="highlight highlight-c++"><pre>#<span class="pl-k">include</span> <span class="pl-s"><span class="pl-pds">&lt;</span>iostream<span class="pl-pds">&gt;</span></span>
#<span class="pl-k">include</span> <span class="pl-s"><span class="pl-pds">"</span>spdlog/spdlog.h<span class="pl-pds">"</span></span>
int main(int, char* [])
<span class="pl-k">int</span> <span class="pl-en">main</span>(<span class="pl-k">int</span>, <span class="pl-k">char</span>* [])
{
namespace spd = spdlog;
try
<span class="pl-k">namespace</span> <span class="pl-en">spd</span> <span class="pl-k">=</span> spdlog;
<span class="pl-k">try</span>
{
std::string filename = "spdlog_example";
auto console = spd::stderr_logger_mt("console");
console-&gt;info("Welcome to spdlog!") ;
console-&gt;info() &lt;&lt; "Creating file " &lt;&lt; filename &lt;&lt; "..";
<span class="pl-c">//Create console, multithreaded logger</span>
<span class="pl-k">auto</span> console = <span class="pl-c1">spd::stdout_logger_mt</span>(<span class="pl-s"><span class="pl-pds">"</span>console<span class="pl-pds">"</span></span>);
console-&gt;<span class="pl-c1">info</span>(<span class="pl-s"><span class="pl-pds">"</span>Welcome to spdlog!<span class="pl-pds">"</span></span>) ;
console-&gt;<span class="pl-c1">info</span>(<span class="pl-s"><span class="pl-pds">"</span>An info message example {}..<span class="pl-pds">"</span></span>, <span class="pl-c1">1</span>);
console-&gt;<span class="pl-c1">info</span>() &lt;&lt; <span class="pl-s"><span class="pl-pds">"</span>Streams are supported too <span class="pl-pds">"</span></span> &lt;&lt; <span class="pl-c1">1</span>;
auto file_logger = spd::rotating_logger_mt("file_logger", filename, 1024 * 1024 * 5, 3);
file_logger-&gt;info("Log file message number", 1);
<span class="pl-c">//Formatting examples</span>
console-&gt;<span class="pl-c1">info</span>(<span class="pl-s"><span class="pl-pds">"</span>Easy padding in numbers like {:08d}<span class="pl-pds">"</span></span>, <span class="pl-c1">12</span>);
console-&gt;<span class="pl-c1">info</span>(<span class="pl-s"><span class="pl-pds">"</span>Support for int: {0:d}; hex: {0:x}; oct: {0:o}; bin: {0:b}<span class="pl-pds">"</span></span>, <span class="pl-c1">42</span>);
console-&gt;<span class="pl-c1">info</span>(<span class="pl-s"><span class="pl-pds">"</span>Support for floats {:03.2f}<span class="pl-pds">"</span></span>, <span class="pl-c1">1.23456</span>);
console-&gt;<span class="pl-c1">info</span>(<span class="pl-s"><span class="pl-pds">"</span>Positional args are {1} {0}..<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>too<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>supported<span class="pl-pds">"</span></span>);
for (int i = 0; i &lt; 100; ++i)
{
auto square = i*i;
file_logger-&gt;info() &lt;&lt; i &lt;&lt; '*' &lt;&lt; i &lt;&lt; '=' &lt;&lt; square &lt;&lt; " (" &lt;&lt; "0x" &lt;&lt; std::hex &lt;&lt; square &lt;&lt; ")";
}
console-&gt;<span class="pl-c1">info</span>(<span class="pl-s"><span class="pl-pds">"</span>{:&lt;30}<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>left aligned<span class="pl-pds">"</span></span>);
console-&gt;<span class="pl-c1">info</span>(<span class="pl-s"><span class="pl-pds">"</span>{:&gt;30}<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>right aligned<span class="pl-pds">"</span></span>);
console-&gt;<span class="pl-c1">info</span>(<span class="pl-s"><span class="pl-pds">"</span>{:^30}<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>centered<span class="pl-pds">"</span></span>);
// Change log level to all loggers to warning and above
spd::set_level(spd::level::WARN);
console-&gt;info("This should not be displayed");
console-&gt;warn("This should!");
spd::set_level(spd::level::INFO);
<span class="pl-c">//</span>
<span class="pl-c">// Runtime log levels</span>
<span class="pl-c">//</span>
<span class="pl-c1">spd::set_level</span>(spd::level::info); <span class="pl-c">//Set global log level to info</span>
console-&gt;<span class="pl-c1">debug</span>(<span class="pl-s"><span class="pl-pds">"</span>This message shold not be displayed!<span class="pl-pds">"</span></span>);
console-&gt;<span class="pl-c1">set_level</span>(spd::level::debug); <span class="pl-c">// Set specific logger's log level</span>
console-&gt;<span class="pl-c1">debug</span>(<span class="pl-s"><span class="pl-pds">"</span>Now it should..<span class="pl-pds">"</span></span>);
// Change format pattern to all loggers
spd::set_pattern(" **** %Y-%m-%d %H:%M:%S.%e %l **** %v");
spd::get("console")-&gt;info("This is another message with different format");
<span class="pl-c">//</span>
<span class="pl-c">// Create a file rotating logger with 5mb size max and 3 rotated files</span>
<span class="pl-c">//</span>
<span class="pl-k">auto</span> file_logger = <span class="pl-c1">spd::rotating_logger_mt</span>(<span class="pl-s"><span class="pl-pds">"</span>file_logger<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>logs/mylogfile<span class="pl-pds">"</span></span>, <span class="pl-c1">1048576</span> * <span class="pl-c1">5</span>, <span class="pl-c1">3</span>);
<span class="pl-k">for</span>(<span class="pl-k">int</span> i = <span class="pl-c1">0</span>; i &lt; <span class="pl-c1">10</span>; ++i)
file_logger-&gt;<span class="pl-c1">info</span>(<span class="pl-s"><span class="pl-pds">"</span>{} * {} equals {:&gt;10}<span class="pl-pds">"</span></span>, i, i, i*i);
<span class="pl-c">//</span>
<span class="pl-c">// Create a daily logger - a new file is created every day on 2:30am</span>
<span class="pl-c">//</span>
<span class="pl-k">auto</span> daily_logger = <span class="pl-c1">spd::daily_logger_mt</span>(<span class="pl-s"><span class="pl-pds">"</span>daily_logger<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>logs/daily<span class="pl-pds">"</span></span>, <span class="pl-c1">2</span>, <span class="pl-c1">30</span>);
<span class="pl-c">// </span>
<span class="pl-c">// Customize msg format for all messages</span>
<span class="pl-c">//</span>
<span class="pl-c1">spd::set_pattern</span>(<span class="pl-s"><span class="pl-pds">"</span>*** [<span class="pl-ii">%</span>H:<span class="pl-ii">%</span>M:<span class="pl-c1">%S</span> <span class="pl-ii">%</span>z] [thread <span class="pl-ii">%</span>t] <span class="pl-ii">%</span>v ***<span class="pl-pds">"</span></span>);
file_logger-&gt;<span class="pl-c1">info</span>(<span class="pl-s"><span class="pl-pds">"</span>This is another message with custom format<span class="pl-pds">"</span></span>);
<span class="pl-c1">spd::get</span>(<span class="pl-s"><span class="pl-pds">"</span>console<span class="pl-pds">"</span></span>)-&gt;<span class="pl-c1">info</span>(<span class="pl-s"><span class="pl-pds">"</span>loggers can be retrieved from a global registry using the spdlog::get(logger_name) function<span class="pl-pds">"</span></span>);
<span class="pl-c">//</span>
<span class="pl-c">// Compile time debug or trace macros.</span>
<span class="pl-c">// Enabled #ifdef SPDLOG_DEBUG_ON or #ifdef SPDLOG_TRACE_ON</span>
<span class="pl-c">//</span>
<span class="pl-c1">SPDLOG_TRACE</span>(console, <span class="pl-s"><span class="pl-pds">"</span>Enabled only #ifdef SPDLOG_TRACE_ON..{} ,{}<span class="pl-pds">"</span></span>, <span class="pl-c1">1</span>, <span class="pl-c1">3.23</span>);
<span class="pl-c1">SPDLOG_DEBUG</span>(console, <span class="pl-s"><span class="pl-pds">"</span>Enabled only #ifdef SPDLOG_DEBUG_ON.. {} ,{}<span class="pl-pds">"</span></span>, <span class="pl-c1">1</span>, <span class="pl-c1">3.23</span>);
<span class="pl-c">//</span>
<span class="pl-c">// Asynchronous logging is very fast..</span>
<span class="pl-c">// Just call spdlog::set_async_mode(q_size) and all created loggers from now on will be asynchronous..</span>
<span class="pl-c">//</span>
<span class="pl-c1">size_t</span> q_size = <span class="pl-c1">1048576</span>; <span class="pl-c">//queue size must be power of 2</span>
<span class="pl-c1">spdlog::set_async_mode</span>(q_size);
<span class="pl-k">auto</span> async_file= <span class="pl-c1">spd::daily_logger_st</span>(<span class="pl-s"><span class="pl-pds">"</span>async_file_logger<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>logs/async_log.txt<span class="pl-pds">"</span></span>);
async_file-&gt;<span class="pl-c1">info</span>() &lt;&lt; <span class="pl-s"><span class="pl-pds">"</span>This is async log..<span class="pl-pds">"</span></span> &lt;&lt; <span class="pl-s"><span class="pl-pds">"</span>Should be very fast!<span class="pl-pds">"</span></span>;
<span class="pl-c">// </span>
<span class="pl-c">// syslog example. linux only..</span>
<span class="pl-c">//</span>
#<span class="pl-k">ifdef</span> __linux__
std::string ident = <span class="pl-s"><span class="pl-pds">"</span>spdlog-example<span class="pl-pds">"</span></span>;
<span class="pl-k">auto</span> syslog_logger = <span class="pl-c1">spd::syslog_logger</span>(<span class="pl-s"><span class="pl-pds">"</span>syslog<span class="pl-pds">"</span></span>, ident, LOG_PID);
syslog_logger-&gt;<span class="pl-c1">warn</span>(<span class="pl-s"><span class="pl-pds">"</span>This is warning that will end up in syslog. This is Linux only!<span class="pl-pds">"</span></span>);
#<span class="pl-k">endif</span>
}
catch (const spd::spdlog_ex&amp; ex)
<span class="pl-k">catch</span> (<span class="pl-k">const</span> spd::spdlog_ex&amp; ex)
{
std::cout &lt;&lt; "Log failed: " &lt;&lt; ex.what() &lt;&lt; std::endl;
std::cout &lt;&lt; <span class="pl-s"><span class="pl-pds">"</span>Log failed: <span class="pl-pds">"</span></span> &lt;&lt; ex.<span class="pl-c1">what</span>() &lt;&lt; std::endl;
}
return 0;
}
</code></pre>
</section>
</div>
<!--[if !IE]><script>fixScale(document);</script><![endif]-->
<span class="pl-c">// Example of user defined class with operator&lt;&lt;</span>
<span class="pl-k">class</span> <span class="pl-en">some_class</span> {};
std::ostream&amp; <span class="pl-k">operator</span>&lt;&lt;(std::ostream&amp; os, <span class="pl-k">const</span> some_class&amp; c) { <span class="pl-k">return</span> os &lt;&lt; <span class="pl-s"><span class="pl-pds">"</span>some_class<span class="pl-pds">"</span></span>; }
<span class="pl-k">void</span> <span class="pl-en">custom_class_example</span>()
{
some_class c;
<span class="pl-c1">spdlog::get</span>(<span class="pl-s"><span class="pl-pds">"</span>console<span class="pl-pds">"</span></span>)-&gt;<span class="pl-c1">info</span>(<span class="pl-s"><span class="pl-pds">"</span>custom class with operator&lt;&lt;: {}..<span class="pl-pds">"</span></span>, c);
<span class="pl-c1">spdlog::get</span>(<span class="pl-s"><span class="pl-pds">"</span>console<span class="pl-pds">"</span></span>)-&gt;<span class="pl-c1">info</span>() &lt;&lt; <span class="pl-s"><span class="pl-pds">"</span>custom class with operator&lt;&lt;: <span class="pl-pds">"</span></span> &lt;&lt; c &lt;&lt; <span class="pl-s"><span class="pl-pds">"</span>..<span class="pl-pds">"</span></span>;
}</pre></div>
<h2>
<a id="tweaking" class="anchor" href="#tweaking" aria-hidden="true"><span class="octicon octicon-link"></span></a>Tweaking</h2>
<p>spdlog can be tweaked to improve performance even more.</p>
<p>Edit <a href="include/spdlog/tweakme.h">this</a> file to disable at compile time unneeded features.</p>
<footer class="site-footer">
<span class="site-footer-owner"><a href="https://github.com/gabime/spdlog">Spdlog</a> is maintained by <a href="https://github.com/gabime">gabime</a>.</span>
<span class="site-footer-credits">This page was generated by <a href="https://pages.github.com">GitHub Pages</a> using the <a href="https://github.com/jasonlong/cayman-theme">Cayman theme</a> by <a href="https://twitter.com/jasonlong">Jason Long</a>.</span>
</footer>
</section>
</body>
</html>
</html>

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,115 @@
/*
Copyright 2014 GitHub Inc.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
.pl-c /* comment */ {
color: #969896;
}
.pl-c1 /* constant, markup.raw, meta.diff.header, meta.module-reference, meta.property-name, support, support.constant, support.variable, variable.other.constant */,
.pl-s .pl-v /* string variable */ {
color: #0086b3;
}
.pl-e /* entity */,
.pl-en /* entity.name */ {
color: #795da3;
}
.pl-s .pl-s1 /* string source */,
.pl-smi /* storage.modifier.import, storage.modifier.package, storage.type.java, variable.other, variable.parameter.function */ {
color: #333;
}
.pl-ent /* entity.name.tag */ {
color: #63a35c;
}
.pl-k /* keyword, storage, storage.type */ {
color: #a71d5d;
}
.pl-pds /* punctuation.definition.string, string.regexp.character-class */,
.pl-s /* string */,
.pl-s .pl-pse .pl-s1 /* string punctuation.section.embedded source */,
.pl-sr /* string.regexp */,
.pl-sr .pl-cce /* string.regexp constant.character.escape */,
.pl-sr .pl-sra /* string.regexp string.regexp.arbitrary-repitition */,
.pl-sr .pl-sre /* string.regexp source.ruby.embedded */ {
color: #183691;
}
.pl-v /* variable */ {
color: #ed6a43;
}
.pl-id /* invalid.deprecated */ {
color: #b52a1d;
}
.pl-ii /* invalid.illegal */ {
background-color: #b52a1d;
color: #f8f8f8;
}
.pl-sr .pl-cce /* string.regexp constant.character.escape */ {
color: #63a35c;
font-weight: bold;
}
.pl-ml /* markup.list */ {
color: #693a17;
}
.pl-mh /* markup.heading */,
.pl-mh .pl-en /* markup.heading entity.name */,
.pl-ms /* meta.separator */ {
color: #1d3e81;
font-weight: bold;
}
.pl-mq /* markup.quote */ {
color: #008080;
}
.pl-mi /* markup.italic */ {
color: #333;
font-style: italic;
}
.pl-mb /* markup.bold */ {
color: #333;
font-weight: bold;
}
.pl-md /* markup.deleted, meta.diff.header.from-file */ {
background-color: #ffecec;
color: #bd2c00;
}
.pl-mi1 /* markup.inserted, meta.diff.header.to-file */ {
background-color: #eaffea;
color: #55a532;
}
.pl-mdr /* meta.diff.range */ {
color: #795da3;
font-weight: bold;
}
.pl-mo /* meta.output */ {
color: #1d3e81;
}

View File

@ -1,10 +1,35 @@
/* normalize.css 2012-02-07T12:37 UTC - http://github.com/necolas/normalize.css */
/* =============================================================================
HTML5 display definitions
========================================================================== */
/*
* Corrects block display not defined in IE6/7/8/9 & FF3
/*! normalize.css v3.0.2 | MIT License | git.io/normalize */
/**
* 1. Set default font family to sans-serif.
* 2. Prevent iOS text size adjust after orientation change, without disabling
* user zoom.
*/
html {
font-family: sans-serif; /* 1 */
-ms-text-size-adjust: 100%; /* 2 */
-webkit-text-size-adjust: 100%; /* 2 */
}
/**
* Remove default margin.
*/
body {
margin: 0;
}
/* HTML5 display definitions
========================================================================== */
/**
* Correct `block` display not defined for any HTML5 element in IE 8/9.
* Correct `block` display not defined for `details` or `summary` in IE 10/11
* and Firefox.
* Correct `block` display not defined for `main` in IE 11.
*/
article,
aside,
details,
@ -13,209 +38,126 @@ figure,
footer,
header,
hgroup,
main,
menu,
nav,
section,
summary {
display: block;
}
/*
* Corrects inline-block display not defined in IE6/7/8/9 & FF3
/**
* 1. Correct `inline-block` display not defined in IE 8/9.
* 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.
*/
audio,
canvas,
progress,
video {
display: inline-block;
*display: inline;
*zoom: 1;
display: inline-block; /* 1 */
vertical-align: baseline; /* 2 */
}
/*
* Prevents modern browsers from displaying 'audio' without controls
/**
* Prevent modern browsers from displaying `audio` without controls.
* Remove excess height in iOS 5 devices.
*/
audio:not([controls]) {
display: none;
height: 0;
}
/*
* Addresses styling for 'hidden' attribute not present in IE7/8/9, FF3, S4
* Known issue: no IE6 support
/**
* Address `[hidden]` styling not present in IE 8/9/10.
* Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22.
*/
[hidden] {
[hidden],
template {
display: none;
}
/* =============================================================================
Base
/* Links
========================================================================== */
/*
* 1. Corrects text resizing oddly in IE6/7 when body font-size is set using em units
* http://clagnut.com/blog/348/#c790
* 2. Prevents iOS text size adjust after orientation change, without disabling user zoom
* www.456bereastreet.com/archive/201012/controlling_text_size_in_safari_for_ios_without_disabling_user_zoom/
/**
* Remove the gray background color from active links in IE 10.
*/
html {
font-size: 100%;
/* 1 */
-webkit-text-size-adjust: 100%;
/* 2 */
-ms-text-size-adjust: 100%;
/* 2 */
a {
background-color: transparent;
}
/*
* Addresses font-family inconsistency between 'textarea' and other form elements.
/**
* Improve readability when focused and also mouse hovered in all browsers.
*/
html,
button,
input,
select,
textarea {
font-family: sans-serif;
}
/*
* Addresses margins handled incorrectly in IE6/7
*/
body {
margin: 0;
}
/* =============================================================================
Links
========================================================================== */
/*
* Addresses outline displayed oddly in Chrome
*/
a:focus {
outline: thin dotted;
}
/*
* Improves readability when focused and also mouse hovered in all browsers
* people.opera.com/patrickl/experiments/keyboard/test
*/
a:hover,
a:active {
a:active,
a:hover {
outline: 0;
}
/* =============================================================================
Typography
/* Text-level semantics
========================================================================== */
/*
* Addresses font sizes and margins set differently in IE6/7
* Addresses font sizes within 'section' and 'article' in FF4+, Chrome, S5
/**
* Address styling not present in IE 8/9/10/11, Safari, and Chrome.
*/
h1 {
font-size: 2em;
margin: 0.67em 0;
}
h2 {
font-size: 1.5em;
margin: 0.83em 0;
}
h3 {
font-size: 1.17em;
margin: 1em 0;
}
h4 {
font-size: 1em;
margin: 1.33em 0;
}
h5 {
font-size: 0.83em;
margin: 1.67em 0;
}
h6 {
font-size: 0.75em;
margin: 2.33em 0;
}
/*
* Addresses styling not present in IE7/8/9, S5, Chrome
*/
abbr[title] {
border-bottom: 1px dotted;
}
/*
* Addresses style set to 'bolder' in FF3+, S4/5, Chrome
*/
/**
* Address style set to `bolder` in Firefox 4+, Safari, and Chrome.
*/
b,
strong {
font-weight: bold;
}
blockquote {
margin: 1em 40px;
}
/*
* Addresses styling not present in S5, Chrome
/**
* Address styling not present in Safari and Chrome.
*/
dfn {
font-style: italic;
}
/*
* Addresses styling not present in IE6/7/8/9
/**
* Address variable `h1` font-size and margin within `section` and `article`
* contexts in Firefox 4+, Safari, and Chrome.
*/
h1 {
font-size: 2em;
margin: 0.67em 0;
}
/**
* Address styling not present in IE 8/9.
*/
mark {
background: #ff0;
color: #000;
}
/*
* Addresses margins set differently in IE6/7
/**
* Address inconsistent and variable font size in all browsers.
*/
p,
pre {
margin: 1em 0;
}
/*
* Corrects font family set oddly in IE6, S4/5, Chrome
* en.wikipedia.org/wiki/User:Davidgothberg/Test59
*/
pre,
code,
kbd,
samp {
font-family: monospace, serif;
_font-family: 'courier new', monospace;
font-size: 1em;
}
/*
* 1. Addresses CSS quotes not supported in IE6/7
* 2. Addresses quote property not supported in S4
*/
/* 1 */
q {
quotes: none;
}
/* 2 */
q:before,
q:after {
content: '';
content: none;
}
small {
font-size: 75%;
font-size: 80%;
}
/*
* Prevents sub and sup affecting line-height in all browsers
* gist.github.com/413930
/**
* Prevent `sub` and `sup` affecting `line-height` in all browsers.
*/
sub,
sup {
font-size: 75%;
@ -232,228 +174,251 @@ sub {
bottom: -0.25em;
}
/* =============================================================================
Lists
/* Embedded content
========================================================================== */
/*
* Addresses margins set differently in IE6/7
*/
dl,
menu,
ol,
ul {
margin: 1em 0;
}
dd {
margin: 0 0 0 40px;
}
/*
* Addresses paddings set differently in IE6/7
/**
* Remove border when inside `a` element in IE 8/9/10.
*/
menu,
ol,
ul {
padding: 0 0 0 40px;
}
/*
* Corrects list images handled incorrectly in IE7
*/
nav ul,
nav ol {
list-style: none;
list-style-image: none;
}
/* =============================================================================
Embedded content
========================================================================== */
/*
* 1. Removes border when inside 'a' element in IE6/7/8/9, FF3
* 2. Improves image quality when scaled in IE7
* code.flickr.com/blog/2008/11/12/on-ui-quality-the-little-things-client-side-image-resizing/
*/
img {
border: 0;
/* 1 */
-ms-interpolation-mode: bicubic;
/* 2 */
}
/*
* Corrects overflow displayed oddly in IE9
/**
* Correct overflow not hidden in IE 9/10/11.
*/
svg:not(:root) {
overflow: hidden;
}
/* =============================================================================
Figures
/* Grouping content
========================================================================== */
/*
* Addresses margin not present in IE6/7/8/9, S5, O11
/**
* Address margin not present in IE 8/9 and Safari.
*/
figure {
margin: 0;
margin: 1em 40px;
}
/* =============================================================================
Forms
/**
* Address differences between Firefox and other browsers.
*/
hr {
box-sizing: content-box;
height: 0;
}
/**
* Contain overflow in all browsers.
*/
pre {
overflow: auto;
}
/**
* Address odd `em`-unit font size rendering in all browsers.
*/
code,
kbd,
pre,
samp {
font-family: monospace, monospace;
font-size: 1em;
}
/* Forms
========================================================================== */
/*
* Corrects margin displayed oddly in IE6/7
*/
form {
margin: 0;
}
/*
* Define consistent border, margin, and padding
/**
* Known limitation: by default, Chrome and Safari on OS X allow very limited
* styling of `select`, unless a `border` property is set.
*/
fieldset {
border: 1px solid #c0c0c0;
margin: 0 2px;
padding: 0.35em 0.625em 0.75em;
}
/*
* 1. Corrects color not being inherited in IE6/7/8/9
* 2. Corrects text not wrapping in FF3
* 3. Corrects alignment displayed oddly in IE6/7
/**
* 1. Correct color not being inherited.
* Known issue: affects color of disabled elements.
* 2. Correct font properties not being inherited.
* 3. Address margins set differently in Firefox 4+, Safari, and Chrome.
*/
legend {
border: 0;
/* 1 */
padding: 0;
white-space: normal;
/* 2 */
*margin-left: -7px;
/* 3 */
}
/*
* 1. Corrects font size not being inherited in all browsers
* 2. Addresses margins set differently in IE6/7, FF3+, S5, Chrome
* 3. Improves appearance and consistency in all browsers
*/
button,
input,
optgroup,
select,
textarea {
font-size: 100%;
/* 1 */
margin: 0;
/* 2 */
vertical-align: baseline;
/* 3 */
*vertical-align: middle;
/* 3 */
color: inherit; /* 1 */
font: inherit; /* 2 */
margin: 0; /* 3 */
}
/*
* Addresses FF3/4 setting line-height on 'input' using !important in the UA stylesheet
/**
* Address `overflow` set to `hidden` in IE 8/9/10/11.
*/
button,
input {
line-height: normal;
/* 1 */
button {
overflow: visible;
}
/*
* 1. Improves usability and consistency of cursor style between image-type 'input' and others
* 2. Corrects inability to style clickable 'input' types in iOS
* 3. Removes inner spacing in IE7 without affecting normal text inputs
* Known issue: inner spacing remains in IE6
/**
* Address inconsistent `text-transform` inheritance for `button` and `select`.
* All other form control elements do not inherit `text-transform` values.
* Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.
* Correct `select` style inheritance in Firefox.
*/
button,
input[type="button"],
select {
text-transform: none;
}
/**
* 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
* and `video` controls.
* 2. Correct inability to style clickable `input` types in iOS.
* 3. Improve usability and consistency of cursor style between image-type
* `input` and others.
*/
button,
html input[type="button"], /* 1 */
input[type="reset"],
input[type="submit"] {
cursor: pointer;
/* 1 */
-webkit-appearance: button;
/* 2 */
*overflow: visible;
/* 3 */
-webkit-appearance: button; /* 2 */
cursor: pointer; /* 3 */
}
/*
* Re-set default cursor for disabled elements
/**
* Re-set default cursor for disabled elements.
*/
button[disabled],
input[disabled] {
html input[disabled] {
cursor: default;
}
/*
* 1. Addresses box sizing set to content-box in IE8/9
* 2. Removes excess padding in IE8/9
* 3. Removes excess padding in IE7
Known issue: excess padding remains in IE6
/**
* Remove inner padding and border in Firefox 4+.
*/
input[type="checkbox"],
input[type="radio"] {
box-sizing: border-box;
/* 1 */
padding: 0;
/* 2 */
*height: 13px;
/* 3 */
*width: 13px;
/* 3 */
}
/*
* 1. Addresses appearance set to searchfield in S5, Chrome
* 2. Addresses box-sizing set to border-box in S5, Chrome (include -moz to future-proof)
*/
input[type="search"] {
-webkit-appearance: textfield;
/* 1 */
-moz-box-sizing: content-box;
-webkit-box-sizing: content-box;
/* 2 */
box-sizing: content-box;
}
/*
* Removes inner padding and search cancel button in S5, Chrome on OS X
*/
input[type="search"]::-webkit-search-decoration,
input[type="search"]::-webkit-search-cancel-button {
-webkit-appearance: none;
}
/*
* Removes inner padding and border in FF3+
* www.sitepen.com/blog/2008/05/14/the-devils-in-the-details-fixing-dojos-toolbar-buttons/
*/
button::-moz-focus-inner,
input::-moz-focus-inner {
border: 0;
padding: 0;
}
/*
* 1. Removes default vertical scrollbar in IE6/7/8/9
* 2. Improves readability and alignment in all browsers
/**
* Address Firefox 4+ setting `line-height` on `input` using `!important` in
* the UA stylesheet.
*/
textarea {
overflow: auto;
/* 1 */
vertical-align: top;
/* 2 */
input {
line-height: normal;
}
/* =============================================================================
Tables
========================================================================== */
/*
* Remove most spacing between table cells
/**
* It's recommended that you don't attempt to style these elements.
* Firefox's implementation doesn't respect box-sizing, padding, or width.
*
* 1. Address box sizing set to `content-box` in IE 8/9/10.
* 2. Remove excess padding in IE 8/9/10.
*/
input[type="checkbox"],
input[type="radio"] {
box-sizing: border-box; /* 1 */
padding: 0; /* 2 */
}
/**
* Fix the cursor style for Chrome's increment/decrement buttons. For certain
* `font-size` values of the `input`, it causes the cursor style of the
* decrement button to change from `default` to `text`.
*/
input[type="number"]::-webkit-inner-spin-button,
input[type="number"]::-webkit-outer-spin-button {
height: auto;
}
/**
* 1. Address `appearance` set to `searchfield` in Safari and Chrome.
* 2. Address `box-sizing` set to `border-box` in Safari and Chrome
* (include `-moz` to future-proof).
*/
input[type="search"] {
-webkit-appearance: textfield; /* 1 */ /* 2 */
box-sizing: content-box;
}
/**
* Remove inner padding and search cancel button in Safari and Chrome on OS X.
* Safari (but not Chrome) clips the cancel button when the search input has
* padding (and `textfield` appearance).
*/
input[type="search"]::-webkit-search-cancel-button,
input[type="search"]::-webkit-search-decoration {
-webkit-appearance: none;
}
/**
* Define consistent border, margin, and padding.
*/
fieldset {
border: 1px solid #c0c0c0;
margin: 0 2px;
padding: 0.35em 0.625em 0.75em;
}
/**
* 1. Correct `color` not being inherited in IE 8/9/10/11.
* 2. Remove padding so people aren't caught out if they zero out fieldsets.
*/
legend {
border: 0; /* 1 */
padding: 0; /* 2 */
}
/**
* Remove default vertical scrollbar in IE 8/9/10/11.
*/
textarea {
overflow: auto;
}
/**
* Don't inherit the `font-weight` (applied by a rule above).
* NOTE: the default cannot safely be changed in Chrome and Safari on OS X.
*/
optgroup {
font-weight: bold;
}
/* Tables
========================================================================== */
/**
* Remove most spacing between table cells.
*/
table {
border-collapse: collapse;
border-spacing: 0;
}
td,
th {
padding: 0;
}

245
stylesheets/stylesheet.css Normal file
View File

@ -0,0 +1,245 @@
* {
box-sizing: border-box; }
body {
padding: 0;
margin: 0;
font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
font-size: 16px;
line-height: 1.5;
color: #606c71; }
a {
color: #1e6bb8;
text-decoration: none; }
a:hover {
text-decoration: underline; }
.btn {
display: inline-block;
margin-bottom: 1rem;
color: rgba(255, 255, 255, 0.7);
background-color: rgba(255, 255, 255, 0.08);
border-color: rgba(255, 255, 255, 0.2);
border-style: solid;
border-width: 1px;
border-radius: 0.3rem;
transition: color 0.2s, background-color 0.2s, border-color 0.2s; }
.btn + .btn {
margin-left: 1rem; }
.btn:hover {
color: rgba(255, 255, 255, 0.8);
text-decoration: none;
background-color: rgba(255, 255, 255, 0.2);
border-color: rgba(255, 255, 255, 0.3); }
@media screen and (min-width: 64em) {
.btn {
padding: 0.75rem 1rem; } }
@media screen and (min-width: 42em) and (max-width: 64em) {
.btn {
padding: 0.6rem 0.9rem;
font-size: 0.9rem; } }
@media screen and (max-width: 42em) {
.btn {
display: block;
width: 100%;
padding: 0.75rem;
font-size: 0.9rem; }
.btn + .btn {
margin-top: 1rem;
margin-left: 0; } }
.page-header {
color: #fff;
text-align: center;
background-color: #159957;
background-image: linear-gradient(120deg, #155799, #159957); }
@media screen and (min-width: 64em) {
.page-header {
padding: 5rem 6rem; } }
@media screen and (min-width: 42em) and (max-width: 64em) {
.page-header {
padding: 3rem 4rem; } }
@media screen and (max-width: 42em) {
.page-header {
padding: 2rem 1rem; } }
.project-name {
margin-top: 0;
margin-bottom: 0.1rem; }
@media screen and (min-width: 64em) {
.project-name {
font-size: 3.25rem; } }
@media screen and (min-width: 42em) and (max-width: 64em) {
.project-name {
font-size: 2.25rem; } }
@media screen and (max-width: 42em) {
.project-name {
font-size: 1.75rem; } }
.project-tagline {
margin-bottom: 2rem;
font-weight: normal;
opacity: 0.7; }
@media screen and (min-width: 64em) {
.project-tagline {
font-size: 1.25rem; } }
@media screen and (min-width: 42em) and (max-width: 64em) {
.project-tagline {
font-size: 1.15rem; } }
@media screen and (max-width: 42em) {
.project-tagline {
font-size: 1rem; } }
.main-content :first-child {
margin-top: 0; }
.main-content img {
max-width: 100%; }
.main-content h1, .main-content h2, .main-content h3, .main-content h4, .main-content h5, .main-content h6 {
margin-top: 2rem;
margin-bottom: 1rem;
font-weight: normal;
color: #159957; }
.main-content p {
margin-bottom: 1em; }
.main-content code {
padding: 2px 4px;
font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace;
font-size: 0.9rem;
color: #383e41;
background-color: #f3f6fa;
border-radius: 0.3rem; }
.main-content pre {
padding: 0.8rem;
margin-top: 0;
margin-bottom: 1rem;
font: 1rem Consolas, "Liberation Mono", Menlo, Courier, monospace;
color: #567482;
word-wrap: normal;
background-color: #f3f6fa;
border: solid 1px #dce6f0;
border-radius: 0.3rem; }
.main-content pre > code {
padding: 0;
margin: 0;
font-size: 0.9rem;
color: #567482;
word-break: normal;
white-space: pre;
background: transparent;
border: 0; }
.main-content .highlight {
margin-bottom: 1rem; }
.main-content .highlight pre {
margin-bottom: 0;
word-break: normal; }
.main-content .highlight pre, .main-content pre {
padding: 0.8rem;
overflow: auto;
font-size: 0.9rem;
line-height: 1.45;
border-radius: 0.3rem; }
.main-content pre code, .main-content pre tt {
display: inline;
max-width: initial;
padding: 0;
margin: 0;
overflow: initial;
line-height: inherit;
word-wrap: normal;
background-color: transparent;
border: 0; }
.main-content pre code:before, .main-content pre code:after, .main-content pre tt:before, .main-content pre tt:after {
content: normal; }
.main-content ul, .main-content ol {
margin-top: 0; }
.main-content blockquote {
padding: 0 1rem;
margin-left: 0;
color: #819198;
border-left: 0.3rem solid #dce6f0; }
.main-content blockquote > :first-child {
margin-top: 0; }
.main-content blockquote > :last-child {
margin-bottom: 0; }
.main-content table {
display: block;
width: 100%;
overflow: auto;
word-break: normal;
word-break: keep-all; }
.main-content table th {
font-weight: bold; }
.main-content table th, .main-content table td {
padding: 0.5rem 1rem;
border: 1px solid #e9ebec; }
.main-content dl {
padding: 0; }
.main-content dl dt {
padding: 0;
margin-top: 1rem;
font-size: 1rem;
font-weight: bold; }
.main-content dl dd {
padding: 0;
margin-bottom: 1rem; }
.main-content hr {
height: 2px;
padding: 0;
margin: 1rem 0;
background-color: #eff0f1;
border: 0; }
@media screen and (min-width: 64em) {
.main-content {
max-width: 64rem;
padding: 2rem 6rem;
margin: 0 auto;
font-size: 1.1rem; } }
@media screen and (min-width: 42em) and (max-width: 64em) {
.main-content {
padding: 2rem 4rem;
font-size: 1.1rem; } }
@media screen and (max-width: 42em) {
.main-content {
padding: 2rem 1rem;
font-size: 1rem; } }
.site-footer {
padding-top: 2rem;
margin-top: 2rem;
border-top: solid 1px #eff0f1; }
.site-footer-owner {
display: block;
font-weight: bold; }
.site-footer-credits {
color: #819198; }
@media screen and (min-width: 64em) {
.site-footer {
font-size: 1rem; } }
@media screen and (min-width: 42em) and (max-width: 64em) {
.site-footer {
font-size: 1rem; } }
@media screen and (max-width: 42em) {
.site-footer {
font-size: 0.9rem; } }