25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

89 lines
2.9 KiB

  1. # Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
  2. # MIT License. See license.txt
  3. from __future__ import unicode_literals
  4. import frappe
  5. from frappe.utils import strip_html
  6. from frappe import _
  7. from frappe.website.utils import scrub_relative_urls
  8. from jinja2.utils import concat
  9. from jinja2 import meta
  10. import re
  11. def render_blocks(context):
  12. """returns a dict of block name and its rendered content"""
  13. out = {}
  14. env = frappe.get_jenv()
  15. def _render_blocks(template_path):
  16. source = frappe.local.jloader.get_source(frappe.local.jenv, template_path)[0]
  17. for referenced_template_path in meta.find_referenced_templates(env.parse(source)):
  18. if referenced_template_path:
  19. _render_blocks(referenced_template_path)
  20. template = frappe.get_template(template_path)
  21. for block, render in template.blocks.items():
  22. out[block] = scrub_relative_urls(concat(render(template.new_context(context))))
  23. _render_blocks(context["template"])
  24. # default blocks if not found
  25. if "title" not in out and out.get("header"):
  26. out["title"] = out["header"]
  27. if "title" not in out:
  28. out["title"] = context.get("title")
  29. if not out.get("header") and "<h1" not in out.get("content", "") \
  30. and not "<!-- no-header -->" in out.get("content"):
  31. if out.get("title"):
  32. out["header"] = out["title"]
  33. if out.get("header") and not out["header"].startswith("<h"):
  34. out["header"] = "<h1>" + out["header"] + "</h1>"
  35. if "breadcrumbs" not in out:
  36. out["breadcrumbs"] = scrub_relative_urls(
  37. frappe.get_template("templates/includes/breadcrumbs.html").render(context))
  38. if "meta_block" not in out:
  39. out["meta_block"] = frappe.get_template("templates/includes/meta_block.html").render(context)
  40. out["no_sidebar"] = context.get("no_sidebar", 0)
  41. if "<!-- no-sidebar -->" in out.get("content", ""):
  42. out["no_sidebar"] = 1
  43. if "<!-- title:" in out.get("content", ""):
  44. out["title"] = re.findall('<!-- title:([^>]*) -->', out.get("content"))[0].strip()
  45. if "{index}" in out.get("content", "") and context.get("children"):
  46. html = frappe.get_template("templates/includes/static_index.html").render({
  47. "items": context["children"]})
  48. out["content"] = out["content"].replace("{index}", html)
  49. if "{next}" in out.get("content", ""):
  50. next_item = context.doc.get_next()
  51. if next_item:
  52. if next_item.name[0]!="/": next_item.name = "/" + next_item.name
  53. html = '<p><br><a href="{name}">'+_("Next")+': {title}</a></p>'.format(**next_item)
  54. out["content"] = out["content"].replace("{next}", html)
  55. if "sidebar" not in out and not out.get("no_sidebar"):
  56. out["sidebar"] = scrub_relative_urls(
  57. frappe.get_template("templates/includes/sidebar.html").render(context))
  58. out["title"] = strip_html(out.get("title") or "")
  59. # remove style and script tags from blocks
  60. out["style"] = re.sub("</?style[^<>]*>", "", out.get("style") or "")
  61. out["script"] = re.sub("</?script[^<>]*>", "", out.get("script") or "")
  62. return out