From 99f548e28d26a2ef6f3d203871093d45b1569ff0 Mon Sep 17 00:00:00 2001
From: Fredrik Jonsson <frjo@xdeb.org>
Date: Tue, 13 Nov 2018 15:21:25 +0100
Subject: [PATCH] Add markdown filter with mistune and markdown editor pagedown
 (from stackoverflow).

---
 .../apply/funds/templatetags/markdown_tags.py |  11 +++
 opentech/settings/base.py                     |   1 +
 .../static_src/src/images/editor-buttons.png  | Bin 0 -> 7465 bytes
 .../src/sass/apply/components/_editor.scss    |  75 ++++++++++++++++++
 opentech/static_src/src/sass/apply/main.scss  |   1 +
 requirements.txt                              |   2 +
 6 files changed, 90 insertions(+)
 create mode 100644 opentech/apply/funds/templatetags/markdown_tags.py
 create mode 100644 opentech/static_src/src/images/editor-buttons.png
 create mode 100644 opentech/static_src/src/sass/apply/components/_editor.scss

diff --git a/opentech/apply/funds/templatetags/markdown_tags.py b/opentech/apply/funds/templatetags/markdown_tags.py
new file mode 100644
index 000000000..9ba5ff19d
--- /dev/null
+++ b/opentech/apply/funds/templatetags/markdown_tags.py
@@ -0,0 +1,11 @@
+import mistune
+
+from django import template
+
+register = template.Library()
+
+
+@register.filter
+def markdown(value):
+    markdown = mistune.Markdown()
+    return markdown(value)
diff --git a/opentech/settings/base.py b/opentech/settings/base.py
index dd2c51d8b..ba0565c37 100644
--- a/opentech/settings/base.py
+++ b/opentech/settings/base.py
@@ -118,6 +118,7 @@ INSTALLED_APPS = [
 
     'hijack',
     'compat',
+    'pagedown',
 
     'django.contrib.admin',
     'django.contrib.auth',
diff --git a/opentech/static_src/src/images/editor-buttons.png b/opentech/static_src/src/images/editor-buttons.png
new file mode 100644
index 0000000000000000000000000000000000000000..50b37090363e6757e7bd0ba75cd1e0dfaabd13d2
GIT binary patch
literal 7465
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

literal 0
HcmV?d00001

diff --git a/opentech/static_src/src/sass/apply/components/_editor.scss b/opentech/static_src/src/sass/apply/components/_editor.scss
new file mode 100644
index 000000000..22affba70
--- /dev/null
+++ b/opentech/static_src/src/sass/apply/components/_editor.scss
@@ -0,0 +1,75 @@
+.wmd-panel {
+}
+
+.wmd-button-bar {
+}
+
+.wmd-input {
+}
+
+.wmd-preview {
+    background-color: $color--sky-blue;
+}
+
+.wmd-button-row {
+    position: relative;
+    margin-left: 5px;
+    margin-right: 5px;
+    margin-bottom: 5px;
+    margin-top: 10px;
+    padding: 0;
+    height: 20px;
+}
+
+.wmd-spacer {
+    width: 1px;
+    height: 20px;
+    margin-left: 14px;
+
+    position: absolute;
+    background-color: $color--mid-grey;
+    display: inline-block;
+    list-style: none;
+}
+
+.wmd-button {
+    width: 20px;
+    height: 20px;
+    padding-left: 2px;
+    padding-right: 3px;
+    position: absolute;
+    display: inline-block;
+    list-style: none;
+    cursor: pointer;
+
+    & > span {
+        background-image: url('./../../images/editor-buttons.png');
+        background-repeat: no-repeat;
+        background-position: 0 0;
+        width: 20px;
+        height: 20px;
+        display: inline-block;
+    }
+}
+
+.wmd-spacer1 {
+    left: 50px;
+}
+
+.wmd-spacer2 {
+    left: 175px;
+}
+
+.wmd-spacer3 {
+    left: 300px;
+}
+
+.wmd-prompt-background {
+    background-color: $color--black;
+}
+
+.wmd-prompt-dialog {
+    border: 4px solid $color--primary;
+    background-color: $color--light-grey;
+    padding:  .5em;
+}
diff --git a/opentech/static_src/src/sass/apply/main.scss b/opentech/static_src/src/sass/apply/main.scss
index 014c32220..745f50807 100644
--- a/opentech/static_src/src/sass/apply/main.scss
+++ b/opentech/static_src/src/sass/apply/main.scss
@@ -13,6 +13,7 @@
 @import 'components/activity-feed';
 @import 'components/comment';
 @import 'components/button';
+@import 'components/editor';
 @import 'components/feed';
 @import 'components/filters';
 @import 'components/grid';
diff --git a/requirements.txt b/requirements.txt
index 470eff2f7..662083dc2 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -42,3 +42,5 @@ django-storages==1.6.6
 boto3==1.7.75
 mailchimp3==3.0.4
 scout-apm==1.3.4
+mistune==0.8.4
+django-pagedown==1.0.6
-- 
GitLab