Index: cms/bin/generate_static_pages.py |
diff --git a/cms/bin/generate_static_pages.py b/cms/bin/generate_static_pages.py |
index 242dc0128fbeeacac98ff5897144823285c82bae..f0fccc22055fe0540a772e05671446a44f5f3b03 100644 |
--- a/cms/bin/generate_static_pages.py |
+++ b/cms/bin/generate_static_pages.py |
@@ -19,6 +19,8 @@ import errno |
import codecs |
import ConfigParser |
import logging |
+import lxml.html |
+ |
from argparse import ArgumentParser |
from cms.utils import get_page_params, process_page |
@@ -27,7 +29,7 @@ from cms.sources import create_source |
MIN_TRANSLATED = 0.3 |
-def generate_pages(repo, output_dir, revision): |
+def generate_pages(repo, output_dir, revision, relative): |
known_files = set() |
def write_file(path_parts, contents, binary=False): |
@@ -90,15 +92,43 @@ def generate_pages(repo, output_dir, revision): |
source.has_locale = has_locale |
source.resolve_link.cache_clear() |
+ def rewrite_link(link): |
Vasily Kuznetsov
2017/11/14 17:30:27
This seems like it would work but the links would
|
+ if link.startswith('/'): |
+ if source.version: |
+ link += '?' + source.version |
+ if relative: |
+ depth = len(page.split('/')) |
+ link = '/'.join(['..'] * depth) + link |
+ return link |
+ |
# Second pass: actually generate pages this time |
for locale, page in pagelist: |
pagedata = process_page(source, locale, page) |
- # Make sure links to static files are versioned |
- pagedata = re.sub(r'(<script\s[^<>]*\bsrc="/[^"<>]+)', r'\1?%s' % source.version, pagedata) |
- pagedata = re.sub(r'(<link\s[^<>]*\bhref="/[^"<>]+)', r'\1?%s' % source.version, pagedata) |
- pagedata = re.sub(r'(<img\s[^<>]*\bsrc="/[^"<>]+)', r'\1?%s' % source.version, pagedata) |
- |
+ root = lxml.html.fromstring(pagedata).getroottree() |
+ |
+ expr = '//img[@src|@srcset]|//script[@src]|//link[@href]|//a[@href]' |
+ for elem in root.xpath(expr): |
+ if 'srcset' in elem.attrib: |
+ srcset = [] |
+ for src_zoom in elem.attrib['srcset'].split(', '): |
Vasily Kuznetsov
2017/11/14 17:30:28
Is the space after the comma mandatory? Otherwise
|
+ try: |
+ src, zoom = src_zoom.split(' ') |
+ except ValueError: |
+ src = src_zoom |
+ zoom = None |
+ res = rewrite_link(src) |
+ if zoom: |
+ res = res + ' ' + zoom |
+ srcset.append(res) |
+ |
+ elem.attrib['srcset'] = ', '.join(srcset) |
+ |
+ for key in ['src', 'href']: |
+ if key in elem.attrib: |
+ elem.attrib[key] = rewrite_link(elem.attrib[key]) |
+ |
+ pagedata = lxml.html.tostring(root, encoding='unicode') |
write_file([locale] + page.split('/'), pagedata) |
for filename in source.list_localizable_files(): |
@@ -129,7 +159,8 @@ if __name__ == '__main__': |
help=('Specify which revision to generate from. ' |
'See "hg help revisions" for details.'), |
default='default') |
+ parser.add_argument('--relative', action='store_true', default=False) |
parser.add_argument('source', help="Path to website's repository") |
parser.add_argument('output', help='Path to desired output directory') |
args = parser.parse_args() |
- generate_pages(args.source, args.output, args.rev) |
+ generate_pages(args.source, args.output, args.rev, args.relative) |