]> git.ipfire.org Git - thirdparty/lldpd.git/commitdiff
First version of lldpd website.
authorVincent Bernat <bernat@luffy.cx>
Sat, 12 Jan 2013 21:14:37 +0000 (22:14 +0100)
committerVincent Bernat <bernat@luffy.cx>
Sat, 12 Jan 2013 21:14:37 +0000 (22:14 +0100)
27 files changed:
.gitignore [new file with mode: 0644]
content/404.html [new file with mode: 0644]
content/features.html [new file with mode: 0644]
content/index.html [new file with mode: 0644]
content/installation.html [new file with mode: 0644]
content/media/css/common.less [new file with mode: 0644]
content/media/css/lldpd.0.normalize.less [new file with mode: 0644]
content/media/css/lldpd.1.blank.less [new file with mode: 0644]
content/media/css/lldpd.2.article.less [new file with mode: 0644]
content/media/css/lldpd.3.code.less [new file with mode: 0644]
content/media/css/lldpd.4.images.less [new file with mode: 0644]
content/media/css/lldpd.5.menu.less [new file with mode: 0644]
content/media/css/lldpd.99.typography.less [new file with mode: 0644]
content/media/css/lldpd.less [new file with mode: 0644]
content/media/images/bright_squares.png [new file with mode: 0644]
content/media/images/why.png [new file with mode: 0644]
content/media/js/modernizr.js [new file with mode: 0644]
content/media/js/mp.js [new file with mode: 0644]
content/media/js/prefixfree.js [new file with mode: 0644]
content/media/meta.yaml [new file with mode: 0644]
content/usage.html [new file with mode: 0644]
extensions/__init__.py [new file with mode: 0644]
extensions/combine.py [new file with mode: 0644]
extensions/text.py [new file with mode: 0644]
layout/base.j2 [new file with mode: 0644]
layout/menu.j2 [new file with mode: 0644]
site.yaml [new file with mode: 0644]

diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..9fc76e2
--- /dev/null
@@ -0,0 +1,6 @@
+# Submodule in master branch
+/libevent/
+
+*.pyc
+/deploy/
+/.hyde_deps
diff --git a/content/404.html b/content/404.html
new file mode 100644 (file)
index 0000000..58dc5c0
--- /dev/null
@@ -0,0 +1,10 @@
+---
+title: Not found
+---
+
+Sorry, but the page you are looking for has not been found.
+
+{# Local Variables:      #}
+{# mode: markdown        #}
+{# indent-tabs-mode: nil #}
+{# End:                  #}
diff --git a/content/features.html b/content/features.html
new file mode 100644 (file)
index 0000000..0ce85b9
--- /dev/null
@@ -0,0 +1,89 @@
+---
+title: Features
+---
+
+`lldpd` supports **several discovery protocols** and is smart enough
+to select the right protocol on each interface:
+
+ - LLDP, of course
+ - CDP (Cisco)
+ - EDP (Extreme)
+ - SONMP (Nortel)
+ - FDP (Foundry)
+
+It is able to advertise the following TLV:
+
+ - System name and description
+ - Port name and description
+ - VLAN ID and names
+ - IPv4/IPv6 management address
+ - MAC/PHY information
+ - MDI power (802.3af and 802.3at)
+ - Link aggregation
+ - Network policies (LLDP-MED)
+ - Location (LLDP-MED)
+ - Inventory (LLDP-MED)
+
+`lldpd` supports many OS:
+
+ - GNU/Linux
+ - FreeBSD
+ - NetBSD
+ - OpenBSD
+ - Mac OS X (sponsored by [Xcloud](http://xcloud.me), Mac cloud server hosting)
+
+Moreover, it can handle correctly VLAN, link aggregates and bridges on
+all those platforms.
+
+Discovered neighbors can be queried through a convenient **command
+line** interface:
+
+    ::console
+    # show neighbors detail
+    -------------------------------------------------------------------------------
+    Interface:    eth0, via: LLDP, RID: 1, Time: 0 day, 00:00:10
+      Chassis:     
+        ChassisID:    mac 00:18:f3:03:4e:06
+        SysName:      dev-01.example.com
+        SysDescr:     Debian GNU/Linux 7.0 (wheezy) Linux 3.7-trunk-amd64 #1 SMP Debian 3.7.1-1~experimental.1 x86_64
+        MgmtIP:       192.168.20.127
+        Capability:   Bridge, on
+        Capability:   Router, on
+        Capability:   Wlan, off
+      Port:        
+        PortID:       mac ea:b8:ab:aa:8c:da
+        PortDescr:    eth1
+        PMD autoneg:  supported: no, enabled: no
+          MAU oper type: 10GigBaseR - R PCS/PMA, unknown PMD.
+      LLDP-MED:    
+        Device Type:  Media Endpoint (Class II)
+        Capability:   Capabilities
+        Capability:   Policy
+        Capability:   Location
+        Capability:   MDI/PSE
+        Capability:   MDI/PD
+        Capability:   Inventory
+        Inventory:   
+          Hardware Revision: System Version
+          Software Revision: 3.7-trunk-amd64
+          Firmware Revision: 2104   
+          Serial Number: System Serial Number
+          Manufacturer: System manufacturer
+          Model:        System Product Name
+          Asset ID:     Asset-1234567890
+    -------------------------------------------------------------------------------
+
+They can also be queried through SNMP with the built-in SNMP
+subagent. Or through a Unix socket with the provided library.
+
+*[LLDP]: Link Layer Discovery Protocol
+*[CDP]: Cisco Discovery Protocol
+*[EDP]: Extreme Discovery Protocol
+*[FDP]: Foundry Discovery Protocol
+*[SONMP]: SynOptics Network Management Protocol
+*[MED]: Media Endpoint Discovery
+
+{# Local Variables:      #}
+{# mode: markdown        #}
+{# indent-tabs-mode: nil #}
+{# End:                  #}
diff --git a/content/index.html b/content/index.html
new file mode 100644 (file)
index 0000000..37fa6ce
--- /dev/null
@@ -0,0 +1,38 @@
+# What is lldpd?
+
+![Why using lldpd]([[!!images/why.png]])
+
+LLDP allows you to know exactly on which port is a server
+(and reciprocally).
+
+[LLDP][] is an industry standard protocol designed to supplant
+proprietary Link-Layer protocols such as EDP or CDP. The goal of LLDP
+is to provide an inter-vendor compatible mechanism to deliver
+Link-Layer notifications to adjacent network devices.
+
+`lldpd` is a pretty complete implementation of LLDP for various
+Unixes. It also supports some proprietary protocols.
+
+# Interested?
+
+ - Download the latest version ([{{ resource.meta.latestversion }}][last]).
+ - Check the [list of features]([[features.html]]).
+ - Learn [how to install _lldpd_]([[install.html]]).
+ - Learn [how to configure and use _lldpd_]([[usage.html]]).
+ - [Get the code on GitHub](https://github.com/vincentbernat/lldpd).
+ - [Add issues and feature requests](https://github.com/vincentbernat/lldpd/issues).
+[last]: http://media.luffy.cx/files/lldpd/lldpd-{{ resource.meta.latestversion }}.tar.gz "lldpd {{ resource.meta.latestversion }} version"
+
+[LLDP]: http://en.wikipedia.org/wiki/Link_Layer_Discovery_Protocol "Link Layer Discovery Protocol"
+*[LLDP]: Link Layer Discovery Protocol
+*[CDP]: Cisco Discovery Protocol
+*[EDP]: Extreme Discovery Protocol
+*[FDP]: Foundry Discovery Protocol
+*[SONMP]: SynOptics Network Management Protocol
+*[MED]: Media Endpoint Discovery
+
+{# Local Variables:      #}
+{# mode: markdown        #}
+{# indent-tabs-mode: nil #}
+{# End:                  #}
diff --git a/content/installation.html b/content/installation.html
new file mode 100644 (file)
index 0000000..56e6e10
--- /dev/null
@@ -0,0 +1,189 @@
+---
+title: Installation
+---
+
+`lldpd` supports several OS. You can install it from packages or from
+sources. Once installed, you may want to look
+[how to use and configure it]([[usage.html]]).
+
+[TOC]
+
+# GNU/Linux
+
+## Debian and Ubuntu
+
+`lldpd` is already available in Debian and Ubuntu. You can install it
+with:
+
+    ::console
+    $ sudo apt-get install lldpd
+    Reading package lists... Done
+    Building dependency tree       
+    Reading state information... Done
+    The following extra packages will be installed:
+    [...]
+
+It will be installed and configured to start at boot. You can change
+the options of `lldpd` in `/etc/default/lldpd`.
+
+If the package is not recent enough, you can use the
+[Debian backports][] on Debian. Follow the instructions available on
+the website.
+
+If it is still not recent enough, you can grab the appropriate Debian
+package from [openSUSE Build Service][]. Follow the instructions
+available on the website.
+
+The last option is to to [build _lldpd_ from source][]. You can still
+install and uninstall the package to get `_lldpd` user and group, as
+well as a working init script.
+
+## Gentoo
+
+`lldpd` is available in portage. Just issue the command `emerge lldpd`
+to install it. You can also [build _lldpd_ from source][].
+
+## Fedora, RHEL, CentOS & SUSE
+
+You can install the packages from [openSUSE Build Service][]. Follow
+the instructions available on the website. It is also possible to
+[build _lldpd_ from source][].
+
+# BSD
+
+`lldpd` is currently not available in the port tree of any
+BSD. Therefore, you have to [build _lldpd_ from source][]. You can add
+`_lldpd` user with `vipw` and add `_lldpd` group by adding it manually
+in `/etc/group`. The user must not be able to login, have its home as
+`/var/empty` and a disabled shell (like `/bin/false`).
+
+You may want to configure `lldpd` with
+`--with-privsep-chroot=/var/empty` to avoid to create
+`/var/run/lldpd`.
+
+If `lldpcli` is not able to provide completion, you can use the `help`
+command instead or install the GNU Readline library on your system.
+
+# Mac OS X
+
+The easiest way is to use [Homebrew][]. Check the website if you don't
+have it, it is easy to install. Once installed, type in a terminal:
+
+    ::console
+    $ brew install https://raw.github.com/vincentbernat/lldpd/master/osx/lldpd.rb
+    ######################################################################## 100.0%
+    ==> Downloading http://media.luffy.cx/files/lldpd/lldpd-{{ resource.meta.latestversion }}.tar.gz
+    ==> ./configure --prefix=/usr/local/Cellar/lldpd/{{ resource.meta.latestversion }} --with-xml --with-readline
+    [...]
+
+Pay attention at the instructions at the end of the build: they
+explain how to create `_lldpd` user and group and how to run `lldpd`
+when the system starts.
+
+If you don't want to use [Homebrew][], you will need to
+[build _lldpd_ from source][]. To create `_lldpd` user and `_group`, you
+need to use `dscl`. First, locate a free UID and GID:
+
+    ::console
+    $ dscl . list /Users uid
+    $ dscl . list /Groups gid
+
+Let's say that 274 is not used. Let's create the appropriate user:
+
+    ::console
+    $ sudo dscl . -create /Groups/_lldpd
+    $ sudo dscl . -create /Groups/_lldpd PrimaryGroupID 274
+    $ sudo dscl . -create /Groups/_lldpd Password "*"
+    $ sudo dscl . -create /Groups/_lldpd RealName "lldpd privilege separation group"
+    $ sudo dscl . -create /Users/_lldpd
+    $ sudo dscl . -create /Users/_lldpd UserShell /usr/bin/false
+    $ sudo dscl . -create /Users/_lldpd NFSHomeDirectory /var/empty
+    $ sudo dscl . -create /Users/_lldpd PrimaryGroupID 274
+    $ sudo dscl . -create /Users/_lldpd UniqueID 274
+    $ sudo dscl . -create /Users/_lldpd Password "*"
+    $ sudo dscl . -create /Users/_lldpd RealName "lldpd privilege separation user"
+
+You still need to create `/var/run/lldpd` and to integrate `lldpd` in
+`launchd` yourself.
+
+# Install from source
+
+This is the last resort method. Other methods are usually simpler.
+
+You first need to download the latest version
+([{{ resource.meta.latestversion }}][lasttgz]). You need a working build
+environment.
+
+    ::console
+    $ tar zxvf ~/download/lldpd-{{ resource.meta.latestversion }}.tar.gz
+    $ cd lldpd-{{ resource.meta.latestversion }}
+    $ mkdir build
+    $ cd build
+    $ ../configure
+    checking for a BSD-compatible install... /usr/bin/install -c
+    checking whether build environment is sane... yes
+    checking for a thread-safe mkdir -p... /bin/mkdir -p
+    checking for gawk... gawk
+    [...]
+    ------------------ Summary ------------------
+     lldpd version {{ meta.resource.latestversion }}
+      Prefix.........: /usr/local
+      C Compiler.....: gcc -g -O2 -fdiagnostics-show-option -std=gnu99 -pipe -Wall -W -Wextra -Wformat -Wformat-security -Wcast-align -Winline -fstack-protector -D_FORTIFY_SOURCE=2 -Wdeclaration-after-statement -Wno-unused-parameter -Wno-sign-compare 
+      Linker.........: /usr/bin/ld -m elf_x86_64  -Wl,-z,relro -Wl,-z,now 
+      Libevent.......: system
+     Optional features:
+      SNMP support...: no
+      CDP............: yes
+      FDP............: yes
+      EDP............: yes
+      SONMP..........: yes
+      LLDPMED........: yes
+      DOT1...........: yes
+      DOT3...........: yes
+      XML output.....: no
+    ---------------------------------------------
+
+    Check the above options and compile with:
+     make
+
+If this steps fail, feel free to [file a bug report][]. The content
+of `config.log` should be helpful. Otherwise, check if everything is
+as you except and continue.
+
+    ::console
+    $ make
+      CC     strlcpy.lo
+      CCLD   libcompat.la
+      CC     log.lo
+    [...]
+    make[1]: Leaving directory `/home/bernat/src/lldpd-{{ resource.meta.latestversion }}'
+
+If this steps fail, feel free to [file a bug report][] too with the
+output and some details on your platform. The `config.log` is also
+useful in this case.
+
+You can finish the installation with `make install`. Then, you still
+have to complete the following steps by yourself. They are system
+specifics:
+
+ - Create a `_lldpd` user and a `_lldpd` group. This is needed for
+   privilege seperation (increased security).
+ - Create the chroot (`/var/run/lldpd` by default). It is just an
+   empty directory.
+ - Ensure that `lldpd` is started at boot.
+
+`../configure` accepts several options. You can get them with
+`../configure --help`. The most interesting ones are `--with-snmp` and
+`--with-xml`.
+
+[lasttgz]: http://media.luffy.cx/files/lldpd/lldpd-{{ resource.meta.latestversion }}.tar.gz "lldpd {{ resource.meta.latestversion }} version"
+[file a bug request]: https://github.com/vincentbernat/lldpd/issues "GitHub bug tracker for lldpd"
+[Debian backports]: http://backports.debian.org "Debian Backports"
+[openSUSE Build Service]: http://software.opensuse.org/download.html?project=home:vbernat&package=lldpd "lldpd on OSC"
+[build _lldpd_ from source]: #install-from-source
+[Homebrew]: http://mxcl.github.com/homebrew/ "Homebrew: the missing package manager for OS X"
+
+{# Local Variables:      #}
+{# mode: markdown        #}
+{# indent-tabs-mode: nil #}
+{# End:                  #}
diff --git a/content/media/css/common.less b/content/media/css/common.less
new file mode 100644 (file)
index 0000000..2b62c2c
--- /dev/null
@@ -0,0 +1,32 @@
+/* -*- css -*- */
+
+.inline-block () {
+    display: inline-block;
+    zoom: 1;
+    *display: inline;
+}
+
+.clearfix () {
+    zoom: 1;
+    &:after {
+       display: block;
+       visibility: hidden;
+       height: 0;
+       clear: both;
+       content: ".";
+    }
+}
+
+@font-unicode: 'Lucida Grande','Lucida Sans Unicode','Arial Unicode MS';
+@font-regular: 'Libre Baskerville','Georgia',sans-serif,@font-unicode;
+@font-headings: 'Libre Baskerville','Georgia',sans-serif,@font-unicode;
+@font-console:  'Inconsolata','Droid Sans Mono',monospace,@font-unicode;
+@page-width: 50em;
+@article-width: 42em;
+@line-height: 1.625;
+@theme-color: #B80F28;
+
+.font-size (@factor: 1) {
+    font-size: @factor * 1em;
+    line-height: ~`Math.ceil(@{factor}/@{line-height})*@{line-height}/@{factor}`;
+}
diff --git a/content/media/css/lldpd.0.normalize.less b/content/media/css/lldpd.0.normalize.less
new file mode 100644 (file)
index 0000000..3d80788
--- /dev/null
@@ -0,0 +1,378 @@
+/* -*- css -*- */
+/*! normalize.css 2012-03-06T10:21 UTC - http://github.com/necolas/normalize.css */
+
+/* =============================================================================
+   HTML5 display definitions
+   ========================================================================== */
+
+/*
+ * Corrects block display not defined in IE6/7/8/9 & FF3
+ */
+
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+nav,
+section,
+summary {
+    display: block;
+}
+
+/*
+ * Corrects inline-block display not defined in IE6/7/8/9 & FF3
+ */
+
+audio,
+canvas,
+video {
+    .inline-block;
+}
+
+/*
+ * Prevents modern browsers from displaying 'audio' without controls
+ * Remove excess height in iOS5 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
+ */
+
+[hidden] {
+    display: none;
+}
+
+
+/* =============================================================================
+   Base
+   ========================================================================== */
+
+/*
+ * 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/
+ */
+
+html {
+    font-size: 100%; /* 1 */
+    -webkit-text-size-adjust: 100%; /* 2 */
+    -ms-text-size-adjust: 100%; /* 2 */
+}
+
+/*
+ * Addresses font-family inconsistency between 'textarea' and other form elements.
+ */
+
+html,
+button,
+input,
+select,
+textarea {
+    font-family: @font-regular;
+}
+
+/*
+ * 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 {
+    outline: 0;
+}
+
+
+/* =============================================================================
+   Typography
+   ========================================================================== */
+
+small {
+    font-size: 75%;
+}
+
+/*
+ * Prevents sub and sup affecting line-height in all browsers
+ * gist.github.com/413930
+ */
+
+sub,
+sup {
+    font-size: 75%;
+    line-height: 0;
+    position: relative;
+    vertical-align: baseline;
+}
+
+sup {
+    top: -0.5em;
+}
+
+sub {
+    bottom: -0.25em;
+}
+
+
+/* =============================================================================
+   Lists
+   ========================================================================== */
+
+/*
+ * 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
+ */
+
+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
+ */
+
+svg:not(:root) {
+    overflow: hidden;
+}
+
+
+/* =============================================================================
+   Figures
+   ========================================================================== */
+
+/*
+ * Addresses margin not present in IE6/7/8/9, S5, O11
+ */
+
+figure {
+    margin: 0;
+}
+
+
+/* =============================================================================
+   Forms
+   ========================================================================== */
+
+/*
+ * Corrects margin displayed oddly in IE6/7
+ */
+
+form {
+    margin: 0;
+}
+
+/*
+ * Define consistent border, margin, and padding
+ */
+
+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
+ */
+
+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,
+select,
+textarea {
+    font-size: 100%; /* 1 */
+    margin: 0; /* 2 */
+    vertical-align: baseline; /* 3 */
+    *vertical-align: middle; /* 3 */
+}
+
+/*
+ * Addresses FF3/4 setting line-height on 'input' using !important in the UA stylesheet
+ */
+
+button,
+input {
+    line-height: normal; /* 1 */
+}
+
+/*
+ * 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
+ */
+
+button,
+input[type="button"],
+input[type="reset"],
+input[type="submit"] {
+    cursor: pointer; /* 1 */
+    -webkit-appearance: button; /* 2 */
+    *overflow: visible;  /* 3 */
+}
+
+/*
+ * Re-set default cursor for disabled elements
+ */
+
+button[disabled],
+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
+ */
+
+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
+ */
+
+textarea {
+    overflow: auto; /* 1 */
+    vertical-align: top; /* 2 */
+}
+
+
+/* =============================================================================
+   Tables
+   ========================================================================== */
+
+/*
+ * Remove most spacing between table cells
+ */
+
+table {
+    border-collapse: collapse;
+    border-spacing: 0;
+}
diff --git a/content/media/css/lldpd.1.blank.less b/content/media/css/lldpd.1.blank.less
new file mode 100644 (file)
index 0000000..cc15bbf
--- /dev/null
@@ -0,0 +1,34 @@
+/* -*- css -*- */
+
+html {
+    background: white;
+    height: 100%;
+    overflow-x: hidden;
+}
+
+body {
+    min-height: 100%;
+}
+
+p {
+    margin: (@line-height*1em) 0 0 0;
+    word-spacing: 0.25em;
+}
+
+a {
+    text-decoration: none;
+    color: @theme-color;
+    &:hover {
+       color: darken(@theme-color, 5%);
+    }
+}
+
+.github-forkme {
+    position: absolute;
+    top: 0;
+    right: 0;
+    border: 0;
+}
+@media only screen and (max-width: @page-width) {
+    .github-forkme { display: none; }
+}
diff --git a/content/media/css/lldpd.2.article.less b/content/media/css/lldpd.2.article.less
new file mode 100644 (file)
index 0000000..8460950
--- /dev/null
@@ -0,0 +1,101 @@
+/* -*- css -*- */
+
+body {
+    font: normal 100% @font-regular;   
+}
+article {
+    margin: 0 auto;
+    width: @page-width;
+}
+article > * {
+    margin: 0 2em;
+}
+@media only screen and (max-width: @page-width) {
+    article > * { margin: 0 1em; }
+    article {
+        width: auto;
+        margin: 0;
+    }
+}
+article {
+    padding-bottom: 2em;
+    line-height: @line-height;
+    color: #333;
+    .clearfix;
+    h1, h2, h3, h4, h5, h6 {
+       color: @theme-color;
+       font-family: @font-headings;
+       font-weight: bold;
+       page-break-after: avoid;
+       page-break-inside: avoid;
+       text-shadow: white 0 1px 2px, white 1px 1px 1px;
+    }
+    h1 {
+       .font-size(2.125);
+       margin: (@line-height/2.125*2em) 0 (@line-height/2.125em);
+        header & {
+            .font-size(2.625);
+           margin: (@line-height/2.625*2em) 0 (@line-height/2.625em);
+        }
+    }
+    h2 {
+       .font-size(1.625);
+       margin: (@line-height/1.625*2em) 0 (@line-height/1.625em);
+    }
+    h3 {
+       .font-size(1.312);
+       margin: (@line-height/1.312*2em) 0 (@line-height/1.312em);
+    }
+
+    code {
+        border-radius: 3px;
+        border: 1px solid lighten(@theme-color, 45%);
+        padding: 0 2px;
+    }
+
+    sup {
+       font-size: 0.7em;
+       vertical-align: baseline;
+       position: relative;
+       top: -0.7em;
+    }
+
+    abbr {
+       cursor: help;
+       border-bottom: 1px dashed lighten(@theme-color, 45%);
+    }
+
+    ul {
+        margin: 15px 0;
+        padding: 0;
+        list-style: none;
+        & li:before {
+            content: "\00BB \0020";
+            color: #888;
+            position: absolute;
+            margin-left: -19px;
+        }
+    }
+}
+
+.toc {
+    margin: (@line-height*1em) 0 (@line-height*1em) 3em;
+    padding: 0 2em;
+    max-width: 25em;
+    border-left: 1px dashed lighten(@theme-color, 30%);
+    ul {
+        margin: 0 0.5em;
+        list-style-type: decimal;
+        .font-size(0.875);
+        ul {
+            font-size: 1em;
+        }
+        li {
+            background: none;
+            padding-left: 1em;
+            &:before {
+                content: none;
+            }
+        }
+    }
+}
diff --git a/content/media/css/lldpd.3.code.less b/content/media/css/lldpd.3.code.less
new file mode 100644 (file)
index 0000000..ecce408
--- /dev/null
@@ -0,0 +1,93 @@
+/* -*- css -*- */
+pre, code, code .amp, pre .amp, .manpage {
+    font-family: @font-console;
+    font-style: normal;
+    line-height: 1.2;
+}
+.manpage {
+    white-space: pre;
+}
+.codehilite, .manpage {
+    border: 1px solid #E0E0E0;
+    margin: 0.4em auto (@line-height*1em);
+    padding: 0.4em 2%;
+    width: 94%;
+    overflow-x: auto;
+    pre { margin: 0; }
+    /* Small scrollbar */
+    &::-webkit-scrollbar {
+       width: 3px;
+       height: 3px;
+    }
+    &::-webkit-scrollbar-track-piece {
+       -webkit-border-radius: 3px;
+    }
+    &::-webkit-scrollbar-thumb:vertical, &::-webkit-scrollbar-thumb:horizontal {
+       height: 5px;
+       background-color: #666;
+       -webkit-border-radius: 3px;
+    }
+}
+.codehilite {
+    /* Output of HtmlFormatter(linenos=True,style='colorful').get_style_defs() */
+    .hll { background-color: #ffffcc }
+    .c { color: #808080 } /* Comment */
+    .k { color: #008000; font-weight: bold } /* Keyword */
+    .o { color: #303030 } /* Operator */
+    .cm { color: #808080 } /* Comment.Multiline */
+    .cp { color: #507090 } /* Comment.Preproc */
+    .c1 { color: #808080 } /* Comment.Single */
+    .cs { color: #cc0000; font-weight: bold } /* Comment.Special */
+    .gd { color: #A00000 } /* Generic.Deleted */
+    .ge { font-style: italic } /* Generic.Emph */
+    .gr { color: #FF0000 } /* Generic.Error */
+    .gh { color: #000080; font-weight: bold } /* Generic.Heading */
+    .gi { color: #00A000 } /* Generic.Inserted */
+    .go { color: #808080 } /* Generic.Output */
+    .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */
+    .gs { font-weight: bold } /* Generic.Strong */
+    .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
+    .gt { color: #0040D0 } /* Generic.Traceback */
+    .kc { color: #008000; font-weight: bold } /* Keyword.Constant */
+    .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
+    .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */
+    .kp { color: #003080; font-weight: bold } /* Keyword.Pseudo */
+    .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
+    .kt { color: #303090; font-weight: bold } /* Keyword.Type */
+    .m { color: #6000E0; font-weight: bold } /* Literal.Number */
+    .s { background-color: #fff0f0 } /* Literal.String */
+    .na { color: #0000C0 } /* Name.Attribute */
+    .nb { color: #007020 } /* Name.Builtin */
+    .nc { color: #B00060; font-weight: bold } /* Name.Class */
+    .no { color: #003060; font-weight: bold } /* Name.Constant */
+    .nd { color: #505050; font-weight: bold } /* Name.Decorator */
+    .ni { color: #800000; font-weight: bold } /* Name.Entity */
+    .ne { color: #F00000; font-weight: bold } /* Name.Exception */
+    .nf { color: #0060B0; font-weight: bold } /* Name.Function */
+    .nl { color: #907000; font-weight: bold } /* Name.Label */
+    .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */
+    .nt { color: #007000 } /* Name.Tag */
+    .nv { color: #906030 } /* Name.Variable */
+    .ow { color: #000000; font-weight: bold } /* Operator.Word */
+    .w { color: #bbbbbb } /* Text.Whitespace */
+    .mf { color: #6000E0; font-weight: bold } /* Literal.Number.Float */
+    .mh { color: #005080; font-weight: bold } /* Literal.Number.Hex */
+    .mi { color: #0000D0; font-weight: bold } /* Literal.Number.Integer */
+    .mo { color: #4000E0; font-weight: bold } /* Literal.Number.Oct */
+    .sb { background-color: #fff0f0 } /* Literal.String.Backtick */
+    .sc { color: #0040D0 } /* Literal.String.Char */
+    .sd { color: #D04020 } /* Literal.String.Doc */
+    .s2 { background-color: #fff0f0 } /* Literal.String.Double */
+    .se { color: #606060; font-weight: bold; background-color: #fff0f0 } /* Literal.String.Escape */
+    .sh { background-color: #fff0f0 } /* Literal.String.Heredoc */
+    .si { background-color: #e0e0e0 } /* Literal.String.Interpol */
+    .sx { color: #D02000; background-color: #fff0f0 } /* Literal.String.Other */
+    .sr { color: #000000; background-color: #fff0ff } /* Literal.String.Regex */
+    .s1 { background-color: #fff0f0 } /* Literal.String.Single */
+    .ss { color: #A06000 } /* Literal.String.Symbol */
+    .bp { color: #007020 } /* Name.Builtin.Pseudo */
+    .vc { color: #306090 } /* Name.Variable.Class */
+    .vg { color: #d07000; font-weight: bold } /* Name.Variable.Global */
+    .vi { color: #3030B0 } /* Name.Variable.Instance */
+    .il { color: #0000D0; font-weight: bold } /* Literal.Number.Integer.Long */
+}
diff --git a/content/media/css/lldpd.4.images.less b/content/media/css/lldpd.4.images.less
new file mode 100644 (file)
index 0000000..5c6fef8
--- /dev/null
@@ -0,0 +1,15 @@
+/* -*- css -*- */
+
+article {
+    /* Images */
+    img {
+       max-width: 100%;
+       width: auto; height: auto;
+       background-color: white;
+       padding: 1em;
+       vertical-align: bottom;
+       margin: 1em auto;
+       display: block;
+       interpolation-mode: bicubic;
+    }
+}
diff --git a/content/media/css/lldpd.5.menu.less b/content/media/css/lldpd.5.menu.less
new file mode 100644 (file)
index 0000000..e8b688c
--- /dev/null
@@ -0,0 +1,38 @@
+/* -*- css -*- */
+
+/* Short tagline */
+nav .tagline {
+    font-style: italic;
+    color: #333;
+    max-width: @article-width - 5em;
+    .font-size(1.312);
+    margin: (@line-height/1.312em) auto (@line-height/1.312em);
+    text-align: center;
+    em {
+        font-style: normal;
+    }
+}
+
+nav ul {
+    list-style-type: none;
+    text-align: center;
+    padding: 0;
+    li {
+        display: inline;
+    }
+    a {
+        .inline-block;
+    }
+    li:not(:first-child) {
+        &:before {
+            content: " // ";
+            padding: 0 1em;
+        }
+    }
+}
+
+nav {
+    padding: 2px 0 2px;
+    box-shadow: 0px 5px 10px #333;
+    background: url("../images/bright_squares.png") repeat;
+}
diff --git a/content/media/css/lldpd.99.typography.less b/content/media/css/lldpd.99.typography.less
new file mode 100644 (file)
index 0000000..c1b864b
--- /dev/null
@@ -0,0 +1,13 @@
+/* -*- css -*- */
+
+/* Beautiful ampersand */
+.amp {
+    font-family: 'Libre Baskerville', Baskerville,
+                 'Goudy Old Style','Goudy Bookletter 1911',
+                 Palatino,'Palatino Linotype','URW Palladio L','Cochin',
+                'Book Antiqua','Apple Chancery','Constantia',
+                @font-regular;
+    font-style: italic;
+    font-weight: normal;
+    line-height: 75%;
+}
diff --git a/content/media/css/lldpd.less b/content/media/css/lldpd.less
new file mode 100644 (file)
index 0000000..d993d1e
--- /dev/null
@@ -0,0 +1,9 @@
+---
+combine:
+   files: lldpd.*.less
+   remove: yes
+   where: bottom
+uses_template: true
+---
+
+@import "common";
diff --git a/content/media/images/bright_squares.png b/content/media/images/bright_squares.png
new file mode 100644 (file)
index 0000000..c75a05a
Binary files /dev/null and b/content/media/images/bright_squares.png differ
diff --git a/content/media/images/why.png b/content/media/images/why.png
new file mode 100644 (file)
index 0000000..bc9f129
Binary files /dev/null and b/content/media/images/why.png differ
diff --git a/content/media/js/modernizr.js b/content/media/js/modernizr.js
new file mode 100644 (file)
index 0000000..4fa7e33
--- /dev/null
@@ -0,0 +1,4 @@
+/* Modernizr 2.6.2 (Custom Build) | MIT & BSD
+ * Build: http://modernizr.com/download/#-shiv-cssclasses-load
+ */
+;window.Modernizr=function(a,b,c){function u(a){j.cssText=a}function v(a,b){return u(prefixes.join(a+";")+(b||""))}function w(a,b){return typeof a===b}function x(a,b){return!!~(""+a).indexOf(b)}function y(a,b,d){for(var e in a){var f=b[a[e]];if(f!==c)return d===!1?a[e]:w(f,"function")?f.bind(d||b):f}return!1}var d="2.6.2",e={},f=!0,g=b.documentElement,h="modernizr",i=b.createElement(h),j=i.style,k,l={}.toString,m={},n={},o={},p=[],q=p.slice,r,s={}.hasOwnProperty,t;!w(s,"undefined")&&!w(s.call,"undefined")?t=function(a,b){return s.call(a,b)}:t=function(a,b){return b in a&&w(a.constructor.prototype[b],"undefined")},Function.prototype.bind||(Function.prototype.bind=function(b){var c=this;if(typeof c!="function")throw new TypeError;var d=q.call(arguments,1),e=function(){if(this instanceof e){var a=function(){};a.prototype=c.prototype;var f=new a,g=c.apply(f,d.concat(q.call(arguments)));return Object(g)===g?g:f}return c.apply(b,d.concat(q.call(arguments)))};return e});for(var z in m)t(m,z)&&(r=z.toLowerCase(),e[r]=m[z](),p.push((e[r]?"":"no-")+r));return e.addTest=function(a,b){if(typeof a=="object")for(var d in a)t(a,d)&&e.addTest(d,a[d]);else{a=a.toLowerCase();if(e[a]!==c)return e;b=typeof b=="function"?b():b,typeof f!="undefined"&&f&&(g.className+=" "+(b?"":"no-")+a),e[a]=b}return e},u(""),i=k=null,function(a,b){function k(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x<style>"+b+"</style>",d.insertBefore(c.lastChild,d.firstChild)}function l(){var a=r.elements;return typeof a=="string"?a.split(" "):a}function m(a){var b=i[a[g]];return b||(b={},h++,a[g]=h,i[h]=b),b}function n(a,c,f){c||(c=b);if(j)return c.createElement(a);f||(f=m(c));var g;return f.cache[a]?g=f.cache[a].cloneNode():e.test(a)?g=(f.cache[a]=f.createElem(a)).cloneNode():g=f.createElem(a),g.canHaveChildren&&!d.test(a)?f.frag.appendChild(g):g}function o(a,c){a||(a=b);if(j)return a.createDocumentFragment();c=c||m(a);var d=c.frag.cloneNode(),e=0,f=l(),g=f.length;for(;e<g;e++)d.createElement(f[e]);return d}function p(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return r.shivMethods?n(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+l().join().replace(/\w+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(r,b.frag)}function q(a){a||(a=b);var c=m(a);return r.shivCSS&&!f&&!c.hasCSS&&(c.hasCSS=!!k(a,"article,aside,figcaption,figure,footer,header,hgroup,nav,section{display:block}mark{background:#FF0;color:#000}")),j||p(a,c),a}var c=a.html5||{},d=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,e=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,f,g="_html5shiv",h=0,i={},j;(function(){try{var a=b.createElement("a");a.innerHTML="<xyz></xyz>",f="hidden"in a,j=a.childNodes.length==1||function(){b.createElement("a");var a=b.createDocumentFragment();return typeof a.cloneNode=="undefined"||typeof a.createDocumentFragment=="undefined"||typeof a.createElement=="undefined"}()}catch(c){f=!0,j=!0}})();var r={elements:c.elements||"abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video",shivCSS:c.shivCSS!==!1,supportsUnknownElements:j,shivMethods:c.shivMethods!==!1,type:"default",shivDocument:q,createElement:n,createDocumentFragment:o};a.html5=r,q(b)}(this,b),e._version=d,g.className=g.className.replace(/(^|\s)no-js(\s|$)/,"$1$2")+(f?" js "+p.join(" "):""),e}(this,this.document),function(a,b,c){function d(a){return"[object Function]"==o.call(a)}function e(a){return"string"==typeof a}function f(){}function g(a){return!a||"loaded"==a||"complete"==a||"uninitialized"==a}function h(){var a=p.shift();q=1,a?a.t?m(function(){("c"==a.t?B.injectCss:B.injectJs)(a.s,0,a.a,a.x,a.e,1)},0):(a(),h()):q=0}function i(a,c,d,e,f,i,j){function k(b){if(!o&&g(l.readyState)&&(u.r=o=1,!q&&h(),l.onload=l.onreadystatechange=null,b)){"img"!=a&&m(function(){t.removeChild(l)},50);for(var d in y[c])y[c].hasOwnProperty(d)&&y[c][d].onload()}}var j=j||B.errorTimeout,l=b.createElement(a),o=0,r=0,u={t:d,s:c,e:f,a:i,x:j};1===y[c]&&(r=1,y[c]=[]),"object"==a?l.data=c:(l.src=c,l.type=a),l.width=l.height="0",l.onerror=l.onload=l.onreadystatechange=function(){k.call(this,r)},p.splice(e,0,u),"img"!=a&&(r||2===y[c]?(t.insertBefore(l,s?null:n),m(k,j)):y[c].push(l))}function j(a,b,c,d,f){return q=0,b=b||"j",e(a)?i("c"==b?v:u,a,b,this.i++,c,d,f):(p.splice(this.i++,0,a),1==p.length&&h()),this}function k(){var a=B;return a.loader={load:j,i:0},a}var l=b.documentElement,m=a.setTimeout,n=b.getElementsByTagName("script")[0],o={}.toString,p=[],q=0,r="MozAppearance"in l.style,s=r&&!!b.createRange().compareNode,t=s?l:n.parentNode,l=a.opera&&"[object Opera]"==o.call(a.opera),l=!!b.attachEvent&&!l,u=r?"object":l?"script":"img",v=l?"script":u,w=Array.isArray||function(a){return"[object Array]"==o.call(a)},x=[],y={},z={timeout:function(a,b){return b.length&&(a.timeout=b[0]),a}},A,B;B=function(a){function b(a){var a=a.split("!"),b=x.length,c=a.pop(),d=a.length,c={url:c,origUrl:c,prefixes:a},e,f,g;for(f=0;f<d;f++)g=a[f].split("="),(e=z[g.shift()])&&(c=e(c,g));for(f=0;f<b;f++)c=x[f](c);return c}function g(a,e,f,g,h){var i=b(a),j=i.autoCallback;i.url.split(".").pop().split("?").shift(),i.bypass||(e&&(e=d(e)?e:e[a]||e[g]||e[a.split("/").pop().split("?")[0]]),i.instead?i.instead(a,e,f,g,h):(y[i.url]?i.noexec=!0:y[i.url]=1,f.load(i.url,i.forceCSS||!i.forceJS&&"css"==i.url.split(".").pop().split("?").shift()?"c":c,i.noexec,i.attrs,i.timeout),(d(e)||d(j))&&f.load(function(){k(),e&&e(i.origUrl,h,g),j&&j(i.origUrl,h,g),y[i.url]=2})))}function h(a,b){function c(a,c){if(a){if(e(a))c||(j=function(){var a=[].slice.call(arguments);k.apply(this,a),l()}),g(a,j,b,0,h);else if(Object(a)===a)for(n in m=function(){var b=0,c;for(c in a)a.hasOwnProperty(c)&&b++;return b}(),a)a.hasOwnProperty(n)&&(!c&&!--m&&(d(j)?j=function(){var a=[].slice.call(arguments);k.apply(this,a),l()}:j[n]=function(a){return function(){var b=[].slice.call(arguments);a&&a.apply(this,b),l()}}(k[n])),g(a[n],j,b,n,h))}else!c&&l()}var h=!!a.test,i=a.load||a.both,j=a.callback||f,k=j,l=a.complete||f,m,n;c(h?a.yep:a.nope,!!i),i&&c(i)}var i,j,l=this.yepnope.loader;if(e(a))g(a,0,l,0);else if(w(a))for(i=0;i<a.length;i++)j=a[i],e(j)?g(j,0,l,0):w(j)?B(j):Object(j)===j&&h(j,l);else Object(a)===a&&h(a,l)},B.addPrefix=function(a,b){z[a]=b},B.addFilter=function(a){x.push(a)},B.errorTimeout=1e4,null==b.readyState&&b.addEventListener&&(b.readyState="loading",b.addEventListener("DOMContentLoaded",A=function(){b.removeEventListener("DOMContentLoaded",A,0),b.readyState="complete"},0)),a.yepnope=k(),a.yepnope.executeStack=h,a.yepnope.injectJs=function(a,c,d,e,i,j){var k=b.createElement("script"),l,o,e=e||B.errorTimeout;k.src=a;for(o in d)k.setAttribute(o,d[o]);c=j?h:c||f,k.onreadystatechange=k.onload=function(){!l&&g(k.readyState)&&(l=1,c(),k.onload=k.onreadystatechange=null)},m(function(){l||(l=1,c(1))},e),i?k.onload():n.parentNode.insertBefore(k,n)},a.yepnope.injectCss=function(a,c,d,e,g,i){var e=b.createElement("link"),j,c=i?h:c||f;e.href=a,e.rel="stylesheet",e.type="text/css";for(j in d)e.setAttribute(j,d[j]);g||(n.parentNode.insertBefore(e,n),m(c,0))}}(this,document),Modernizr.load=function(){yepnope.apply(window,[].slice.call(arguments,0))};
diff --git a/content/media/js/mp.js b/content/media/js/mp.js
new file mode 100644 (file)
index 0000000..ad3aca0
--- /dev/null
@@ -0,0 +1,8 @@
+---
+combine:
+    files:
+      - modernizr.js
+      - prefixfree.js
+    where: top
+    remove: yes
+---
diff --git a/content/media/js/prefixfree.js b/content/media/js/prefixfree.js
new file mode 100644 (file)
index 0000000..13d9366
--- /dev/null
@@ -0,0 +1,17 @@
+/**
+ * StyleFix 1.0.3 & PrefixFree 1.0.7
+ * @author Lea Verou
+ * MIT license
+ */
+(function(){function j(a,c){return[].slice.call((c||document).querySelectorAll(a))}if(window.addEventListener){var g=window.StyleFix={link:function(a){try{if("stylesheet"!==a.rel||a.hasAttribute("data-noprefix"))return}catch(c){return}var i=a.href||a.getAttribute("data-href"),f=i.replace(/[^\/]+$/,""),j=(/^[a-z]{3,10}:/.exec(f)||[""])[0],k=(/^[a-z]{3,10}:\/\/[^\/]+/.exec(f)||[""])[0],h=/^([^?]*)\??/.exec(i)[1],n=a.parentNode,e=new XMLHttpRequest,b;e.onreadystatechange=function(){4===e.readyState&&
+b()};b=function(){var c=e.responseText;if(c&&a.parentNode&&(!e.status||400>e.status||600<e.status)){c=g.fix(c,!0,a);if(f)var c=c.replace(/url\(\s*?((?:"|')?)(.+?)\1\s*?\)/gi,function(a,c,b){return/^([a-z]{3,10}:|#)/i.test(b)?a:/^\/\//.test(b)?'url("'+j+b+'")':/^\//.test(b)?'url("'+k+b+'")':/^\?/.test(b)?'url("'+h+b+'")':'url("'+f+b+'")'}),b=f.replace(/([\\\^\$*+[\]?{}.=!:(|)])/g,"\\$1"),c=c.replace(RegExp("\\b(behavior:\\s*?url\\('?\"?)"+b,"gi"),"$1");b=document.createElement("style");b.textContent=
+c;b.media=a.media;b.disabled=a.disabled;b.setAttribute("data-href",a.getAttribute("href"));n.insertBefore(b,a);n.removeChild(a);b.media=a.media}};try{e.open("GET",i),e.send(null)}catch(r){"undefined"!=typeof XDomainRequest&&(e=new XDomainRequest,e.onerror=e.onprogress=function(){},e.onload=b,e.open("GET",i),e.send(null))}a.setAttribute("data-inprogress","")},styleElement:function(a){if(!a.hasAttribute("data-noprefix")){var c=a.disabled;a.textContent=g.fix(a.textContent,!0,a);a.disabled=c}},styleAttribute:function(a){var c=
+a.getAttribute("style"),c=g.fix(c,!1,a);a.setAttribute("style",c)},process:function(){j('link[rel="stylesheet"]:not([data-inprogress])').forEach(StyleFix.link);j("style").forEach(StyleFix.styleElement);j("[style]").forEach(StyleFix.styleAttribute)},register:function(a,c){(g.fixers=g.fixers||[]).splice(void 0===c?g.fixers.length:c,0,a)},fix:function(a,c,i){for(var f=0;f<g.fixers.length;f++)a=g.fixers[f](a,c,i)||a;return a},camelCase:function(a){return a.replace(/-([a-z])/g,function(a,g){return g.toUpperCase()}).replace("-",
+"")},deCamelCase:function(a){return a.replace(/[A-Z]/g,function(a){return"-"+a.toLowerCase()})}};setTimeout(function(){j('link[rel="stylesheet"]').forEach(StyleFix.link)},10);document.addEventListener("DOMContentLoaded",StyleFix.process,!1)}})();
+(function(j){function g(d,b,c,e,f){d=a[d];d.length&&(d=RegExp(b+"("+d.join("|")+")"+c,"gi"),f=f.replace(d,e));return f}if(window.StyleFix&&window.getComputedStyle){var a=window.PrefixFree={prefixCSS:function(d,b){var c=a.prefix;-1<a.functions.indexOf("linear-gradient")&&(d=d.replace(/(\s|:|,)(repeating-)?linear-gradient\(\s*(-?\d*\.?\d*)deg/ig,function(a,d,b,c){return d+(b||"")+"linear-gradient("+(90-c)+"deg"}));d=g("functions","(\\s|:|,)","\\s*\\(","$1"+c+"$2(",d);d=g("keywords","(\\s|:)","(\\s|;|\\}|$)",
+"$1"+c+"$2$3",d);d=g("properties","(^|\\{|\\s|;)","\\s*:","$1"+c+"$2:",d);if(a.properties.length)var e=RegExp("\\b("+a.properties.join("|")+")(?!:)","gi"),d=g("valueProperties","\\b",":(.+?);",function(a){return a.replace(e,c+"$1")},d);b&&(d=g("selectors","","\\b",a.prefixSelector,d),d=g("atrules","@","\\b","@"+c+"$1",d));d=d.replace(RegExp("-"+c,"g"),"-");return d=d.replace(/-\*-(?=[a-z]+)/gi,a.prefix)},property:function(d){return(a.properties.indexOf(d)?a.prefix:"")+d},value:function(d){d=g("functions",
+"(^|\\s|,)","\\s*\\(","$1"+a.prefix+"$2(",d);return d=g("keywords","(^|\\s)","(\\s|$)","$1"+a.prefix+"$2$3",d)},prefixSelector:function(d){return d.replace(/^:{1,2}/,function(d){return d+a.prefix})},prefixProperty:function(d,b){var c=a.prefix+d;return b?StyleFix.camelCase(c):c}},c={},i=[],f=getComputedStyle(document.documentElement,null),p=document.createElement("div").style,k=function(a){if("-"===a.charAt(0)){i.push(a);var a=a.split("-"),b=a[1];for(c[b]=++c[b]||1;3<a.length;)a.pop(),b=a.join("-"),
+StyleFix.camelCase(b)in p&&-1===i.indexOf(b)&&i.push(b)}};if(0<f.length)for(var h=0;h<f.length;h++)k(f[h]);else for(var n in f)k(StyleFix.deCamelCase(n));var h=0,e,b;for(b in c)f=c[b],h<f&&(e=b,h=f);a.prefix="-"+e+"-";a.Prefix=StyleFix.camelCase(a.prefix);a.properties=[];for(h=0;h<i.length;h++)n=i[h],0===n.indexOf(a.prefix)&&(e=n.slice(a.prefix.length),StyleFix.camelCase(e)in p||a.properties.push(e));"Ms"==a.Prefix&&(!("transform"in p)&&!("MsTransform"in p)&&"msTransform"in p)&&a.properties.push("transform",
+"transform-origin");a.properties.sort();e=function(a,b){r[b]="";r[b]=a;return!!r[b]};b={"linear-gradient":{property:"backgroundImage",params:"red, teal"},calc:{property:"width",params:"1px + 5%"},element:{property:"backgroundImage",params:"#foo"},"cross-fade":{property:"backgroundImage",params:"url(a.png), url(b.png), 50%"}};b["repeating-linear-gradient"]=b["repeating-radial-gradient"]=b["radial-gradient"]=b["linear-gradient"];h={initial:"color","zoom-in":"cursor","zoom-out":"cursor",box:"display",
+flexbox:"display","inline-flexbox":"display",flex:"display","inline-flex":"display"};a.functions=[];a.keywords=[];var r=document.createElement("div").style,l;for(l in b)k=b[l],f=k.property,k=l+"("+k.params+")",!e(k,f)&&e(a.prefix+k,f)&&a.functions.push(l);for(var m in h)f=h[m],!e(m,f)&&e(a.prefix+m,f)&&a.keywords.push(m);l=function(a){s.textContent=a+"{}";return!!s.sheet.cssRules.length};m={":read-only":null,":read-write":null,":any-link":null,"::selection":null};e={keyframes:"name",viewport:null,
+document:'regexp(".")'};a.selectors=[];a.atrules=[];var s=j.appendChild(document.createElement("style")),q;for(q in m)b=q+(m[q]?"("+m[q]+")":""),!l(b)&&l(a.prefixSelector(b))&&a.selectors.push(q);for(var t in e)b=t+" "+(e[t]||""),!l("@"+b)&&l("@"+a.prefix+b)&&a.atrules.push(t);j.removeChild(s);a.valueProperties=["transition","transition-property"];j.className+=" "+a.prefix;StyleFix.register(a.prefixCSS)}})(document.documentElement);
diff --git a/content/media/meta.yaml b/content/media/meta.yaml
new file mode 100644 (file)
index 0000000..c5b1f1a
--- /dev/null
@@ -0,0 +1,2 @@
+extends: false
+uses_template: false
diff --git a/content/usage.html b/content/usage.html
new file mode 100644 (file)
index 0000000..06d4bbf
--- /dev/null
@@ -0,0 +1,27 @@
+---
+title: Usage
+---
+
+`lldpd` comes with two parts: a daemon (`lldpd`) sending and receiving
+LLDP advertisements and a client (`lldpcli`) to query and configure
+the daemon. Both parts are documented in their manual pages:
+
+[TOC]
+
+# lldpd.8
+
+Here is the manual page for `lldpd` (version {{ resource.meta.latestversion }}):
+
+[[manpage:src/daemon/lldpd.8]]
+
+# lldpcli.8
+
+Here is the manual page for `lldpcli` and `lldpctl` (version 
+{{ resource.meta.latestversion }}):
+
+[[manpage:src/client/lldpcli.8]]
+
+{# Local Variables:      #}
+{# mode: markdown        #}
+{# indent-tabs-mode: nil #}
+{# End:                  #}
diff --git a/extensions/__init__.py b/extensions/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/extensions/combine.py b/extensions/combine.py
new file mode 100644 (file)
index 0000000..9356396
--- /dev/null
@@ -0,0 +1,16 @@
+# -*- coding: utf-8 -*-
+"""
+Modified combine plugin.
+
+This plugin is like the `combine` plugin except it combines resources
+in the "complete" step.
+"""
+
+from hyde.ext.plugins.combine import CombinePlugin as OrigCombinePlugin
+
+class CombinePlugin(OrigCombinePlugin):
+    def text_resource_complete(self, resource, text):
+        return super(CombinePlugin, self).begin_text_resource(resource, text)
+
+    def begin_text_resource(self, resource, text):
+        pass
diff --git a/extensions/text.py b/extensions/text.py
new file mode 100644 (file)
index 0000000..e723bd4
--- /dev/null
@@ -0,0 +1,59 @@
+# -*- coding: utf-8 -*-
+"""
+Textlinks plugin
+"""
+import re
+import subprocess
+import cgi
+
+from hyde.plugin import Plugin
+
+class IncludeManpagePlugin(Plugin):
+    """
+    Include the content of a manual page.
+
+    The syntax is:
+
+    [[manpage:path/to/manualpage#gitversion]]
+    """
+    def __init__(self, site):
+        super(IncludeManpagePlugin, self).__init__(site)
+
+    def begin_text_resource(self, resource, text):
+        if not resource.uses_template:
+            return text
+
+        def replace_content(match):
+            path = match.group(1)
+            version = resource.meta.latestversion
+
+            # execute git show version:path | MAN_KEEP_FORMATTING=1 man -l -
+            git = subprocess.Popen(["git", "show", "%s:%s" % (version, path)], stdout=subprocess.PIPE)
+            man = subprocess.Popen(["man", "-l", "-"], stdin=git.stdout, stdout=subprocess.PIPE,
+                                   env={"MAN_KEEP_FORMATTING": "1"})
+            git.stdout.close()
+            output = man.communicate()[0]
+
+            return "<div class='manpage'>%s</div>" % self.man(output)
+
+        link = re.compile(r'\[\[manpage:([^\]]+)\]\]', re.UNICODE|re.MULTILINE)
+        text = link.sub(replace_content, text)
+        return text
+
+    def man(self, output):
+        # Escape HTML sequences
+        output = cgi.escape(output)
+
+        # Add <br> for new lines
+        output = output.replace("\n", "<br>")
+
+        # Dots
+        output = re.sub('\\+\b\\+\bo\bo', '&raquo;', output)
+
+        # Bold/Italic
+        output = re.sub('(.)\b\\1', r'<b>\1</b>', output)
+        output = re.sub(r'</b><b>', '', output)
+        output = re.sub('_\b(.)', r'<u>\1</u>', output)
+        output = re.sub(r'\</u\>\<u\>', '', output)
+
+        return output.decode('ascii', errors='replace')
diff --git a/layout/base.j2 b/layout/base.j2
new file mode 100644 (file)
index 0000000..a6853d1
--- /dev/null
@@ -0,0 +1,40 @@
+<!doctype html>
+<html class="no-js" lang="en">
+<head>
+  <meta charset="utf-8">
+  {% if resource.meta.title %}
+  <title>lldpd » implementation of IEEE 802.1ab | {{ resource.meta.title }}</title>
+  {% else %}
+  <title>lldpd » implementation of IEEE 802.1ab (LLDP)</title>
+  {% endif %}
+  <meta name="keywords" content="lldpd, 802.1ab, network, discovery, cdp, edp, snmp">
+  <meta name="viewport" content="width=device-width,initial-scale=1.0">
+  <link rel="canonical" href="{{base}}{{ content_url(resource.url) }}">
+  <link rel="stylesheet" href="http://fonts.googleapis.com/css?family=Inconsolata|Libre+Baskerville:400,400italic,700" type="text/css">
+  <link rel="stylesheet" href="{{ media_url('css/lldpd.css') }}" type="text/css">
+  <script src="{{ media_url('js/mp.js') }}"></script>
+</head>
+<body>
+
+  <a class="github-forkme" href="https://github.com/vincentbernat/lldpd">
+    <img src="https://s3.amazonaws.com/github/ribbons/forkme_right_green_007200.png"
+         alt="Fork me on GitHub">
+  </a>
+
+  {% include "menu.j2" %}
+  <article>
+    <div role="main">
+      {% if resource.meta.title %}
+      <header>
+        <h1>{{ resource.meta.title }}</h1>
+      </header>
+      {% endif %}
+
+      {% filter markdown|typogrify -%}
+      {% block article -%}{%- endblock %}
+      {%- endfilter %}
+    </div>
+  </article>
+
+</body>
+</html>
diff --git a/layout/menu.j2 b/layout/menu.j2
new file mode 100644 (file)
index 0000000..c61ddc9
--- /dev/null
@@ -0,0 +1,19 @@
+<nav>
+
+  <p class="tagline">
+    <em>lldpd</em> is a 802.1ab implementation (LLDP) to
+    help you locate neighbors of all your equipments.
+  </p>
+
+  <ul>
+    <li><a href="index.html">Overview</a></li>
+    <li><a href="features.html">Features</a></li>
+    <li><a href="installation.html">Installation</a></li>
+    <li><a href="usage.html">Usage</a></li>
+  </ul>
+</nav>
+
+{# Local Variables:      #}
+{# mode: html            #}
+{# indent-tabs-mode: nil #}
+{# End:                  #}
diff --git a/site.yaml b/site.yaml
new file mode 100644 (file)
index 0000000..8e63a2b
--- /dev/null
+++ b/site.yaml
@@ -0,0 +1,33 @@
+mode: development
+media_root: media
+media_url: /media
+base_url: /
+plugins:
+  - hyde.ext.plugins.meta.MetaPlugin
+  - extensions.combine.CombinePlugin
+  - hyde.ext.plugins.auto_extend.AutoExtendPlugin
+  - hyde.ext.plugins.less.LessCSSPlugin
+  - extensions.text.IncludeManpagePlugin
+  - hyde.ext.plugins.textlinks.TextlinksPlugin
+  - hyde.ext.plugins.images.ImageSizerPlugin
+  - hyde.ext.plugins.optipng.OptiPNGPlugin
+context:
+  data:
+    base: https://vincentbernat.github.com/lldpd/
+meta:
+  latestversion: "0.7.0"
+  nodemeta: meta.yaml
+  extends: base.j2
+  default_block: article
+less:
+  app: /usr/bin/lessc
+optipng:
+  app: /usr/bin/optipng
+  args:
+    quiet: ""
+markdown:
+  extensions:
+    - codehilite
+    - extra
+    - toc
+  output_format: html