From 97629ca1c341daa28011fd48abb697a7edd89344 Mon Sep 17 00:00:00 2001 From: LongHairedHacker Date: Sat, 9 Jan 2016 02:13:08 +0100 Subject: [PATCH] Added simple static asset handling --- test_input/content/img/bar.png | Bin 0 -> 3158 bytes test_input/content/img/foo.png | Bin 0 -> 3022 bytes test_input/content/img/more_img/banana.png | Bin 0 -> 910 bytes test_input/testblog.py | 12 ++++- verdandi/mixins/assetsmixin.py | 56 +++++++++++++++++++-- verdandi/modules/commonassets.py | 8 +++ verdandi/modules/page.py | 3 +- 7 files changed, 73 insertions(+), 6 deletions(-) create mode 100644 test_input/content/img/bar.png create mode 100644 test_input/content/img/foo.png create mode 100644 test_input/content/img/more_img/banana.png create mode 100644 verdandi/modules/commonassets.py diff --git a/test_input/content/img/bar.png b/test_input/content/img/bar.png new file mode 100644 index 0000000000000000000000000000000000000000..b8c45bcf5b97b4cbc45bdbc933550885dd7f9e74 GIT binary patch literal 3158 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 bXxSDfM0T|HSYPk`AD^YUl^OHW&G`QU=Hc;; literal 0 HcmV?d00001 diff --git a/test_input/content/img/foo.png b/test_input/content/img/foo.png new file mode 100644 index 0000000000000000000000000000000000000000..300754339b55520f3ce2f90740f01545a4c31978 GIT binary patch literal 3022 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 H-HH7VOnQz_ literal 0 HcmV?d00001 diff --git a/test_input/content/img/more_img/banana.png b/test_input/content/img/more_img/banana.png new file mode 100644 index 0000000000000000000000000000000000000000..631bdcafa591537ce3eca3d702327682ffdd77bc GIT binary patch literal 910 zcmeAS@N?(olHy`uVBq!ia0y~yVEh8a6IhsmBCF>1e+5#~0X`wFXU?1fGH1@5xoOiT zV`Jm``g%!8Ngp4dw6wIzlaG5bFfi+Rx;TbZ%z1nBY_XE71p5QQriVM;Zc;g3v*PK* z#w&S!k9L*!R)5gQ+F324yZYOVIgjS+`WzNGp>QTDtg7p|rOKB-GsN$${P{w16A#cP zVu79C>rX59ADn!$+W#-_yq;_P6OquxgWK))NZ7F$N)#=o+J>hfKHnpb~#{^w|Dg`D^P&gyfk zE#^&~CnmjAI?hCC{pDX38&7SC|D%0g{PN|9U&lX`{yCHOR)x_hmvOK-2JSzfdASq^`ceZ;P#VQ*UgJz8}!ZtrHn zpMF2H%q`>R-ze=0&PXr)Hsj9~kkZnkA0|0d_UZnc#(Mm`)YSK168Pl#=eaLEefsH_ z%BSwjXTATj;A`F-6_HzuFMeJ0B{%ftmCv;{8GF}U+9fX@eE968`Kf15eBW}d>Q4E( z>6@SEE)70!zvydN&R*$5yJufqU^C6kd-=To?bnVM`t9FZ^6KY3xvh0u_Eg^uvie$6 z-{1Fjcbw%Kow-%}_MbJbvHtUEJy3u4jXmqudzESfHD2FfHrx92rpHBI~U-z_~ zwfqxkIr0CJO(m}?d4Fa-io3IO?YqQtV6_w0hwZJNXnSYXWZ7ujvwPZXbkzTT)b#y1 zV|lb~ppWf(Mg93jM=raSR|;3u1%XZ5V;*^??_HO0T=horl0)Xv>sDtzFO9OVl&r6| z;43_vxlw$}^1q3tKrdUZ-LAe@zRUXHj|GoXEo4&;XI9)@r8l<<7>{qXTH@=Y|Fuos znqGc*@=yJUXfL3{vuuCY)ZPDIxARGrU6uKbD4^r#J-jcU7q contents of bar go to rofl/bar + # /foo/bar/ /rofl -> contests of bar got to rofl/ + # Trailing slash on destination should have no effect + + # Will be '' in case of a trailing slash: /foo/bar/ else bar + source_base = os.path.basename(source_path) + # /rofl will become /rofl/ if base is '' otherwise it will become /rofl/bar + dest_path = os.path.join(dest_path, source_base) + + if not os.path.exists(dest_path): + os.makedirs(dest_path) + + # Discover the whole tree and copy each file individually + for source_dir, _, files in os.walk(source_path): + rel_path = os.path.relpath(source_dir, source_path) + # Purely cosmetical for debug output + if rel_path == '.': + dest_dir = dest_path + else: + dest_dir = os.path.join(dest_path, rel_path) + + for source_file in files: + file_source_path = os.path.join(source_dir, source_file) + file_dest_path = os.path.join(dest_dir, source_file) + self.copy_file(file_source_path, file_dest_path) diff --git a/verdandi/modules/commonassets.py b/verdandi/modules/commonassets.py new file mode 100644 index 0000000..36b9cad --- /dev/null +++ b/verdandi/modules/commonassets.py @@ -0,0 +1,8 @@ +#!/usr/bin/env python2 + +from verdandi.mixins.assetsmixin import AssetsMixin +from verdandi.mixins.messagemixin import MessageMixin +from verdandi.mixins.rendermixin import RenderMixin + +class CommonAssets(AssetsMixin, MessageMixin, RenderMixin): + pass diff --git a/verdandi/modules/page.py b/verdandi/modules/page.py index df67ea8..a99e0a3 100644 --- a/verdandi/modules/page.py +++ b/verdandi/modules/page.py @@ -6,9 +6,10 @@ import markdown from verdandi.mixins.templatemixin import TemplateMixin from verdandi.mixins.menuitemmixin import MenuItemMixin +from verdandi.mixins.assetsmixin import AssetsMixin from verdandi.constants import CONTENT_DIRECTORY -class Page(MenuItemMixin, TemplateMixin): +class Page(MenuItemMixin, TemplateMixin, AssetsMixin): title = "Page Title" content_file = "content.md"