Mercurial > piecrust2
changeset 25:65ae19c4e8a3
Copy page assets to bake output, use correct slashes when serving assets.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Tue, 19 Aug 2014 11:07:42 -0700 |
parents | 644869022b6e |
children | 3701daa97927 |
files | piecrust/baking/baker.py piecrust/data/assetor.py piecrust/rendering.py |
diffstat | 3 files changed, 48 insertions(+), 13 deletions(-) [+] |
line wrap: on
line diff
--- a/piecrust/baking/baker.py Tue Aug 19 11:06:48 2014 -0700 +++ b/piecrust/baking/baker.py Tue Aug 19 11:07:42 2014 -0700 @@ -1,10 +1,11 @@ import time import os.path import codecs -import urllib.request, urllib.error, urllib.parse +import shutil import hashlib import logging import threading +import urllib.request, urllib.error, urllib.parse from queue import Queue, Empty from piecrust.baking.records import TransitionalBakeRecord, BakeRecordPageEntry from piecrust.chefutil import format_timed @@ -21,13 +22,14 @@ class PageBaker(object): def __init__(self, app, out_dir, force=False, record=None, - copy_assets=False): + copy_assets=True): self.app = app self.out_dir = out_dir self.force = force self.record = record self.force = force self.copy_assets = copy_assets + self.site_root = app.config.get('site/root') self.pretty_urls = app.config.get('site/pretty_urls') self.pagination_suffix = app.config.get('site/pagination_suffix') @@ -158,6 +160,26 @@ raise Exception("Error baking page '%s' for URI '%s'." % (page.ref_spec, uri)) from ex + # Copy page assets. + if (cur_sub == 1 and self.copy_assets and + ctx.used_assets is not None): + if self.pretty_urls: + out_assets_dir = os.path.dirname(out_path) + else: + out_assets_dir, out_name = os.path.split(out_path) + if sub_uri != self.site_root: + out_name_noext, _ = os.path.splitext(out_name) + out_assets_dir += out_name_noext + + logger.debug("Copying page assets to: %s" % out_assets_dir) + if not os.path.isdir(out_assets_dir): + os.makedirs(out_assets_dir, 0o755) + for ap in ctx.used_assets._getAssetPaths(): + dest_ap = os.path.join(out_assets_dir, os.path.basename(ap)) + logger.debug(" %s -> %s" % (ap, dest_ap)) + shutil.copy(ap, dest_ap) + + # Record what we did and figure out if we have more work. cur_record_entry.out_uris.append(sub_uri) cur_record_entry.out_paths.append(out_path) cur_record_entry.used_source_names |= ctx.used_source_names
--- a/piecrust/data/assetor.py Tue Aug 19 11:06:48 2014 -0700 +++ b/piecrust/data/assetor.py Tue Aug 19 11:07:42 2014 -0700 @@ -14,7 +14,7 @@ def build_base_url(app, uri, assets_path): base_url_format = app.env.base_asset_url_format site_root = app.config.get('site/root') - rel_path = os.path.relpath(assets_path, app.root_dir) + rel_path = os.path.relpath(assets_path, app.root_dir).replace('\\', '/') pretty = app.config.get('site/pretty_urls') if not pretty: uri, _ = os.path.splitext(uri) @@ -44,17 +44,21 @@ def __getattr__(self, name): try: self._cacheAssets() - return self._cache[name] + return self._cache[name][0] except KeyError: raise AttributeError() def __getitem__(self, key): self._cacheAssets() - return self._cache[key] + return self._cache[key][0] def __iter__(self): self._cacheAssets() - return iter(self._cache.values()) + return map(lambda i: i[0], self._cache.values()) + + def _getAssetPaths(self): + self._cacheAssets() + return map(lambda i: i[1], self._cache.values()) def _debugRenderAssetNames(self): self._cacheAssets() @@ -71,11 +75,19 @@ return base_url = build_base_url(self._page.app, self._uri, assets_dir) - for _, __, filenames in os.walk(assets_dir): - for fn in filenames: - name, ext = os.path.splitext(fn) - if name in self._cache: - raise UnsupportedAssetsError( - "Multiple asset files are named '%s'." % name) - self._cache[name] = base_url + fn + for fn in os.listdir(assets_dir): + full_fn = os.path.join(assets_dir, fn) + if not os.path.isfile(full_fn): + raise Exception("Skipping: %s" % full_fn) + continue + name, ext = os.path.splitext(fn) + if name in self._cache: + raise UnsupportedAssetsError( + "Multiple asset files are named '%s'." % name) + self._cache[name] = (base_url + fn, full_fn) + + cpi = self._page.app.env.exec_info_stack.current_page_info + if cpi is not None: + cpi.render_ctx.used_assets = self +
--- a/piecrust/rendering.py Tue Aug 19 11:06:48 2014 -0700 +++ b/piecrust/rendering.py Tue Aug 19 11:07:42 2014 -0700 @@ -42,6 +42,7 @@ self.pagination_filter = None self.custom_data = None self.use_cache = False + self.used_assets = None self.used_pagination = None self.used_source_names = set() self.used_taxonomy_terms = set()