diff --git a/client/js/dpaste.js b/client/js/dpaste.js
new file mode 100644
index 0000000..cbb18a0
--- /dev/null
+++ b/client/js/dpaste.js
@@ -0,0 +1,100 @@
+/*jshint strict:false */
+
+if (typeof console === "undefined" || typeof console.log === "undefined") {
+ console = {};
+ console.log = function () { };
+}
+
+// -----------------------------------------------------------------------------
+// Add data-platform to the body tag to show platform related shortcuts
+// -----------------------------------------------------------------------------
+const isWindows = navigator.appVersion.indexOf("Win") !== -1;
+document.body.dataset.platform = isWindows ? 'win' : 'mac';
+
+// -----------------------------------------------------------------------------
+// Autofocus the content field on the homepage
+// -----------------------------------------------------------------------------
+const af = document.querySelector(".autofocus textarea");
+if (af !== null) {
+ af.focus();
+}
+
+// -----------------------------------------------------------------------------
+// Cmd+Enter or Ctrl+Enter submits the form
+// -----------------------------------------------------------------------------
+document.body.onkeydown = function(e) {
+ const metaKey = isWindows ? e.ctrlKey : e.metaKey;
+ const form = document.querySelector(".snippet-form");
+
+ if (form && e.keyCode === 13 && metaKey) {
+ form.submit();
+ return false;
+ }
+};
+
+
+// -----------------------------------------------------------------------------
+// Toggle Wordwrap
+// -----------------------------------------------------------------------------
+const wordwrapCheckbox = document.getElementById('wordwrap');
+const snippetDiv = document.querySelector('.snippet-code');
+
+function toggleWordwrap() {
+ if (wordwrapCheckbox.checked) {
+ snippetDiv.classList.add('wordwrap');
+ } else {
+ snippetDiv.classList.remove('wordwrap');
+ }
+}
+
+if (wordwrapCheckbox && snippetDiv) {
+ toggleWordwrap();
+ wordwrapCheckbox.onchange = toggleWordwrap;
+}
+
+// -----------------------------------------------------------------------------
+// Line Highlighting
+// -----------------------------------------------------------------------------
+const curLine = document.location.hash;
+if (curLine.startsWith('#L')) {
+ const hashlist = curLine.substring(2).split(',');
+ if (hashlist.length > 0 && hashlist[0] !== '') {
+ hashlist.forEach(function(el) {
+ const line = document.getElementById(`l${el}`);
+ if (line) {
+ line.classList.add('marked');
+ }
+ });
+ }
+}
+
+let lines = document.querySelectorAll('.snippet-code li');
+lines.forEach(function(el) {
+ el.onclick = function() {
+ el.classList.toggle('marked');
+ let hash = 'L';
+ let marked = document.querySelectorAll('.snippet-code li.marked');
+ marked.forEach(function(line) {
+ if (hash !== 'L') {
+ hash += ',';
+ }
+ hash += line.getAttribute('id').substring(1);
+ });
+ window.location.hash = hash;
+ };
+});
+
+// -----------------------------------------------------------------------------
+// Copy URL to Clipboard
+// -----------------------------------------------------------------------------
+const clipboardLink = document.getElementById('copyToClipboard');
+const copyToClipboardField = document.getElementById('copyToClipboardField');
+
+if (clipboardLink && copyToClipboardField) {
+ clipboardLink.onclick = function(e) {
+ e.preventDefault();
+ copyToClipboardField.select();
+ document.execCommand("Copy");
+ console.log('Copied URL to clipboard:', copyToClipboardField.value);
+ };
+}
diff --git a/client/scss/_globals.scss b/client/scss/_globals.scss
new file mode 100644
index 0000000..fb69123
--- /dev/null
+++ b/client/scss/_globals.scss
@@ -0,0 +1,47 @@
+body {
+ min-width: 800px; // FIXME: MOBILE
+
+ background-color: $bgColor;
+ font-family: $baseFont;
+ font-weight: $baseFontRegular;
+}
+
+body[data-code-snippet] { background-color: $codeBgColor; }
+
+body[data-platform=win] .platform-mac { display: none; }
+body[data-platform=mac] .platform-win { display: none; }
+
+
+.btn {
+ padding: 6px 0;
+ position: relative;
+
+ display: inline-block;
+
+ color: $btnTextColor;
+ background-color: $btnBgColor;
+
+ border: 1px solid $btnBorderColor;
+ border-radius: 3px;
+
+ font-size: 13px;
+ font-weight: $baseFontDemiBold;
+
+ text-decoration: none;
+ text-align: center;
+
+ cursor: pointer;
+
+ .sep {
+ @include separator();
+ }
+
+ &:hover {
+ text-decoration: none;
+ background-color: darken($btnBgColor, 5%);
+ }
+
+ &:active {
+ top: 1px;
+ }
+}
diff --git a/client/scss/_mixins.scss b/client/scss/_mixins.scss
new file mode 100644
index 0000000..bfd64d7
--- /dev/null
+++ b/client/scss/_mixins.scss
@@ -0,0 +1,7 @@
+
+// Vertical dotted separtor
+@mixin separator($color: white, $margin: 4px) {
+ width: 0;
+ border-right: 2px dotted $color;
+ margin: 0 ($margin+2px) 0 $margin;
+}
diff --git a/client/scss/_reset.scss b/client/scss/_reset.scss
new file mode 100644
index 0000000..199fb33
--- /dev/null
+++ b/client/scss/_reset.scss
@@ -0,0 +1,40 @@
+/* http://meyerweb.com/eric/tools/css/reset/
+ v2.0 | 20110126
+ License: none (public domain)
+*/
+
+html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video {
+ margin: 0;
+ padding: 0;
+ border: 0;
+ font-size: 100%;
+ font: inherit;
+ vertical-align: baseline; }
+
+/* HTML5 display-role reset for older browsers */
+
+article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section {
+ display: block; }
+
+body {
+ line-height: 1; }
+
+ol, ul {
+ list-style: none; }
+
+blockquote, q {
+ quotes: none; }
+
+blockquote {
+ &:before, &:after {
+ content: '';
+ content: none; } }
+
+q {
+ &:before, &:after {
+ content: '';
+ content: none; } }
+
+table {
+ border-collapse: collapse;
+border-spacing: 0; }
diff --git a/client/scss/components/_article.scss b/client/scss/components/_article.scss
new file mode 100644
index 0000000..4c8d688
--- /dev/null
+++ b/client/scss/components/_article.scss
@@ -0,0 +1,42 @@
+/*
+
+ Generic Content pages such as about or 404 error pages.
+
+ */
+
+article {
+ padding: 40px $boxPadding;
+
+ font-size: 16px;
+ font-weight: $baseFontRegular;
+ line-height: 24px;
+
+ max-width: 520px;
+
+ color: $textColor;
+
+ h2 {
+ font-size: 28px;
+ line-height: 36px;
+ margin: 0 0 30px 0;
+ }
+
+ p {
+ margin: 30px 0;
+ }
+
+ strong, b {
+ font-weight: $baseFontDemiBold;
+ }
+
+ a:link, a:visited {
+ color: $linkColor;
+ text-decoration: underline;
+ text-decoration-color: lighten($linkColor, 30%);
+ }
+
+ a:hover, a:active {
+ color: $hoverColor;
+ text-decoration: underline;
+ }
+}
diff --git a/dpaste/static/dpaste/_pygments.scss b/client/scss/components/_code.scss
similarity index 73%
rename from dpaste/static/dpaste/_pygments.scss
rename to client/scss/components/_code.scss
index 8a3b219..76f4b3a 100644
--- a/dpaste/static/dpaste/_pygments.scss
+++ b/client/scss/components/_code.scss
@@ -1,8 +1,49 @@
-// -----------------------------------------------------------------------------
-// Pygments Theme
.snippet-code {
+ font-family: $codeFont;
+ font-size: 13px;
+ font-weight: 300;
+ line-height: 20px;
+ //overflow: auto;
+ color: $codeTextColor;
+ background-color: $codeBgColor;
+ padding: 20px $boxPadding;
+
+ &.wordwrap {
+ overflow: auto;
+ li { white-space: pre-wrap !important; }
+ }
+
+ ol {
+ position: relative;
+ list-style: none;
+ counter-reset: lineNumberCounter;
+
+ li {
+ white-space: pre;
+ padding-left: 50px;
+
+ &:before {
+ color: $codeLineNumberColor;
+ counter-increment: lineNumberCounter;
+ content: counter(lineNumberCounter);
+ text-align: right;
+
+ width: 30px;
+ position: absolute;
+ display: inline-block;
+ left: 0px;
+ }
+ }
+
+ li.marked {
+ background-color: $markerBgColor;
+ &:before{ color: $markerLineNumberColor; }
+ }
+ }
+
+ // Pygments
.gd { background-color: rgba(226, 12, 19, .3); color: #fff; display: block; }
.gi { background-color: rgba(23, 189, 10, .2); color: #fff; display: block; }
@@ -67,3 +108,20 @@
.il { color: #ae81ff } /* Literal.Number.Integer.Long */
}
+
+
+.snippet-text {
+ background: $bgColor;
+ padding: 20px $boxPadding;
+
+ color: $textColor;
+
+ font-family: $textFont;
+ font-weight: $baseFontRegular;
+ font-size: 16px;
+ line-height: 22px;
+
+ & > div {
+ max-width: 540px;
+ }
+}
diff --git a/client/scss/components/_form.scss b/client/scss/components/_form.scss
new file mode 100644
index 0000000..54b277d
--- /dev/null
+++ b/client/scss/components/_form.scss
@@ -0,0 +1,86 @@
+@mixin codeTextArea {
+ color: #7D7D7D;
+ font-family: $codeFont;
+ font-size: 12px;
+ line-height: 17px;
+}
+
+
+.snippet-form {
+ background-color: $bgColor;
+
+ select {
+ -moz-appearance: none;
+ -webkit-appearance: none;
+
+ padding: 5px 7px;
+ margin-right: 15px;
+ min-width: 160px;
+
+ color: $selectTextColor;
+ background-color: $selectBgColor;
+
+ border: 1px solid $selectBorderColor;
+ border-radius: 3px;
+
+ font-family: $baseFont;
+ font-weight: $baseFontRegular;
+ font-size: 14px;
+
+ cursor: pointer;
+
+ // Triangle
+ background-image:
+ linear-gradient(45deg, transparent 50%, $selectTriangleColor 50%),
+ linear-gradient(135deg, $selectTriangleColor 50%, transparent 50%);
+ background-position:
+ calc(100% - 18px) calc(13px),
+ calc(100% - 13px) calc(13px),
+ calc(100% - 2.5em) 0.5em;
+ background-size: 5px 5px, 5px 5px, 3px 1.5em;
+ background-repeat: no-repeat;
+
+ &:hover {
+ border-color: darken($selectBorderColor, 10%);
+ }
+ }
+
+ .options {
+ padding: 0 $boxPadding;
+ height: 60px;
+ display: flex;
+ align-items: center;
+ border-bottom: 1px solid $borderColor;
+
+ label { display: none; }
+
+ .action {
+ margin-left: auto;
+
+ .btn {
+ width: auto;
+ padding: 6px 20px;
+ }
+ }
+ }
+
+ .content {
+ padding: 20px $boxPadding;
+
+ label { display: none; }
+
+ textarea {
+ padding: 20px;
+ @include codeTextArea;
+ min-height: 390px;
+ box-sizing: border-box;
+ width: 100%;
+ border: 1px solid $borderColor;
+
+ &:active, &:focus {
+ border-color: darken($selectBorderColor, 10%)
+ }
+ }
+ }
+}
+
diff --git a/client/scss/components/_header.scss b/client/scss/components/_header.scss
new file mode 100644
index 0000000..8e52069
--- /dev/null
+++ b/client/scss/components/_header.scss
@@ -0,0 +1,115 @@
+header {
+ padding: 0 $boxPadding;
+ height: 60px;
+
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+
+ color: $headerTextColor;
+ background: linear-gradient(to right, $headerBgColor1, $headerBgColor2);
+
+ // Subheadline e.g. Reply Bar
+ &.sub {
+ height: 45px;
+ }
+
+ a {
+ display: inline-block;
+
+ color: $headerTextColor;
+ text-decoration: none;
+ text-align: center;
+ font-weight: $baseFontBold;
+
+ &:hover { text-decoration: underline; }
+
+ // dpaste home link is a bit larger
+ &.home {
+ font-size: 28px;
+ font-weight: $baseFontHeavy;
+
+ }
+
+ // Nav links have a fixed width to align with grid
+ &.nav-link {
+ width: $columnWidth + $columnGap;
+ }
+ }
+
+ .btn {
+ width: 2 * $columnWidth;
+ margin-left: $columnGap / 2;
+ }
+
+ h1 {
+ position: relative;
+ font-size: 24px;
+ font-weight: $baseFontBold;
+
+ strong {
+ font-size: 28px;
+ font-weight: $baseFontHeavy;
+ }
+ }
+
+ h2 {
+ font-size: 16px;
+ font-weight: $baseFontBold;
+ }
+}
+
+
+ul#snippetOptions {
+ padding: 0 $boxPadding;
+ height: 40px;
+
+ background-color: $metaBgColor;
+ color: $metaTextColor;
+
+ font-size: 13px;
+ font-weight: $baseFontRegular;
+
+ display: flex;
+ align-items: center;
+
+ a:link, a:visited {
+ color: $metaTextColor;
+ text-decoration: underline;
+ }
+
+ a:hover, a:active {
+ color: $hoverColor;
+ text-decoration: underline;
+ }
+
+ li {
+ padding: 0 7px;
+
+ &:first-child{ padding-left: 0; }
+ &:last-child{ padding-right: 0; }
+ }
+
+ li.sep {
+ @include separator($metaTextColor);
+ height: 17px;
+ margin: 0 2px 0 1px;
+ padding: 0;
+ }
+}
+
+#copyToClipboardField {
+ position: absolute;
+ left: -9999px;
+}
+
+#copyToClipboard svg {
+ height: 30px;
+ position: absolute;
+ top: -8px;
+ right: -40px;
+
+ &:active {
+ top: -7px;
+ }
+}
diff --git a/client/scss/components/_history.scss b/client/scss/components/_history.scss
new file mode 100644
index 0000000..1bd346d
--- /dev/null
+++ b/client/scss/components/_history.scss
@@ -0,0 +1,33 @@
+
+
+
+.history-header {
+ padding: 15px $boxPadding;
+ color: $textColor;
+ font-size: 14px;
+ background-color: $borderColor;
+
+ a:link, a:visited {
+ font-weight: $baseFontDemiBold;
+ color: $textColor;
+ text-decoration: underline;
+ }
+
+ a:hover, a:active {
+ color: $hoverColor;
+ text-decoration: underline;
+ }
+
+ .sep {
+ @include separator($metaTextColor, 10px);
+ height: 17px;
+ padding: 0;
+ }
+}
+
+.history-empty {
+ padding: 40px $boxPadding;
+ color: $codeTextColor;
+}
+
+
diff --git a/client/scss/dpaste.scss b/client/scss/dpaste.scss
new file mode 100755
index 0000000..e296aa9
--- /dev/null
+++ b/client/scss/dpaste.scss
@@ -0,0 +1,93 @@
+/* -----------------------------------------------------------------------------
+ Palette
+----------------------------------------------------------------------------- */
+
+// General
+$bgColor: white; // Regular background color for non-code snippets.
+
+$textColor: #7D7D7D; // General text color
+$linkColor: #4A90E2; // Link color in text and content pages
+$hoverColor: #72B4E4;
+
+$borderColor: #EDEDED; // Used for separators, select borders, etc.
+
+// Header
+$headerTextColor: white; // Header text color
+$headerBgColor1: #4A90E2; // Header gradient background left
+$headerBgColor2: #72B4E4; // Header gradient background right
+
+$btnBgColor: #4A90E2; // Buttons (Header, Meta)
+$btnBorderColor: #33639C;
+$btnTextColor: white;
+
+// Meta Options
+$metaBgColor: #F9F9F9; // Meta options of snippet
+$metaTextColor: #BABABA; // Meta text and link color
+
+$selectBorderColor: #DDDDDD; // Select dropdowns
+$selectBgColor: white;
+$selectTextColor: #858585;
+$selectTriangleColor: $linkColor;
+
+$confirmTextColor: #6D6D6D; // Yellow confirmation popup
+$confirmBgColor: #FFF9A8;
+
+// Snippet
+$messageTextColor: white; // One time message color
+$messageBgColor: #F5A623;
+
+$codeTextColor: #dadad4; // Regular code color (not specified by pygments)
+$codeBgColor: #222829; // bg color of code views
+$codeDiffBgColor: #2A3335; // bg color of diff views
+$codeLineNumberColor: #636363; // Color of code line numbers
+
+$markerLineNumberColor: gold; // Marked lines number color
+$markerBgColor: rgba(255, 255, 255, .05);
+
+// Mobile Burger Menu
+$burgerBgColor: #3D3D3D; // Burger Menu background
+$burgerTextColor: #C0C0C0; // (muted) Text color of burger buttons
+
+$burgerBtnTextColor: #C0C0C0; // Buttons and select items in Burger Menu
+$burgerBtnBorderColor: #575757;
+
+
+/* -----------------------------------------------------------------------------
+ Fonts
+----------------------------------------------------------------------------- */
+$baseFont: "Avenir Next";
+$codeFont: "SF Mono", "Fira Mono", Monaco, Menlo, Consolas, monospace;
+$textFont: "Apple SD Gothic Neo";
+
+$baseFontLight: 300;
+$baseFontRegular: 400;
+$baseFontDemiBold: 500;
+$baseFontBold: 600;
+$baseFontHeavy: 700;
+
+
+/* -----------------------------------------------------------------------------
+ Grid
+----------------------------------------------------------------------------- */
+$columnWidth: 60px;
+$columnGap: 20px;
+
+$boxPadding: 30px; // Left/Right padding of all views
+$mobileBoxPadding: 20px;
+
+
+/* -----------------------------------------------------------------------------
+ Imports
+----------------------------------------------------------------------------- */
+
+// Globals.
+@import 'reset';
+@import 'mixins';
+@import 'globals';
+
+// Components.
+@import 'components/header';
+@import 'components/form';
+@import 'components/code';
+@import 'components/article';
+@import 'components/history';
diff --git a/dpaste/static/dpaste/_about.scss b/dpaste/static/dpaste/_about.scss
deleted file mode 100644
index 5239714..0000000
--- a/dpaste/static/dpaste/_about.scss
+++ /dev/null
@@ -1,13 +0,0 @@
-// -----------------------------------------------------------------------------
-// About Page
-
-.page {
- padding: $desktopBoxPadding;
- background-color: white;
-
- color: #444;
-
- table th {
- text-align: left;
- }
-}
diff --git a/dpaste/static/dpaste/_details.scss b/dpaste/static/dpaste/_details.scss
deleted file mode 100644
index 16241f6..0000000
--- a/dpaste/static/dpaste/_details.scss
+++ /dev/null
@@ -1,97 +0,0 @@
-// -----------------------------------------------------------------------------
-// Snippet Details
-
-// -----------------------------------------------------------------------------
-// Options
-.snippet-options {
- padding: $desktopBoxPadding;
- font-size: .9rem;
-
- a:link,
- a:visited {
- margin: 0 .2em;
- }
- a:hover,
- a:active {
- text-decoration: underline;
- }
-}
-
-// -----------------------------------------------------------------------------
-// Reply Form
-
-.snippet-reply {
- h2 {
- background-color: white;
- padding: $desktopBoxPadding;
- padding-bottom: 0;
- margin: 0;
-
- font-size: 1.5rem;
- font-weight: 500;
- }
-}
-
-.snippet-reply[data-hidden=yes] {
- opacity: 0.3;
- cursor: pointer;
-
- * {
- cursor: pointer;
- }
-}
-
-// -----------------------------------------------------------------------------
-// Text lexer
-
-.snippet-text {
- color: #666;
- font-size: 16px;
- line-height: 24px;
- max-width: 620px;
- font-family: Helvetica, FreeSerif, serif;
- font-weight: 300;
-}
-
-// -----------------------------------------------------------------------------
-// Code Lexer
-
-$codeColor: #f8f8f2;
-$codeLineColor: #aaa;
-$codeBackgroundColor: #232829;
-$markerColor: rgb(244,244,9);
-$markerBackgroundColor: rgba(244,244,9,.2);
-
-.snippet-code {
-
- background: $codeBackgroundColor;
- color: $codeColor;
- font-family: $codeFont;
- font-size: 0.8rem;
- font-weight: 300;
- line-height: 1.1rem;
- padding: 1rem 0;
-
- &.wordwrap {
- overflow: auto;
-
- li { white-space: pre-wrap !important; }
- }
-
- ol {
- margin: 0 0 0 2rem;
-
- li {
- color: $codeLineColor;
- cursor: pointer;
- white-space: pre;
-
- &.marked {
- color: $markerColor;
- background-color: $markerBackgroundColor;
- }
-
- }
- }
-
-}
diff --git a/dpaste/static/dpaste/_form.scss b/dpaste/static/dpaste/_form.scss
deleted file mode 100644
index 17641ad..0000000
--- a/dpaste/static/dpaste/_form.scss
+++ /dev/null
@@ -1,74 +0,0 @@
-// -----------------------------------------------------------------------------
-// Snippet Form
-
-.snippet-form {
-}
-
-// -----------------------------------------------------------------------------
-// The main form textarea
-
-.form-content {
- background-color: white;
- padding: 1rem 1rem;
-
- textarea {
- box-sizing: border-box;
- width: 100%;
- height: 25rem;
- font-family: $codeFont;
- font-size: .8rem;
- border: 1px solid #bbb;
- padding: 1rem;
- transition: border .5s linear;
-
- &:focus {
- outline: none;
- border-color: #3fca6e;
-
- }
- }
-}
-
-// -----------------------------------------------------------------------------
-// Additional options; lexer and expiration
-
-.form-options {
- padding: $desktopBoxPadding;
- display: flex;
- justify-content: space-between;
- font-size: .9rem;
-
- .form-options-lexer {
- }
- .form-options-expire {
- }
-}
-
-// -----------------------------------------------------------------------------
-// Submit line
-
-.form-actions {
- padding: $desktopBoxPadding;
- background-color: white;
-
- .shortcut {
- font-size: .9rem;
- color: #888;
- letter-spacing: 1px;
- }
-
- input[type=submit] {
- color: white;
- background-color: rgb(109, 163, 217);
- border: none;
- padding: .6em 1em;
- font-weight: 500;
- font-family: "SF Mono", "Fira Mono", monospace;
- border-radius: 2px;
- cursor: pointer;
-
- &:hover {
- background: rgb(96, 139, 192);
- }
- }
-}
diff --git a/dpaste/static/dpaste/_header.scss b/dpaste/static/dpaste/_header.scss
deleted file mode 100644
index 43f4e15..0000000
--- a/dpaste/static/dpaste/_header.scss
+++ /dev/null
@@ -1,61 +0,0 @@
-// -----------------------------------------------------------------------------
-// Header
-
-header {
- background: $headerColor2;
- display: flex;
- justify-content: space-between;
- align-items: center;
-
- padding: $desktopBoxPadding;
-}
-
-header h1 {
- color: white;
- font-size: 1em;
- font-weight: 500;
- margin: 0;
-}
-
-header h1 input {
- font-size: 1em;
- font-family: $codeFont;
- background-color: transparent;
- border: none;
- padding: 0;
- margin: 0;
- color: white;
- min-width: 25em;
- outline: none;
-}
-
-header nav {
- font-size: .9rem;
-}
-
-header nav a:link,
-header nav a:visited {
- color: white;
- font-weight: 500;
- text-decoration: none;
- margin: 0 .2em;
- white-space: nowrap;
-
- &:hover {
- text-decoration: underline;
- }
-}
-
-header nav a:last-child {
- border: 1px solid white;
- border-radius: 5px;
- padding: .3em .5em;
-
- &:hover {
- text-decoration: none;
- background-color: lighten($headerColor1, 10%);
- }
-}
-
-
-
diff --git a/dpaste/static/dpaste/_history.scss b/dpaste/static/dpaste/_history.scss
deleted file mode 100644
index 07e98ee..0000000
--- a/dpaste/static/dpaste/_history.scss
+++ /dev/null
@@ -1,18 +0,0 @@
-// -----------------------------------------------------------------------------
-// Snippet History List
-
-.snippet-list {
- padding: $desktopBoxPadding;
-
- dt:not(:first-child) {
- margin-top: 1rem;
- }
- dt:last-child {
- margin-top: 2rem;
- }
-
- dd {
- font-family: $codeFont;
- font-size: .9rem;
- }
-}
diff --git a/dpaste/static/dpaste/dpaste.css b/dpaste/static/dpaste/dpaste.css
deleted file mode 100644
index 4658490..0000000
--- a/dpaste/static/dpaste/dpaste.css
+++ /dev/null
@@ -1 +0,0 @@
-body{color:#888;background:#F7F8F9;font-family:"SF Mono","Fira Mono",monospace;font-size:1em;font-weight:300;margin:0;padding:0}a:link,a:visited{color:#6da3d9;font-family:"SF Mono","Fira Mono",monospace;font-weight:500;text-decoration:none}a:hover,a:visited{color:#6da3d9;text-decoration:underline}select,input{font-size:medium}header{background:#426ca1;display:flex;justify-content:space-between;align-items:center;padding:1rem 2rem}header h1{color:white;font-size:1em;font-weight:500;margin:0}header h1 input{font-size:1em;font-family:"SF Mono","Fira Mono",Monaco,Menlo,Consolas,"Courier New",monospace;background-color:transparent;border:none;padding:0;margin:0;color:white;min-width:25em;outline:none}header nav{font-size:.9rem}header nav a:link,header nav a:visited{color:white;font-weight:500;text-decoration:none;margin:0 .2em;white-space:nowrap}header nav a:link:hover,header nav a:visited:hover{text-decoration:underline}header nav a:last-child{border:1px solid white;border-radius:5px;padding:.3em .5em}header nav a:last-child:hover{text-decoration:none;background-color:#49629b}.form-content{background-color:white;padding:1rem 1rem}.form-content textarea{box-sizing:border-box;width:100%;height:25rem;font-family:"SF Mono","Fira Mono",Monaco,Menlo,Consolas,"Courier New",monospace;font-size:.8rem;border:1px solid #bbb;padding:1rem;transition:border .5s linear}.form-content textarea:focus{outline:none;border-color:#3fca6e}.form-options{padding:1rem 2rem;display:flex;justify-content:space-between;font-size:.9rem}.form-actions{padding:1rem 2rem;background-color:white}.form-actions .shortcut{font-size:.9rem;color:#888;letter-spacing:1px}.form-actions input[type=submit]{color:white;background-color:#6da3d9;border:none;padding:.6em 1em;font-weight:500;font-family:"SF Mono", "Fira Mono", monospace;border-radius:2px;cursor:pointer}.form-actions input[type=submit]:hover{background:#608bc0}.snippet-options{padding:1rem 2rem;font-size:.9rem}.snippet-options a:link,.snippet-options a:visited{margin:0 .2em}.snippet-options a:hover,.snippet-options a:active{text-decoration:underline}.snippet-reply h2{background-color:white;padding:1rem 2rem;padding-bottom:0;margin:0;font-size:1.5rem;font-weight:500}.snippet-reply[data-hidden=yes]{opacity:0.3;cursor:pointer}.snippet-reply[data-hidden=yes] *{cursor:pointer}.snippet-text{color:#666;font-size:16px;line-height:24px;max-width:620px;font-family:Helvetica, FreeSerif, serif;font-weight:300}.snippet-code{background:#232829;color:#f8f8f2;font-family:"SF Mono","Fira Mono",Monaco,Menlo,Consolas,"Courier New",monospace;font-size:0.8rem;font-weight:300;line-height:1.1rem;padding:1rem 0}.snippet-code.wordwrap{overflow:auto}.snippet-code.wordwrap li{white-space:pre-wrap !important}.snippet-code ol{margin:0 0 0 2rem}.snippet-code ol li{color:#aaa;cursor:pointer;white-space:pre}.snippet-code ol li.marked{color:#f4f409;background-color:rgba(244,244,9,0.2)}.snippet-list{padding:1rem 2rem}.snippet-list dt:not(:first-child){margin-top:1rem}.snippet-list dt:last-child{margin-top:2rem}.snippet-list dd{font-family:"SF Mono","Fira Mono",Monaco,Menlo,Consolas,"Courier New",monospace;font-size:.9rem}.page{padding:1rem 2rem;background-color:white;color:#444}.page table th{text-align:left}.snippet-code .gd{background-color:rgba(226,12,19,0.3);color:#fff;display:block}.snippet-code .gi{background-color:rgba(23,189,10,0.2);color:#fff;display:block}.snippet-code .hll{background-color:#49483e}.snippet-code .c{color:#75715e}.snippet-code .err{color:#960050;background-color:#1e0010}.snippet-code .k{color:#66d9ef}.snippet-code .l{color:#ae81ff}.snippet-code .n{color:#f8f8f2}.snippet-code .o{color:#f92672}.snippet-code .p{color:#f8f8f2}.snippet-code .cm{color:#75715e}.snippet-code .cp{color:#75715e}.snippet-code .c1{color:#75715e}.snippet-code .cs{color:#75715e}.snippet-code .ge{font-style:italic}.snippet-code .gs{font-weight:bold}.snippet-code .kc{color:#66d9ef}.snippet-code .kd{color:#66d9ef}.snippet-code .kn{color:#f92672}.snippet-code .kp{color:#66d9ef}.snippet-code .kr{color:#66d9ef}.snippet-code .kt{color:#66d9ef}.snippet-code .ld{color:#e6db74}.snippet-code .m{color:#ae81ff}.snippet-code .s{color:#e6db74}.snippet-code .na{color:#a6e22e}.snippet-code .nb{color:#f8f8f2}.snippet-code .nc{color:#a6e22e}.snippet-code .no{color:#66d9ef}.snippet-code .nd{color:#a6e22e}.snippet-code .ni{color:#f8f8f2}.snippet-code .ne{color:#a6e22e}.snippet-code .nf{color:#a6e22e}.snippet-code .nl{color:#f8f8f2}.snippet-code .nn{color:#f8f8f2}.snippet-code .nx{color:#a6e22e}.snippet-code .py{color:#f8f8f2}.snippet-code .nt{color:#f92672}.snippet-code .nv{color:#f8f8f2}.snippet-code .ow{color:#f92672}.snippet-code .w{color:#f8f8f2}.snippet-code .mf{color:#ae81ff}.snippet-code .mh{color:#ae81ff}.snippet-code .mi{color:#ae81ff}.snippet-code .mo{color:#ae81ff}.snippet-code .sb{color:#e6db74}.snippet-code .sc{color:#e6db74}.snippet-code .sd{color:#e6db74}.snippet-code .s2{color:#e6db74}.snippet-code .se{color:#ae81ff}.snippet-code .sh{color:#e6db74}.snippet-code .si{color:#e6db74}.snippet-code .sx{color:#e6db74}.snippet-code .sr{color:#e6db74}.snippet-code .s1{color:#e6db74}.snippet-code .ss{color:#e6db74}.snippet-code .bp{color:#f8f8f2}.snippet-code .vc{color:#f8f8f2}.snippet-code .vg{color:#f8f8f2}.snippet-code .vi{color:#f8f8f2}.snippet-code .il{color:#ae81ff}
diff --git a/dpaste/static/dpaste/dpaste.scss b/dpaste/static/dpaste/dpaste.scss
deleted file mode 100644
index a5f1d39..0000000
--- a/dpaste/static/dpaste/dpaste.scss
+++ /dev/null
@@ -1,67 +0,0 @@
-// -----------------------------------------------------------------------------
-//
-// dpaste example stylesheet
-//
-// -----------------------------------------------------------------------------
-
-// Color Palette
-$backgroundColor: #F7F8F9;
-$headerColor1: #394c78;
-$headerColor2: #426ca1;
-$headerTextColor: #fff;
-$textColor: #888;
-
-$linkColor: rgb(109, 163, 217);
-$hoverColor: rgb(109, 163, 217);
-
-// The general font for the website
-$siteFont: "SF Mono", "Fira Mono", monospace;
-
-// Font used for "Text" lexer
-$textFont: Helvetica;
-
-// Font used for the code snippet display
-$codeFont: "SF Mono", "Fira Mono", Monaco, Menlo, Consolas, "Courier New", monospace;
-
-$desktopBoxPadding: 1rem 2rem;
-$mobileBoxPadding: 1rem;
-
-// -----------------------------------------------------------------------------
-
-body {
- color: $textColor;
- background: $backgroundColor;
- font-family: $siteFont;
- font-size: 1em;
- font-weight: 300;
- margin: 0;
- padding: 0;
-}
-
-a:link,
-a:visited {
- color: $linkColor;
- font-family: $siteFont;
- font-weight: 500;
- text-decoration: none;
-}
-
-a:hover,
-a:visited {
- color: $hoverColor;
- text-decoration: underline;
-}
-
-select, input {
- font-size: medium;
-}
-
-// -----------------------------------------------------------------------------
-// Imports
-
-@import 'header';
-@import 'form';
-@import 'details';
-@import 'history';
-@import 'about';
-@import 'pygments';
diff --git a/dpaste/templates/dpaste/404.html b/dpaste/templates/dpaste/404.html
index e1a66b0..c306001 100644
--- a/dpaste/templates/dpaste/404.html
+++ b/dpaste/templates/dpaste/404.html
@@ -1,8 +1,14 @@
{% extends "dpaste/base.html" %}
-{% block title %}404 Not found{% endblock %}
-{% block headline %}404 Not found{% endblock %}
+{% block title %}404 Snippet not found{% endblock %}
{% block page %}
-
Snippet you have searched is not available (anymore).
+
+ 404 Snippet not found
+
+
+ This snippet no longer exists. Snippets are automatically
+ deleted when they reach their expiration date.
+
+
{% endblock %}
diff --git a/dpaste/templates/dpaste/500.html b/dpaste/templates/dpaste/500.html
index 2332f4a..ec18515 100644
--- a/dpaste/templates/dpaste/500.html
+++ b/dpaste/templates/dpaste/500.html
@@ -1,8 +1,10 @@
{% extends "dpaste/base.html" %}
{% block title %}500 Internal Server Error{% endblock %}
-{% block headline %}500 Internal Server Error{% endblock %}
{% block page %}
- Sorry, there was an error with your request. The server notified the admin via email.
+
+ 500 Internal Server Error
+ There was an issue with your request.
+
{% endblock %}
diff --git a/dpaste/templates/dpaste/about.html b/dpaste/templates/dpaste/about.html
index e5c4e80..883713c 100644
--- a/dpaste/templates/dpaste/about.html
+++ b/dpaste/templates/dpaste/about.html
@@ -3,91 +3,28 @@
{% load i18n %}
{% block title %}{% trans "About" %}{% endblock %}
-{% block headline %}{% trans "About" %}{% endblock %}
{% block page %}
+
-
+
{% trans "About dpaste" %}
-
- This site is powered by dpaste, which is open source. You can
- find the source, contribute to it and leave ideas on Github:
- github.com/bartTC/dpaste
-
+
+ {% blocktrans %}
+ This site is powered by dpaste, an open source
+ pastebin application.
+ You can find the source code, contribute to it or leave feedback
+ on Github .
+ {% endblocktrans %}
+
-
+
+ {% blocktrans %}
+ dpaste provides an API to easily paste snippets out of your shell or editor.
+ See the dpaste wiki
+ for the API documentation and a list of available plugins.
+ {% endblocktrans %}
+
-
API
-
-
dpaste provides a simple API documented in detail
- on this page . For a quick start here is a code example (Python 2.x):
-
- {# Just put the script in dpaste and copy the source node #}
-
#!/usr/bin/env python from urllib import urlencode from urllib2 import Request , urlopen from sys import stdin def paste_code (): request = Request ( '{{ site_url }}/api/' , urlencode ({ 'content' : stdin . read (), 'lexer' : 'python' , 'format' : 'url' , })) print urlopen ( request ) . read () if __name__ == '__main__' : paste_code ()
-
-
-
Save this script in /usr/local/bin/dpaste
and give it the executable bit: chmod +x /usr/local/bin/dpaste
.
-
Usage: cat foo.txt | dpaste
-
-
An alternative would be to just use curl
:
- alias dpaste="curl -F 'content=<-' {{ site_url }}/api/"
-
-
-
Applications using the API:
-
-
-
-
{% trans "Statistics" %}
-
-
{% blocktrans %}There are {{ total }} snippets in the database. The most popular languages are:{% endblocktrans %}
-
- {% for s in stats %}
-
- {{ s.lexer|upper }}
- {{ s.count }}
-
- {% endfor %}
-
-
-
Delete a snippet
-
-
- If you created a snippet with the API you can't delete it on the webpage
- since it's not in your history. You can delete a snippet here. Actually
- you can delete any snippet of anybody, as long as you know the short code.
-
-
- If you deleted a snippet because of legal issues, please let me know
- that, I want to keep track of such things and try to avoid in future.
-
-
- Type the 4 letter code of your snippet in the field and submit.
- Like this yellow one here: {{ site_url }}/SiZrT
-
-
-
-
- {{ DPASTE_ABOUT_EXTRA }}
-
+
{% endblock %}
diff --git a/dpaste/templates/dpaste/base.html b/dpaste/templates/dpaste/base.html
index 9700140..92571f7 100644
--- a/dpaste/templates/dpaste/base.html
+++ b/dpaste/templates/dpaste/base.html
@@ -1,48 +1,29 @@
{% load i18n %}
{% load staticfiles %}
+{% load dpaste_tags %}
{% block title %}{% endblock %}
-
- {% block extrahead %}{% endblock %}
+
-
+
-
-
- {% block headline %}{% endblock %}
+
-{% block page %}
- PAGE MISSING
-{% endblock %}
+{% block options %}{% endblock %}
-{% block script_footer %}
-
-{% endblock %}
+{% block page %}{% endblock %}
+
diff --git a/dpaste/templates/dpaste/details.html b/dpaste/templates/dpaste/details.html
new file mode 100644
index 0000000..819653a
--- /dev/null
+++ b/dpaste/templates/dpaste/details.html
@@ -0,0 +1,83 @@
+{% extends "dpaste/base.html" %}
+
+{% load i18n %}
+
+{% block title %}dpaste/{{ snippet.secret_id }} ({{ snippet.lexer }}){% endblock %}
+
+{% block body_type %}
+ {% if snippet.lexer == 'text' %}data-text-snippet{% else %}data-code-snippet{% endif %}
+{% endblock %}
+
+{% block headline %}
+ {{ request.build_absolute_uri }}
+
+
+
+
+
+
+
+
+{% endblock %}
+
+{% block options %}
+
+{% endblock %}
+
+{% block page %}
+ {% if snippet.expire_type == 3 %}
+
+ {% trans "This is a one-time snippet." %}
+ {% if snippet.remaining_views > 1 %}
+ {% blocktrans with remaining=snippet.remaining_views %}It is automatically removed after {{ remaining }} further views.{% endblocktrans %}
+ {% elif snippet.remaining_views == 1 %}
+ {% trans "It is automatically removed after the next view." %}
+ {% else %}
+ {% trans "It cannot be viewed again." %}
+ {% endif %}
+
+ {% endif %}
+
+ {% if snippet.lexer == 'text' %}
+ {% include "dpaste/highlight/text.html" %}
+ {% else %}
+ {% include "dpaste/highlight/code.html" %}
+ {% endif %}
+
+
+ {% trans "Edit this Snippet" %}
+
+
+ {% include "dpaste/includes/form.html" %}
+{% endblock %}
diff --git a/dpaste/templates/dpaste/highlight/code.html b/dpaste/templates/dpaste/highlight/code.html
index 2ced6f8..ae45cff 100644
--- a/dpaste/templates/dpaste/highlight/code.html
+++ b/dpaste/templates/dpaste/highlight/code.html
@@ -1 +1 @@
-{% for line in highlighted %}{{ line|safe|default:" " }} {% endfor %}
+{% for line in snippet.highlight_lines %}{{ line|safe|default:" " }} {% endfor %}
diff --git a/dpaste/templates/dpaste/highlight/text.html b/dpaste/templates/dpaste/highlight/text.html
index 3a442fa..0c0972f 100644
--- a/dpaste/templates/dpaste/highlight/text.html
+++ b/dpaste/templates/dpaste/highlight/text.html
@@ -1 +1 @@
-{{ snippet.content|linebreaksbr }}
+{{ snippet.content|linebreaksbr }}
diff --git a/dpaste/templates/dpaste/history.html b/dpaste/templates/dpaste/history.html
new file mode 100644
index 0000000..f6e46ae
--- /dev/null
+++ b/dpaste/templates/dpaste/history.html
@@ -0,0 +1,49 @@
+{% extends "dpaste/base.html" %}
+
+{% load i18n %}
+
+{% block title %}{% trans "Snippet History" %}{% endblock %}
+
+{% block body_type %}data-code-snippet{% endblock %}
+
+{% block options %}
+
+{% endblock %}
+
+{% block page %}
+ {% for snippet in snippet_list %}
+
+
+ {% if snippet.lexer == 'text' %}
+ {% include "dpaste/highlight/text.html" %}
+ {% else %}
+ {% include "dpaste/highlight/code.html" %}
+ {% endif %}
+
+ {% empty %}
+
+ {% trans "No snippets saved. Either all your snippets are expired or your cookie has changed." %}
+ {% endfor %}
+
+
+
+{% endblock %}
diff --git a/dpaste/templates/dpaste/snippet_diff.html b/dpaste/templates/dpaste/includes/diff.html
similarity index 100%
rename from dpaste/templates/dpaste/snippet_diff.html
rename to dpaste/templates/dpaste/includes/diff.html
diff --git a/dpaste/templates/dpaste/includes/form.html b/dpaste/templates/dpaste/includes/form.html
new file mode 100644
index 0000000..ecf7522
--- /dev/null
+++ b/dpaste/templates/dpaste/includes/form.html
@@ -0,0 +1,35 @@
+{% load i18n %}
+
+
diff --git a/dpaste/templates/dpaste/new.html b/dpaste/templates/dpaste/new.html
new file mode 100644
index 0000000..a5172c7
--- /dev/null
+++ b/dpaste/templates/dpaste/new.html
@@ -0,0 +1,11 @@
+{% extends "dpaste/base.html" %}
+
+{% load i18n %}
+
+{% block nav_new %}{% endblock %}
+
+{% block title %}{% trans "dpaste" %}{% endblock %}
+
+{% block page %}
+ {% include "dpaste/includes/form.html" %}
+{% endblock %}
diff --git a/dpaste/templates/dpaste/snippet_details.html b/dpaste/templates/dpaste/snippet_details.html
deleted file mode 100644
index a05a5ac..0000000
--- a/dpaste/templates/dpaste/snippet_details.html
+++ /dev/null
@@ -1,116 +0,0 @@
-{% extends "dpaste/base.html" %}
-
-{% load i18n %}
-
-{% block title %}dpaste{% endblock %}
-{% block headline %}
-
-{% endblock %}
-
-{% block page %}
-
-
-
-
- {% if snippet.expire_type == 1 %}
- {% blocktrans with date=snippet.expires|timeuntil %}Expires in: {{ date }}{% endblocktrans %}
- {% elif snippet.expire_type == 2 %}
- {% trans "Snippet never expires" %}
- {% elif snippet.expire_type == 3 %}
- {% trans "One-Time snippet" %}
- {% endif %}
-
-
-
{% trans "Delete Now" %}
-
- {% if snippet.parent %}
-
{% trans "Compare with previous Snippet" %}
- {% endif %}
-
- {% if snippet.expire_type != 3 %}
-
{% trans "View Raw" %}
- {% endif %}
-
- {% if snippet.lexer != 'text' %}
-
Wordwrap
- {% endif %}
-
-
-
- {% if snippet.expire_type == 3 %}
-
- {% trans "This is a one-time snippet." %}
- {% if snippet.remaining_views > 1 %}
- {% blocktrans with remaining=snippet.remaining_views %}It is automatically removed after {{ remaining }} further views.{% endblocktrans %}
- {% elif snippet.remaining_views == 1 %}
- {% trans "It is automatically removed after the next view." %}
- {% else %}
- {% trans "It cannot be viewed again." %}
- {% endif %}
-
- {% endif %}
-
-
- {% if snippet.lexer == 'text' %}
- {% include "dpaste/highlight/text.html" %}
- {% else %}
- {% include "dpaste/highlight/code.html" %}
- {% endif %}
-
-
-
-
{% trans "Reply to this snippet" %} →
- {% include "dpaste/snippet_form.html" %}
-
-{% endblock %}
-
-
-{% block script_footer %}
-{{ block.super }}
-
-{% endblock %}
diff --git a/dpaste/templates/dpaste/snippet_form.html b/dpaste/templates/dpaste/snippet_form.html
deleted file mode 100644
index 7841af8..0000000
--- a/dpaste/templates/dpaste/snippet_form.html
+++ /dev/null
@@ -1,29 +0,0 @@
-{% load i18n %}
-
-
diff --git a/dpaste/templates/dpaste/snippet_list.html b/dpaste/templates/dpaste/snippet_list.html
deleted file mode 100644
index 6eab58d..0000000
--- a/dpaste/templates/dpaste/snippet_list.html
+++ /dev/null
@@ -1,28 +0,0 @@
-{% extends "dpaste/base.html" %}
-
-{% load i18n %}
-
-{% block title %}{% trans "Snippet History" %}{% endblock %}
-{% block headline %}{% trans "Snippet History" %}{% endblock %}
-
-{% block page %}
-
- {% for snippet in snippet_list %}
-
-
- {% blocktrans with snippet.published|timesince as since %}{{ since }}
- ago{% endblocktrans %}
-
-
-
- {{ snippet.excerpt }}
-
- {% empty %}
- {% trans "No snippets saved. Either all your snippets are expired or your cookie has changed." %}
- {% endfor %}
- {% trans "Delete all your snippets" %}
-
-
-
-{% endblock %}
diff --git a/dpaste/templates/dpaste/snippet_new.html b/dpaste/templates/dpaste/snippet_new.html
deleted file mode 100644
index 23e2193..0000000
--- a/dpaste/templates/dpaste/snippet_new.html
+++ /dev/null
@@ -1,12 +0,0 @@
-{% extends "dpaste/base.html" %}
-
-{% load i18n %}
-
-{% block title %}dpaste{% endblock %}
-{% block headline %}dpaste{% endblock %}
-
-{% block page %}
-
- {% include "dpaste/snippet_form.html" %}
-
-{% endblock %}
diff --git a/dpaste/views.py b/dpaste/views.py
index e72c111..2c2cf12 100644
--- a/dpaste/views.py
+++ b/dpaste/views.py
@@ -21,10 +21,9 @@ from django.views.generic.detail import DetailView
from pygments.lexers import get_lexer_for_filename
from pygments.util import ClassNotFound
-from .forms import EXPIRE_CHOICES, SnippetForm, get_expire_values
-from .highlight import LEXER_DEFAULT, LEXER_KEYS, LEXER_LIST, LEXER_WORDWRAP, \
- PLAIN_CODE, pygmentize
-from .models import ONETIME_LIMIT, Snippet
+from dpaste import highlight
+from dpaste.forms import EXPIRE_CHOICES, SnippetForm, get_expire_values
+from dpaste.models import ONETIME_LIMIT, Snippet
# -----------------------------------------------------------------------------
@@ -36,7 +35,7 @@ class SnippetView(FormView):
Create a new snippet.
"""
form_class = SnippetForm
- template_name = 'dpaste/snippet_new.html'
+ template_name = 'dpaste/new.html'
def get_form_kwargs(self):
kwargs = super(SnippetView, self).get_form_kwargs()
@@ -48,7 +47,7 @@ class SnippetView(FormView):
def get_context_data(self, **kwargs):
ctx = super(SnippetView, self).get_context_data(**kwargs)
ctx.update({
- 'lexer_list': LEXER_LIST,
+ 'lexer_list': highlight.LEXER_LIST,
})
return ctx
@@ -63,7 +62,7 @@ class SnippetDetailView(SnippetView, DetailView):
tree/diff view.
"""
queryset = Snippet.objects.all()
- template_name = 'dpaste/snippet_details.html'
+ template_name = 'dpaste/details.html'
slug_url_kwarg = 'snippet_id'
slug_field = 'secret_id'
@@ -98,18 +97,10 @@ class SnippetDetailView(SnippetView, DetailView):
ctx = super(SnippetDetailView, self).get_context_data(**kwargs)
ctx.update({
- 'highlighted': self.highlight_snippet().splitlines(),
- 'wordwrap': snippet.lexer in LEXER_WORDWRAP and 'True' or 'False',
+ 'wordwrap': snippet.lexer in highlight.LEXER_WORDWRAP,
})
return ctx
- def highlight_snippet(self):
- snippet = self.get_object()
- h = pygmentize(snippet.content, snippet.lexer)
- h = h.replace(u'\t', ' ')
- return h
-
-
class SnippetRawView(SnippetDetailView):
"""
Display the raw content of a snippet
@@ -143,7 +134,7 @@ class SnippetHistory(TemplateView):
Display the last `n` snippets created by this user (and saved in his
session).
"""
- template_name = 'dpaste/snippet_list.html'
+ template_name = 'dpaste/history.html'
def get(self, request, *args, **kwargs):
snippet_id_list = request.session.get('snippet_list', [])
@@ -167,7 +158,7 @@ class SnippetDiffView(TemplateView):
"""
Display a diff between two given snippet secret ids.
"""
- template_name = 'dpaste/snippet_diff.html'
+ template_name = 'dpaste/includes/diff.html'
def get(self, request, *args, **kwargs):
"""
@@ -209,8 +200,7 @@ class SnippetDiffView(TemplateView):
return diff
def highlight_snippet(self, content):
- h = pygmentize(content, 'diff')
- h = h.replace(u' ', u' ')
+ h = highlight.pygmentize(content, 'diff')
h = h.replace(u'\t', ' ')
return h
@@ -284,7 +274,7 @@ class APIView(View):
"""
def post(self, request, *args, **kwargs):
content = request.POST.get('content', '')
- lexer = request.POST.get('lexer', LEXER_DEFAULT).strip()
+ lexer = request.POST.get('lexer', highlight.LEXER_DEFAULT).strip()
filename = request.POST.get('filename', '').strip()
expires = request.POST.get('expires', '').strip()
format = request.POST.get('format', 'default').strip()
@@ -295,12 +285,12 @@ class APIView(View):
# We need at least a lexer or a filename
if not lexer and not filename:
return HttpResponseBadRequest('No lexer or filename given. Unable to '
- 'determine a highlight. Valid lexers are: %s' % ', '.join(LEXER_KEYS))
+ 'determine a highlight. Valid lexers are: %s' % ', '.join(highlight.LEXER_LIST))
# A lexer is given, check if its valid at all
- if lexer and lexer not in LEXER_KEYS:
+ if lexer and lexer not in highlight.LEXER_KEYS:
return HttpResponseBadRequest('Invalid lexer "%s" given. Valid lexers are: %s' % (
- lexer, ', '.join(LEXER_KEYS)))
+ lexer, ', '.join(highlight.LEXER_KEYS)))
# No lexer is given, but we have a filename, try to get the lexer out of it.
# In case Pygments cannot determine the lexer of the filename, we fallback
@@ -310,7 +300,7 @@ class APIView(View):
lexer_cls = get_lexer_for_filename(filename)
lexer = lexer_cls.aliases[0]
except (ClassNotFound, IndexError):
- lexer = PLAIN_CODE
+ lexer = highlight.PLAIN_CODE
if expires:
expire_options = [str(i) for i in dict(EXPIRE_CHOICES).keys()]
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..2290a5c
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,1412 @@
+{
+ "name": "dpaste",
+ "version": "3.0.0",
+ "lockfileVersion": 1,
+ "requires": true,
+ "dependencies": {
+ "abbrev": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
+ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="
+ },
+ "amdefine": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
+ "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU="
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
+ },
+ "aproba": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
+ "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw=="
+ },
+ "are-we-there-yet": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz",
+ "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=",
+ "requires": {
+ "delegates": "1.0.0",
+ "readable-stream": "2.3.5"
+ }
+ },
+ "array-find-index": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
+ "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E="
+ },
+ "asn1": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz",
+ "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y="
+ },
+ "assert-plus": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz",
+ "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ="
+ },
+ "async-foreach": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz",
+ "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI="
+ },
+ "asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
+ },
+ "aws-sign2": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz",
+ "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8="
+ },
+ "aws4": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz",
+ "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4="
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
+ },
+ "bcrypt-pbkdf": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz",
+ "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=",
+ "optional": true,
+ "requires": {
+ "tweetnacl": "0.14.5"
+ }
+ },
+ "block-stream": {
+ "version": "0.0.9",
+ "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz",
+ "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=",
+ "requires": {
+ "inherits": "2.0.3"
+ }
+ },
+ "boom": {
+ "version": "2.10.1",
+ "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz",
+ "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=",
+ "requires": {
+ "hoek": "2.16.3"
+ }
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "builtin-modules": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
+ "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8="
+ },
+ "camelcase": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
+ "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8="
+ },
+ "camelcase-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
+ "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
+ "requires": {
+ "camelcase": "2.1.1",
+ "map-obj": "1.0.1"
+ }
+ },
+ "caseless": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz",
+ "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c="
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "cliui": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
+ "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
+ "requires": {
+ "string-width": "1.0.2",
+ "strip-ansi": "3.0.1",
+ "wrap-ansi": "2.1.0"
+ }
+ },
+ "code-point-at": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
+ "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c="
+ },
+ "combined-stream": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz",
+ "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=",
+ "requires": {
+ "delayed-stream": "1.0.0"
+ }
+ },
+ "commander": {
+ "version": "2.15.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.0.tgz",
+ "integrity": "sha512-7B1ilBwtYSbetCgTY1NJFg+gVpestg0fdA1MhC1Vs4ssyfSXnCAjFr+QcQM9/RedXC0EaUx1sG8Smgw2VfgKEg=="
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
+ },
+ "console-control-strings": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
+ "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4="
+ },
+ "core-util-is": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
+ },
+ "cross-spawn": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz",
+ "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=",
+ "requires": {
+ "lru-cache": "4.1.2",
+ "which": "1.3.0"
+ }
+ },
+ "cryptiles": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz",
+ "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=",
+ "requires": {
+ "boom": "2.10.1"
+ }
+ },
+ "currently-unhandled": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
+ "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
+ "requires": {
+ "array-find-index": "1.0.2"
+ }
+ },
+ "dashdash": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+ "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
+ "requires": {
+ "assert-plus": "1.0.0"
+ },
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
+ }
+ }
+ },
+ "decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
+ },
+ "delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
+ },
+ "delegates": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
+ "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o="
+ },
+ "ecc-jsbn": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz",
+ "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=",
+ "optional": true,
+ "requires": {
+ "jsbn": "0.1.1"
+ }
+ },
+ "error-ex": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz",
+ "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=",
+ "requires": {
+ "is-arrayish": "0.2.1"
+ }
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
+ },
+ "extend": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz",
+ "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ="
+ },
+ "extsprintf": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
+ "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
+ },
+ "find-up": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
+ "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
+ "requires": {
+ "path-exists": "2.1.0",
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "forever-agent": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
+ "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE="
+ },
+ "form-data": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz",
+ "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=",
+ "requires": {
+ "asynckit": "0.4.0",
+ "combined-stream": "1.0.6",
+ "mime-types": "2.1.18"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
+ },
+ "fstream": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz",
+ "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=",
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "inherits": "2.0.3",
+ "mkdirp": "0.5.1",
+ "rimraf": "2.6.2"
+ }
+ },
+ "gauge": {
+ "version": "2.7.4",
+ "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
+ "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
+ "requires": {
+ "aproba": "1.2.0",
+ "console-control-strings": "1.1.0",
+ "has-unicode": "2.0.1",
+ "object-assign": "4.1.1",
+ "signal-exit": "3.0.2",
+ "string-width": "1.0.2",
+ "strip-ansi": "3.0.1",
+ "wide-align": "1.1.2"
+ }
+ },
+ "gaze": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.2.tgz",
+ "integrity": "sha1-hHIkZ3rbiHDWeSV+0ziP22HkAQU=",
+ "requires": {
+ "globule": "1.2.0"
+ }
+ },
+ "generate-function": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz",
+ "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ="
+ },
+ "generate-object-property": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz",
+ "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=",
+ "requires": {
+ "is-property": "1.0.2"
+ }
+ },
+ "get-caller-file": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz",
+ "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U="
+ },
+ "get-stdin": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
+ "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4="
+ },
+ "getpass": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
+ "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
+ "requires": {
+ "assert-plus": "1.0.0"
+ },
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
+ }
+ }
+ },
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "globule": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.0.tgz",
+ "integrity": "sha1-HcScaCLdnoovoAuiopUAboZkvQk=",
+ "requires": {
+ "glob": "7.1.2",
+ "lodash": "4.17.5",
+ "minimatch": "3.0.4"
+ }
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg="
+ },
+ "har-validator": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz",
+ "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=",
+ "requires": {
+ "chalk": "1.1.3",
+ "commander": "2.15.0",
+ "is-my-json-valid": "2.17.2",
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "has-unicode": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
+ "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk="
+ },
+ "hawk": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz",
+ "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=",
+ "requires": {
+ "boom": "2.10.1",
+ "cryptiles": "2.0.5",
+ "hoek": "2.16.3",
+ "sntp": "1.0.9"
+ }
+ },
+ "hoek": {
+ "version": "2.16.3",
+ "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz",
+ "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0="
+ },
+ "hosted-git-info": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz",
+ "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw=="
+ },
+ "http-signature": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz",
+ "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=",
+ "requires": {
+ "assert-plus": "0.2.0",
+ "jsprim": "1.4.1",
+ "sshpk": "1.14.1"
+ }
+ },
+ "in-publish": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz",
+ "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E="
+ },
+ "indent-string": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
+ "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
+ "requires": {
+ "repeating": "2.0.1"
+ }
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
+ },
+ "invert-kv": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
+ "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY="
+ },
+ "is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0="
+ },
+ "is-builtin-module": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
+ "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=",
+ "requires": {
+ "builtin-modules": "1.1.1"
+ }
+ },
+ "is-finite": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "is-my-ip-valid": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz",
+ "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ=="
+ },
+ "is-my-json-valid": {
+ "version": "2.17.2",
+ "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.17.2.tgz",
+ "integrity": "sha512-IBhBslgngMQN8DDSppmgDv7RNrlFotuuDsKcrCP3+HbFaVivIBU7u9oiiErw8sH4ynx3+gOGQ3q2otkgiSi6kg==",
+ "requires": {
+ "generate-function": "2.0.0",
+ "generate-object-property": "1.2.0",
+ "is-my-ip-valid": "1.0.0",
+ "jsonpointer": "4.0.1",
+ "xtend": "4.0.1"
+ }
+ },
+ "is-property": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz",
+ "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ="
+ },
+ "is-typedarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
+ },
+ "is-utf8": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
+ "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI="
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
+ },
+ "isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
+ },
+ "js-base64": {
+ "version": "2.4.3",
+ "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.3.tgz",
+ "integrity": "sha512-H7ErYLM34CvDMto3GbD6xD0JLUGYXR3QTcH6B/tr4Hi/QpSThnCsIp+Sy5FRTw3B0d6py4HcNkW7nO/wdtGWEw=="
+ },
+ "jsbn": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+ "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
+ "optional": true
+ },
+ "json-schema": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
+ "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
+ },
+ "json-stringify-safe": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
+ },
+ "jsonpointer": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz",
+ "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk="
+ },
+ "jsprim": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
+ "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
+ "requires": {
+ "assert-plus": "1.0.0",
+ "extsprintf": "1.3.0",
+ "json-schema": "0.2.3",
+ "verror": "1.10.0"
+ },
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
+ }
+ }
+ },
+ "lcid": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
+ "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
+ "requires": {
+ "invert-kv": "1.0.0"
+ }
+ },
+ "load-json-file": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
+ "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "parse-json": "2.2.0",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1",
+ "strip-bom": "2.0.0"
+ }
+ },
+ "lodash": {
+ "version": "4.17.5",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
+ "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw=="
+ },
+ "lodash.assign": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz",
+ "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc="
+ },
+ "lodash.clonedeep": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
+ "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8="
+ },
+ "lodash.mergewith": {
+ "version": "4.6.1",
+ "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz",
+ "integrity": "sha512-eWw5r+PYICtEBgrBE5hhlT6aAa75f411bgDz/ZL2KZqYV03USvucsxcHUIlGTDTECs1eunpI7HOV7U+WLDvNdQ=="
+ },
+ "loud-rejection": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
+ "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
+ "requires": {
+ "currently-unhandled": "0.4.1",
+ "signal-exit": "3.0.2"
+ }
+ },
+ "lru-cache": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.2.tgz",
+ "integrity": "sha512-wgeVXhrDwAWnIF/yZARsFnMBtdFXOg1b8RIrhilp+0iDYN4mdQcNZElDZ0e4B64BhaxeQ5zN7PMyvu7we1kPeQ==",
+ "requires": {
+ "pseudomap": "1.0.2",
+ "yallist": "2.1.2"
+ }
+ },
+ "map-obj": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
+ "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0="
+ },
+ "meow": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
+ "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
+ "requires": {
+ "camelcase-keys": "2.1.0",
+ "decamelize": "1.2.0",
+ "loud-rejection": "1.6.0",
+ "map-obj": "1.0.1",
+ "minimist": "1.2.0",
+ "normalize-package-data": "2.4.0",
+ "object-assign": "4.1.1",
+ "read-pkg-up": "1.0.1",
+ "redent": "1.0.0",
+ "trim-newlines": "1.0.0"
+ }
+ },
+ "mime-db": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz",
+ "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ=="
+ },
+ "mime-types": {
+ "version": "2.1.18",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz",
+ "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==",
+ "requires": {
+ "mime-db": "1.33.0"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "requires": {
+ "brace-expansion": "1.1.11"
+ }
+ },
+ "minimist": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
+ },
+ "mkdirp": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+ "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+ "requires": {
+ "minimist": "0.0.8"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
+ }
+ }
+ },
+ "nan": {
+ "version": "2.9.2",
+ "resolved": "https://registry.npmjs.org/nan/-/nan-2.9.2.tgz",
+ "integrity": "sha512-ltW65co7f3PQWBDbqVvaU1WtFJUsNW7sWWm4HINhbMQIyVyzIeyZ8toX5TC5eeooE6piZoaEh4cZkueSKG3KYw=="
+ },
+ "node-gyp": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.6.2.tgz",
+ "integrity": "sha1-m/vlRWIoYoSDjnUOrAUpWFP6HGA=",
+ "requires": {
+ "fstream": "1.0.11",
+ "glob": "7.1.2",
+ "graceful-fs": "4.1.11",
+ "minimatch": "3.0.4",
+ "mkdirp": "0.5.1",
+ "nopt": "3.0.6",
+ "npmlog": "4.1.2",
+ "osenv": "0.1.5",
+ "request": "2.79.0",
+ "rimraf": "2.6.2",
+ "semver": "5.3.0",
+ "tar": "2.2.1",
+ "which": "1.3.0"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
+ "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8="
+ }
+ }
+ },
+ "node-sass": {
+ "version": "4.7.2",
+ "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.7.2.tgz",
+ "integrity": "sha512-CaV+wLqZ7//Jdom5aUFCpGNoECd7BbNhjuwdsX/LkXBrHl8eb1Wjw4HvWqcFvhr5KuNgAk8i/myf/MQ1YYeroA==",
+ "requires": {
+ "async-foreach": "0.1.3",
+ "chalk": "1.1.3",
+ "cross-spawn": "3.0.1",
+ "gaze": "1.1.2",
+ "get-stdin": "4.0.1",
+ "glob": "7.1.2",
+ "in-publish": "2.0.0",
+ "lodash.assign": "4.2.0",
+ "lodash.clonedeep": "4.5.0",
+ "lodash.mergewith": "4.6.1",
+ "meow": "3.7.0",
+ "mkdirp": "0.5.1",
+ "nan": "2.9.2",
+ "node-gyp": "3.6.2",
+ "npmlog": "4.1.2",
+ "request": "2.79.0",
+ "sass-graph": "2.2.4",
+ "stdout-stream": "1.4.0",
+ "true-case-path": "1.0.2"
+ }
+ },
+ "nopt": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
+ "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
+ "requires": {
+ "abbrev": "1.1.1"
+ }
+ },
+ "normalize-package-data": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
+ "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==",
+ "requires": {
+ "hosted-git-info": "2.6.0",
+ "is-builtin-module": "1.0.0",
+ "semver": "5.5.0",
+ "validate-npm-package-license": "3.0.3"
+ }
+ },
+ "npmlog": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
+ "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
+ "requires": {
+ "are-we-there-yet": "1.1.4",
+ "console-control-strings": "1.1.0",
+ "gauge": "2.7.4",
+ "set-blocking": "2.0.0"
+ }
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
+ },
+ "oauth-sign": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz",
+ "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM="
+ },
+ "object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "os-homedir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
+ "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M="
+ },
+ "os-locale": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
+ "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
+ "requires": {
+ "lcid": "1.0.0"
+ }
+ },
+ "os-tmpdir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
+ },
+ "osenv": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
+ "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
+ "requires": {
+ "os-homedir": "1.0.2",
+ "os-tmpdir": "1.0.2"
+ }
+ },
+ "parse-json": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
+ "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
+ "requires": {
+ "error-ex": "1.3.1"
+ }
+ },
+ "path-exists": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
+ "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
+ "requires": {
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
+ },
+ "path-type": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
+ "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
+ },
+ "pinkie": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
+ "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA="
+ },
+ "pinkie-promise": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
+ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
+ "requires": {
+ "pinkie": "2.0.4"
+ }
+ },
+ "process-nextick-args": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
+ "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw=="
+ },
+ "pseudomap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
+ "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM="
+ },
+ "punycode": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+ "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4="
+ },
+ "qs": {
+ "version": "6.3.2",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz",
+ "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw="
+ },
+ "read-pkg": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
+ "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
+ "requires": {
+ "load-json-file": "1.1.0",
+ "normalize-package-data": "2.4.0",
+ "path-type": "1.1.0"
+ }
+ },
+ "read-pkg-up": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
+ "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
+ "requires": {
+ "find-up": "1.1.2",
+ "read-pkg": "1.1.0"
+ }
+ },
+ "readable-stream": {
+ "version": "2.3.5",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.5.tgz",
+ "integrity": "sha512-tK0yDhrkygt/knjowCUiWP9YdV7c5R+8cR0r/kt9ZhBU906Fs6RpQJCEilamRJj1Nx2rWI6LkW9gKqjTkshhEw==",
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "2.0.0",
+ "safe-buffer": "5.1.1",
+ "string_decoder": "1.0.3",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "redent": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
+ "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
+ "requires": {
+ "indent-string": "2.1.0",
+ "strip-indent": "1.0.1"
+ }
+ },
+ "repeating": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "requires": {
+ "is-finite": "1.0.2"
+ }
+ },
+ "request": {
+ "version": "2.79.0",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz",
+ "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=",
+ "requires": {
+ "aws-sign2": "0.6.0",
+ "aws4": "1.6.0",
+ "caseless": "0.11.0",
+ "combined-stream": "1.0.6",
+ "extend": "3.0.1",
+ "forever-agent": "0.6.1",
+ "form-data": "2.1.4",
+ "har-validator": "2.0.6",
+ "hawk": "3.1.3",
+ "http-signature": "1.1.1",
+ "is-typedarray": "1.0.0",
+ "isstream": "0.1.2",
+ "json-stringify-safe": "5.0.1",
+ "mime-types": "2.1.18",
+ "oauth-sign": "0.8.2",
+ "qs": "6.3.2",
+ "stringstream": "0.0.5",
+ "tough-cookie": "2.3.4",
+ "tunnel-agent": "0.4.3",
+ "uuid": "3.2.1"
+ }
+ },
+ "require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I="
+ },
+ "require-main-filename": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
+ "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE="
+ },
+ "rimraf": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
+ "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
+ "requires": {
+ "glob": "7.1.2"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
+ "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg=="
+ },
+ "sass-graph": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz",
+ "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=",
+ "requires": {
+ "glob": "7.1.2",
+ "lodash": "4.17.5",
+ "scss-tokenizer": "0.2.3",
+ "yargs": "7.1.0"
+ }
+ },
+ "scss-tokenizer": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz",
+ "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=",
+ "requires": {
+ "js-base64": "2.4.3",
+ "source-map": "0.4.4"
+ }
+ },
+ "semver": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
+ "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA=="
+ },
+ "set-blocking": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
+ },
+ "signal-exit": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
+ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
+ },
+ "sntp": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz",
+ "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=",
+ "requires": {
+ "hoek": "2.16.3"
+ }
+ },
+ "source-map": {
+ "version": "0.4.4",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
+ "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
+ "requires": {
+ "amdefine": "1.0.1"
+ }
+ },
+ "spdx-correct": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz",
+ "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==",
+ "requires": {
+ "spdx-expression-parse": "3.0.0",
+ "spdx-license-ids": "3.0.0"
+ }
+ },
+ "spdx-exceptions": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz",
+ "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg=="
+ },
+ "spdx-expression-parse": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
+ "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==",
+ "requires": {
+ "spdx-exceptions": "2.1.0",
+ "spdx-license-ids": "3.0.0"
+ }
+ },
+ "spdx-license-ids": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz",
+ "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA=="
+ },
+ "sshpk": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz",
+ "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=",
+ "requires": {
+ "asn1": "0.2.3",
+ "assert-plus": "1.0.0",
+ "bcrypt-pbkdf": "1.0.1",
+ "dashdash": "1.14.1",
+ "ecc-jsbn": "0.1.1",
+ "getpass": "0.1.7",
+ "jsbn": "0.1.1",
+ "tweetnacl": "0.14.5"
+ },
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
+ }
+ }
+ },
+ "stdout-stream": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.0.tgz",
+ "integrity": "sha1-osfIWH5U2UJ+qe2zrD8s1SLfN4s=",
+ "requires": {
+ "readable-stream": "2.3.5"
+ }
+ },
+ "string-width": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+ "requires": {
+ "code-point-at": "1.1.0",
+ "is-fullwidth-code-point": "1.0.0",
+ "strip-ansi": "3.0.1"
+ }
+ },
+ "string_decoder": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
+ "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
+ "requires": {
+ "safe-buffer": "5.1.1"
+ }
+ },
+ "stringstream": {
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz",
+ "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg="
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "strip-bom": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
+ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+ "requires": {
+ "is-utf8": "0.2.1"
+ }
+ },
+ "strip-indent": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
+ "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
+ "requires": {
+ "get-stdin": "4.0.1"
+ }
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
+ },
+ "tar": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz",
+ "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=",
+ "requires": {
+ "block-stream": "0.0.9",
+ "fstream": "1.0.11",
+ "inherits": "2.0.3"
+ }
+ },
+ "tough-cookie": {
+ "version": "2.3.4",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz",
+ "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==",
+ "requires": {
+ "punycode": "1.4.1"
+ }
+ },
+ "trim-newlines": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
+ "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM="
+ },
+ "true-case-path": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.2.tgz",
+ "integrity": "sha1-fskRMJJHZsf1c74wIMNPj9/QDWI=",
+ "requires": {
+ "glob": "6.0.4"
+ },
+ "dependencies": {
+ "glob": {
+ "version": "6.0.4",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz",
+ "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=",
+ "requires": {
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ }
+ }
+ },
+ "tunnel-agent": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz",
+ "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us="
+ },
+ "tweetnacl": {
+ "version": "0.14.5",
+ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
+ "optional": true
+ },
+ "uglify-es": {
+ "version": "3.3.9",
+ "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz",
+ "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==",
+ "requires": {
+ "commander": "2.13.0",
+ "source-map": "0.6.1"
+ },
+ "dependencies": {
+ "commander": {
+ "version": "2.13.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz",
+ "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA=="
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ }
+ }
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
+ },
+ "uuid": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz",
+ "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA=="
+ },
+ "validate-npm-package-license": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz",
+ "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==",
+ "requires": {
+ "spdx-correct": "3.0.0",
+ "spdx-expression-parse": "3.0.0"
+ }
+ },
+ "verror": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
+ "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
+ "requires": {
+ "assert-plus": "1.0.0",
+ "core-util-is": "1.0.2",
+ "extsprintf": "1.3.0"
+ },
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
+ }
+ }
+ },
+ "which": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz",
+ "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==",
+ "requires": {
+ "isexe": "2.0.0"
+ }
+ },
+ "which-module": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz",
+ "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8="
+ },
+ "wide-align": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz",
+ "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==",
+ "requires": {
+ "string-width": "1.0.2"
+ }
+ },
+ "wrap-ansi": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
+ "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
+ "requires": {
+ "string-width": "1.0.2",
+ "strip-ansi": "3.0.1"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
+ },
+ "xtend": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
+ "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68="
+ },
+ "y18n": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
+ "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE="
+ },
+ "yallist": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
+ "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI="
+ },
+ "yargs": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz",
+ "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=",
+ "requires": {
+ "camelcase": "3.0.0",
+ "cliui": "3.2.0",
+ "decamelize": "1.2.0",
+ "get-caller-file": "1.0.2",
+ "os-locale": "1.4.0",
+ "read-pkg-up": "1.0.1",
+ "require-directory": "2.1.1",
+ "require-main-filename": "1.0.1",
+ "set-blocking": "2.0.0",
+ "string-width": "1.0.2",
+ "which-module": "1.0.0",
+ "y18n": "3.2.1",
+ "yargs-parser": "5.0.0"
+ },
+ "dependencies": {
+ "camelcase": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
+ "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo="
+ }
+ }
+ },
+ "yargs-parser": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz",
+ "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=",
+ "requires": {
+ "camelcase": "3.0.0"
+ },
+ "dependencies": {
+ "camelcase": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
+ "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo="
+ }
+ }
+ }
+ }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..bbcbcc9
--- /dev/null
+++ b/package.json
@@ -0,0 +1,13 @@
+{
+ "name": "dpaste",
+ "version": "3.0.0",
+ "scripts": {
+ "build": "node-sass --output-style compressed -o build client/scss/dpaste.scss && uglifyjs -o build/dpaste.js client/js/dpaste.js",
+ "watch-css": "npm run build && node-sass --source-map true -o build/ --watch client/scss/dpaste.scss ",
+ "postinstall": "npm build"
+ },
+ "dependencies": {
+ "node-sass": "^4.7.2",
+ "uglify-es": "^3.3.9"
+ }
+}
diff --git a/runscss.sh b/runscss.sh
deleted file mode 100755
index a982e23..0000000
--- a/runscss.sh
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/usr/bin/env bash
-
-node-sass --output-style compressed --output dpaste/static/dpaste/ dpaste/static/dpaste/dpaste.scss $1