|
|
@@ -14,7 +14,6 @@ namespace Astralis {
|
|
|
public abstract class MarkupTemplate : GLib.Object {
|
|
|
private Html.Doc* cached_doc = null;
|
|
|
private bool loaded = false;
|
|
|
- private GLib.Mutex mutex = GLib.Mutex();
|
|
|
|
|
|
/// <summary>
|
|
|
/// Returns the HTML markup string for this template.
|
|
|
@@ -45,41 +44,35 @@ namespace Astralis {
|
|
|
|
|
|
/// <summary>
|
|
|
/// Parses the template markup if not already loaded.
|
|
|
- /// Thread-safe: uses mutex to prevent double-parsing.
|
|
|
/// </summary>
|
|
|
private void ensure_loaded() throws GLib.Error {
|
|
|
- mutex.lock();
|
|
|
- try {
|
|
|
- if (loaded) {
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- string html = markup;
|
|
|
-
|
|
|
- int options = (int)(Html.ParserOption.RECOVER |
|
|
|
- Html.ParserOption.NOERROR |
|
|
|
- Html.ParserOption.NOWARNING |
|
|
|
- Html.ParserOption.NOBLANKS |
|
|
|
- Html.ParserOption.NONET);
|
|
|
-
|
|
|
- char[] buffer = html.to_utf8();
|
|
|
- cached_doc = Html.Doc.read_memory(buffer, buffer.length, "", "utf-8", options);
|
|
|
-
|
|
|
- if (cached_doc == null) {
|
|
|
- // Try parsing as a fragment wrapped in a basic structure
|
|
|
- string wrapped = "<!DOCTYPE html><html><head><meta charset=\"UTF-8\"/></head><body>%s</body></html>".printf(html);
|
|
|
- char[] wrapped_buffer = wrapped.to_utf8();
|
|
|
- cached_doc = Html.Doc.read_memory(wrapped_buffer, wrapped_buffer.length, "", "utf-8", options);
|
|
|
- }
|
|
|
-
|
|
|
- if (cached_doc == null) {
|
|
|
- throw new MarkupError.PARSE_ERROR("Failed to parse template markup");
|
|
|
- }
|
|
|
-
|
|
|
- loaded = true;
|
|
|
- } finally {
|
|
|
- mutex.unlock();
|
|
|
+ if (loaded) {
|
|
|
+ return;
|
|
|
}
|
|
|
+
|
|
|
+ string html = markup;
|
|
|
+
|
|
|
+ int options = (int)(Html.ParserOption.RECOVER |
|
|
|
+ Html.ParserOption.NOERROR |
|
|
|
+ Html.ParserOption.NOWARNING |
|
|
|
+ Html.ParserOption.NOBLANKS |
|
|
|
+ Html.ParserOption.NONET);
|
|
|
+
|
|
|
+ char[] buffer = html.to_utf8();
|
|
|
+ cached_doc = Html.Doc.read_memory(buffer, buffer.length, "", "utf-8", options);
|
|
|
+
|
|
|
+ if (cached_doc == null) {
|
|
|
+ // Try parsing as a fragment wrapped in a basic structure
|
|
|
+ string wrapped = "<!DOCTYPE html><html><head><meta charset=\"UTF-8\"/></head><body>%s</body></html>".printf(html);
|
|
|
+ char[] wrapped_buffer = wrapped.to_utf8();
|
|
|
+ cached_doc = Html.Doc.read_memory(wrapped_buffer, wrapped_buffer.length, "", "utf-8", options);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (cached_doc == null) {
|
|
|
+ throw new MarkupError.PARSE_ERROR("Failed to parse template markup");
|
|
|
+ }
|
|
|
+
|
|
|
+ loaded = true;
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
@@ -130,13 +123,11 @@ namespace Astralis {
|
|
|
/// Useful if the template source may have changed.
|
|
|
/// </summary>
|
|
|
public void invalidate() {
|
|
|
- mutex.lock();
|
|
|
if (cached_doc != null) {
|
|
|
delete cached_doc;
|
|
|
cached_doc = null;
|
|
|
}
|
|
|
loaded = false;
|
|
|
- mutex.unlock();
|
|
|
}
|
|
|
|
|
|
~MarkupTemplate() {
|