aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--data/themes/default/templates/page.html2
-rw-r--r--data/themes/default/templates/project.html24
-rw-r--r--src/guff/models/page.cr14
-rw-r--r--src/guff/models/project.cr16
-rw-r--r--src/guff/template.cr1
-rw-r--r--src/guff/views/page.cr51
-rw-r--r--src/guff/views/project.cr14
-rw-r--r--src/guff/views/template-html.cr47
8 files changed, 119 insertions, 50 deletions
diff --git a/data/themes/default/templates/page.html b/data/themes/default/templates/page.html
index 5b64509..24f2290 100644
--- a/data/themes/default/templates/page.html
+++ b/data/themes/default/templates/page.html
@@ -9,7 +9,7 @@
%{styles}
</head>
- <body>
+ <body class='guff-page'>
<div class='post'>
<b>page: %{name | h}</b><br/>
<b>
diff --git a/data/themes/default/templates/project.html b/data/themes/default/templates/project.html
new file mode 100644
index 0000000..c62227a
--- /dev/null
+++ b/data/themes/default/templates/project.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<html lang='en-US'>
+ <head>
+ <meta charset="utf-8"/>
+ <title>Project: %{name | h}</title>
+
+ %{styles}
+ </head>
+
+ <body class='guff-project'>
+ <b>Project: %{name | h}</b><br/>
+ %{body}
+
+ <p>
+ Repo URL: <a
+ href='%{repo_url|h}'
+ title='View %{name|h} Git repository.'
+ >%{repo_url|h}</a>
+ </p>
+ </div>
+ </body>
+
+ %{scripts}
+</html>
diff --git a/src/guff/models/page.cr b/src/guff/models/page.cr
index e85c484..6cca2be 100644
--- a/src/guff/models/page.cr
+++ b/src/guff/models/page.cr
@@ -33,7 +33,8 @@ class Guff::Models::PageModel < Guff::Models::Model
e.user_id,
e.name AS user_name,
c.theme_id,
- a.theme_id AS site_theme_id
+ COALESCE(c.theme_id, a.theme_id) AS active_theme_id,
+ COALESCE(f.theme_slug, g.theme_slug) active_theme_slug
FROM sites a
JOIN posts b
@@ -44,6 +45,10 @@ class Guff::Models::PageModel < Guff::Models::Model
ON (d.state_id = b.state_id)
JOIN users e
ON (e.user_id = b.created_by)
+ LEFT JOIN themes f
+ ON (f.theme_id = c.theme_id)
+ JOIN themes g
+ ON (g.theme_id = a.theme_id)
WHERE a.site_id = ?
AND b.slug = ?
@@ -85,7 +90,8 @@ class Guff::Models::PageModel < Guff::Models::Model
a.name,
a.body,
b.theme_id,
- d.theme_id AS site_theme_id
+ COALESCE(b.theme_id, d.theme_id) AS active_theme_id,
+ COALESCE(e.theme_slug, f.theme_slug) active_theme_slug
FROM posts a
JOIN pages b
@@ -94,6 +100,10 @@ class Guff::Models::PageModel < Guff::Models::Model
ON (c.state_id = a.state_id)
JOIN sites d
ON (d.site_id = a.site_id)
+ LEFT JOIN themes e
+ ON (e.theme_id = b.theme_id)
+ JOIN themes f
+ ON (f.theme_id = d.theme_id)
WHERE a.post_id = ?
",
diff --git a/src/guff/models/project.cr b/src/guff/models/project.cr
index 32be435..2aa08ae 100644
--- a/src/guff/models/project.cr
+++ b/src/guff/models/project.cr
@@ -12,6 +12,8 @@ class Guff::Models::ProjectModel < Guff::Models::Model
ON (d.state_id = b.state_id)
JOIN users e
ON (e.user_id = b.created_by)
+ JOIN themes f
+ ON (f.theme_id = a.theme_id)
WHERE a.site_id = ?
AND b.slug = ?
@@ -30,7 +32,9 @@ class Guff::Models::ProjectModel < Guff::Models::Model
b.body,
c.repo_url,
e.user_id,
- e.name AS user_name
+ e.name AS user_name,
+ a.theme_id,
+ f.theme_slug
FROM sites a
JOIN posts b
@@ -41,6 +45,8 @@ class Guff::Models::ProjectModel < Guff::Models::Model
ON (d.state_id = b.state_id)
JOIN users e
ON (e.user_id = b.created_by)
+ JOIN themes f
+ ON (f.theme_id = a.theme_id)
WHERE a.site_id = ?
AND b.slug = ?
@@ -74,13 +80,19 @@ class Guff::Models::ProjectModel < Guff::Models::Model
a.slug_lock,
a.name,
a.body,
- b.repo_url
+ b.repo_url,
+ d.theme_id,
+ e.theme_slug
FROM posts a
JOIN projects b
ON (b.post_id = a.post_id)
JOIN states c
ON (c.state_id = a.state_id)
+ JOIN sites d
+ ON (d.site_id = a.site_id)
+ JOIN themes e
+ ON (e.theme_id = d.theme_id)
WHERE a.post_id = ?
",
diff --git a/src/guff/template.cr b/src/guff/template.cr
index c784a90..c69ec90 100644
--- a/src/guff/template.cr
+++ b/src/guff/template.cr
@@ -166,7 +166,6 @@ class Guff::Template
private def parse(string : String) : Array(Ops::Op)
r = string.scan(SCAN_RE).map do |md|
- p md
if md["text"]?
Ops::LiteralOp.new(md["text"])
else
diff --git a/src/guff/views/page.cr b/src/guff/views/page.cr
index dc628b3..7d386c2 100644
--- a/src/guff/views/page.cr
+++ b/src/guff/views/page.cr
@@ -1,43 +1,14 @@
-class Guff::Views::PageView < Guff::Views::HTMLView
- def initialize(context : Context, @item : Hash(String, String))
- super(context)
-
- # get theme id
- @theme_id = @item[%w{theme_id site_theme_id}.find { |k|
- @item[k]? && @item[k].size > 0
- }].not_nil!.to_i32 as Int32
-
- # get theme slug, assets, and templates
- @theme_slug = @context.models.theme.get(@theme_id)["theme_slug"] as String
- @theme_assets = @context.models.theme.assets(@theme_id) as Theme::Assets
- @theme_templates = @context.models.theme.templates(@theme_id) as Template::Cache
-
- # get page assets
- @page_assets = @context.models.page.assets(@item["post_id"].to_i64) as Theme::Assets
- end
-
- private def scripts
- super(@theme_assets.scripts.map { |val|
- theme_asset_path(val)
- } + @page_assets.scripts)
- end
+require "./template-html"
- private def styles
- super(@theme_assets.styles.map { |val|
- theme_asset_path(val)
- } + @page_assets.styles)
- end
-
- THEME_ASSET_PATH = "/guff/themes/%s/%s"
-
- private def theme_asset_path(asset_path : String)
- THEME_ASSET_PATH % [@theme_slug, asset_path]
- end
-
- def to_s(io)
- @theme_templates["page.html"].run(io, @item.merge({
- "scripts" => scripts,
- "styles" => styles,
- }))
+class Guff::Views::PageView < Guff::Views::TemplateHTMLView
+ def initialize(context : Context, @item : Hash(String, String))
+ super(
+ context: context,
+ theme_id: @item["active_theme_id"].not_nil!.to_i32 as Int32,
+ theme_slug: @item["active_theme_slug"].not_nil!.to_s as String,
+ template_id: "page.html",
+ data: @item,
+ extra_assets: context.models.page.assets(@item["post_id"].to_i64) as Theme::Assets,
+ )
end
end
diff --git a/src/guff/views/project.cr b/src/guff/views/project.cr
index e0d9bc0..fc91b5c 100644
--- a/src/guff/views/project.cr
+++ b/src/guff/views/project.cr
@@ -1,7 +1,13 @@
-class Guff::Views::ProjectView < Guff::Views::HTMLView
+require "./template-html"
+
+class Guff::Views::ProjectView < Guff::Views::TemplateHTMLView
def initialize(context : Context, @item : Hash(String, String))
- super(context)
+ super(
+ context: context,
+ theme_id: @item["theme_id"].not_nil!.to_i32 as Int32,
+ theme_slug: @item["theme_slug"].not_nil!.to_s as String,
+ template_id: "project.html",
+ data: @item,
+ )
end
-
- ECR.def_to_s("src/views/project.ecr")
end
diff --git a/src/guff/views/template-html.cr b/src/guff/views/template-html.cr
new file mode 100644
index 0000000..6ad5859
--- /dev/null
+++ b/src/guff/views/template-html.cr
@@ -0,0 +1,47 @@
+class Guff::Views::TemplateHTMLView < Guff::Views::HTMLView
+ getter :theme_templates
+
+ def initialize(
+ context : Context,
+ @theme_id : Int32,
+ @theme_slug : String,
+ @template_id : String,
+ @data : Hash(String, String),
+ @extra_assets : Theme::Assets? = nil,
+ )
+ super(context)
+
+ # get theme assets and templates
+ @theme_assets = @context.models.theme.assets(@theme_id) as Theme::Assets
+ @theme_templates = @context.models.theme.templates(@theme_id) as Template::Cache
+ end
+
+ def scripts
+ theme_scripts = @theme_assets.scripts.map { |val|
+ theme_asset_path(val)
+ }
+
+ super(@extra_assets ? theme_scripts + @extra_assets.not_nil!.scripts : theme_scripts)
+ end
+
+ def styles
+ theme_styles = @theme_assets.styles.map { |val|
+ theme_asset_path(val)
+ }
+
+ super(@extra_assets ? theme_styles + @extra_assets.not_nil!.styles : theme_styles)
+ end
+
+ THEME_ASSET_PATH = "/guff/themes/%s/%s"
+
+ private def theme_asset_path(asset_path : String)
+ THEME_ASSET_PATH % [@theme_slug, asset_path]
+ end
+
+ def to_s(io : IO)
+ @theme_templates[@template_id].run(io, {
+ "scripts" => scripts,
+ "styles" => styles,
+ }.merge!(@data))
+ end
+end