diff options
-rw-r--r-- | org/madore/damlengine/TodoDamlElement.java | 9 | ||||
-rw-r--r-- | org/madore/damlengine/TodoElement.java | 1 | ||||
-rw-r--r-- | org/madore/damlengine/TodoEmailAtOrDotElement.java | 14 | ||||
-rw-r--r-- | org/madore/damlengine/TodoEmailDespammedElement.java | 24 | ||||
-rw-r--r-- | org/madore/damlengine/TodoFooter.java | 31 | ||||
-rw-r--r-- | org/madore/damlengine/TodoWXrefAttr.java | 4 | ||||
-rw-r--r-- | org/madore/damlengine/TodoWeblogSelectionElement.java | 8 | ||||
-rw-r--r-- | org/madore/damlengine/WeblogDatabaseConnection.java | 5 | ||||
-rw-r--r-- | org/madore/damlengine/WeblogSelect.java | 2 | ||||
-rw-r--r-- | org/madore/damlengine/WeblogServlet.java | 9 | ||||
-rw-r--r-- | org/madore/damlengine/cmdlines | 2 |
11 files changed, 82 insertions, 27 deletions
diff --git a/org/madore/damlengine/TodoDamlElement.java b/org/madore/damlengine/TodoDamlElement.java index 50c39bb..7cd94e3 100644 --- a/org/madore/damlengine/TodoDamlElement.java +++ b/org/madore/damlengine/TodoDamlElement.java @@ -58,7 +58,12 @@ public final class TodoDamlElement extends TodoDefaultElement { Element bodyNode = ctx.doc.createElementNS(DamlEngine.XHTML_NS, "body"); htmlNode.appendChild(bodyNode); htmlNode.appendChild(ctx.doc.createTextNode("\n")); - bodyNode.setAttributeNS(null, "onload", "onLoad()"); + bodyNode.setAttributeNS(null, "onload", "if (onLoad) { onLoad(); }"); + Element earlyScript = ctx.doc.createElementNS(DamlEngine.XHTML_NS, "script"); + earlyScript.setAttributeNS(null, "type", "text/javascript"); + earlyScript.appendChild(ctx.doc.createTextNode("if (onEarly) { onEarly(); }")); + bodyNode.appendChild(ctx.doc.createTextNode("\n")); + bodyNode.appendChild(earlyScript); ctx.gc.styleContent = new StringBuffer(); try { @@ -113,7 +118,7 @@ public final class TodoDamlElement extends TodoDefaultElement { final WeblogSummary wsum = WeblogSummary.getSummary(ctx.dc); if ( wsum != null ) { final WeblogSummary.EntrySummary esum - = wsum.entries.get(new Integer(((Context.WeblogSingleSelectionContext)(ctx.wsc)).number)); + = wsum.entries.get(Integer.valueOf(((Context.WeblogSingleSelectionContext)(ctx.wsc)).number)); if ( esum != null && esum.title != null ) { meta = ctx.doc.createElementNS(DamlEngine.XHTML_NS, "meta"); meta.setAttributeNS(null, "name", "twitter:title"); diff --git a/org/madore/damlengine/TodoElement.java b/org/madore/damlengine/TodoElement.java index 0cc7880..818fe2b 100644 --- a/org/madore/damlengine/TodoElement.java +++ b/org/madore/damlengine/TodoElement.java @@ -46,6 +46,7 @@ public abstract class TodoElement extends TodoItem { damlFactories.put("email-despammed", new TodoEmailDespammedElement.Factory()); damlFactories.put("email-at", new TodoEmailAtOrDotElement.Factory(TodoEmailAtOrDotElement.Type.AT)); damlFactories.put("email-dot", new TodoEmailAtOrDotElement.Factory(TodoEmailAtOrDotElement.Type.DOT)); + damlFactories.put("email-plus", new TodoEmailAtOrDotElement.Factory(TodoEmailAtOrDotElement.Type.PLUS)); damlFactories.put("extra-style", new TodoExtraStyleOrScriptElement.Factory(TodoStyleOrScript.Type.STYLE)); damlFactories.put("extra-script", new TodoExtraStyleOrScriptElement.Factory(TodoStyleOrScript.Type.SCRIPT)); damlFactories.put("smiley-smile", new TodoSmileyElement.Factory(TodoSmileyElement.Type.SMILE)); diff --git a/org/madore/damlengine/TodoEmailAtOrDotElement.java b/org/madore/damlengine/TodoEmailAtOrDotElement.java index 6597291..e970264 100644 --- a/org/madore/damlengine/TodoEmailAtOrDotElement.java +++ b/org/madore/damlengine/TodoEmailAtOrDotElement.java @@ -6,7 +6,12 @@ public final class TodoEmailAtOrDotElement extends TodoDefaultElement { public enum Type { AT("commercial-at", "commercial_at.png", "at sign", "arobase"), - DOT("full-stop", "full_stop.png", "dot", "point"); + DOT("full-stop", "full_stop.png", "dot", "point"), + PLUS("plus-sign", "plus_sign.png", "plus", "plus"); + // Images generated with: + // convert -size 16x20 'xc:transparent' -font 'Source-Code-Pro' -pointsize 20 -gravity South -annotate 0 '@' ~/public_html/images/commercial_at.png + // convert -size 16x20 'xc:transparent' -font 'Source-Code-Pro' -pointsize 20 -gravity South -annotate 0 '.' ~/public_html/images/full_stop.png + // convert -size 16x20 'xc:transparent' -font 'Source-Code-Pro' -pointsize 20 -gravity South -annotate 0 '+' ~/public_html/images/plus_sign.png final String charName; final String imgName; final String enName; @@ -59,16 +64,13 @@ public final class TodoEmailAtOrDotElement extends TodoDefaultElement { LangHelper.setLangNorec(span0, expLang); span0.setAttributeNS(null, "class", "replace-"+t.charName); node.getParentNode().replaceChild(span0, node); - Element span1 = ctx.doc.createElementNS(DamlEngine.XHTML_NS, "span"); - span1.setAttributeNS(null, "class", "subreplace-"+t.charName); - span0.appendChild(span1); Element img = ctx.doc.createElementNS(DamlEngine.XHTML_NS, "img"); img.setAttributeNS(null, "src", (ctx.gc.uriToTop==null?"":ctx.gc.uriToTop)+"images/"+t.imgName); img.setAttributeNS(null, "alt", "["+(lang.equals("fr")?t.frName:t.enName)+"]"); - img.setAttributeNS(null, "height", "15"); + img.setAttributeNS(null, "height", "20"); img.setAttributeNS(null, "width", "16"); - span1.appendChild(img); + span0.appendChild(img); } } diff --git a/org/madore/damlengine/TodoEmailDespammedElement.java b/org/madore/damlengine/TodoEmailDespammedElement.java index 9d393ed..13dce54 100644 --- a/org/madore/damlengine/TodoEmailDespammedElement.java +++ b/org/madore/damlengine/TodoEmailDespammedElement.java @@ -23,24 +23,36 @@ public final class TodoEmailDespammedElement extends TodoDefaultElement { @Override public void handleNodeOnly() { Element out0 = ctx.doc.createElementNS(DamlEngine.XHTML_NS, "code"); + Element out; + if ( node.getAttributeNS(null, "nolink").equals("") ) { + out = ctx.doc.createElementNS(DamlEngine.XHTML_NS, "a"); + out.appendChild(out0); + out.setAttributeNS(null, "class", "despammed-address"); + } else + out = out0; String lang = LangHelper.getLangNorec(node); if ( lang != null ) - LangHelper.setLangNorec(out0, lang); - Element out1 = ctx.doc.createElementNS(DamlEngine.XHTML_NS, "a"); - out0.appendChild(out1); - out1.setAttributeNS(null, "class", "despammed-address"); + LangHelper.setLangNorec(out, lang); + { + String classAtt = node.getAttributeNS(null, "class"); + if ( ! classAtt.equals("") ) + out0.setAttributeNS(null, "class", + "despammed-email "+classAtt); + else + out0.setAttributeNS(null, "class", "despammed-email"); + } ArrayList<Node> childList = getChildList(node); ArrayList<TodoElement> toProcess = new ArrayList<TodoElement>(childList.size()+8); for ( Node child : childList ) { - out1.appendChild(child); + out0.appendChild(child); if ( child.getNodeType() == Node.ELEMENT_NODE ) { TodoElement it = TodoElement.getTodoElement((Element)child, this.ctx, this); toProcess.add(it); } } - node.getParentNode().replaceChild(out0, node); + node.getParentNode().replaceChild(out, node); this.ownerDeque.registerAtStart(toProcess); } diff --git a/org/madore/damlengine/TodoFooter.java b/org/madore/damlengine/TodoFooter.java index ca46a83..cace28c 100644 --- a/org/madore/damlengine/TodoFooter.java +++ b/org/madore/damlengine/TodoFooter.java @@ -22,6 +22,11 @@ public final class TodoFooter extends TodoElement { Element hr = ctx.doc.createElementNS(DamlEngine.XHTML_NS, "hr"); footer.appendChild(hr); footer.appendChild(ctx.doc.createTextNode("\n")); + Element jsFootSpace = ctx.doc.createElementNS(DamlEngine.XHTML_NS, "div"); + footer.appendChild(jsFootSpace); + footer.appendChild(ctx.doc.createTextNode("\n")); + jsFootSpace.setAttributeNS(null, "id", "js-foot-space"); + jsFootSpace.appendChild(ctx.doc.createComment(" To be filled by JavaScript ")); Element addr = ctx.doc.createElementNS(DamlEngine.XHTML_NS, "address"); footer.appendChild(addr); footer.appendChild(ctx.doc.createTextNode("\n")); @@ -38,11 +43,14 @@ public final class TodoFooter extends TodoElement { addr.appendChild(ctx.doc.createTextNode(" (")); Element email = ctx.doc.createElementNS(DamlEngine.DAML_NS, "d:email-despammed"); addr.appendChild(email); - email.appendChild(ctx.doc.createTextNode("david+www")); + email.appendChild(ctx.doc.createTextNode("david")); + email.appendChild(ctx.doc.createElementNS(DamlEngine.DAML_NS, "d:email-plus")); + email.appendChild(ctx.doc.createTextNode("www")); email.appendChild(ctx.doc.createElementNS(DamlEngine.DAML_NS, "d:email-at")); email.appendChild(ctx.doc.createTextNode("madore")); email.appendChild(ctx.doc.createElementNS(DamlEngine.DAML_NS, "d:email-dot")); email.appendChild(ctx.doc.createTextNode("org")); + addr.appendChild(ctx.doc.createElementNS(DamlEngine.XHTML_NS, "wbr")); addr.appendChild(ctx.doc.createTextNode("|")); a = ctx.doc.createElementNS(DamlEngine.XHTML_NS, "a"); a.setAttributeNS(null, "href", @@ -51,22 +59,39 @@ public final class TodoFooter extends TodoElement { a.setAttributeNS(null, "rel", "author"); addr.appendChild(a); a.appendChild(ctx.doc.createTextNode("\u2042")); + // addr.appendChild(ctx.doc.createElementNS(DamlEngine.XHTML_NS, "wbr")); // addr.appendChild(ctx.doc.createTextNode("|")); // a = ctx.doc.createElementNS(DamlEngine.XHTML_NS, "a"); // a.setAttributeNS(null, "href", "https://plus.google.com/+davidamadore"); // a.setAttributeNS(null, "rel", "author"); // addr.appendChild(a); // a.appendChild(ctx.doc.createTextNode("Google+")); + addr.appendChild(ctx.doc.createElementNS(DamlEngine.XHTML_NS, "wbr")); addr.appendChild(ctx.doc.createTextNode("|")); a = ctx.doc.createElementNS(DamlEngine.XHTML_NS, "a"); a.setAttributeNS(null, "href", "https://twitter.com/gro_tsen"); - a.setAttributeNS(null, "rel", "author"); + a.setAttributeNS(null, "rel", "me"); addr.appendChild(a); a.appendChild(ctx.doc.createTextNode("Twitter")); + addr.appendChild(ctx.doc.createElementNS(DamlEngine.XHTML_NS, "wbr")); + addr.appendChild(ctx.doc.createTextNode("|")); + a = ctx.doc.createElementNS(DamlEngine.XHTML_NS, "a"); + a.setAttributeNS(null, "href", "https://bsky.app/profile/gro-tsen.bsky.social"); + a.setAttributeNS(null, "rel", "me"); + addr.appendChild(a); + a.appendChild(ctx.doc.createTextNode("Bluesky")); + addr.appendChild(ctx.doc.createElementNS(DamlEngine.XHTML_NS, "wbr")); + addr.appendChild(ctx.doc.createTextNode("|")); + a = ctx.doc.createElementNS(DamlEngine.XHTML_NS, "a"); + a.setAttributeNS(null, "href", "https://mastodon.sdf.org/@gro_tsen_test"); + a.setAttributeNS(null, "rel", "me"); + addr.appendChild(a); + a.appendChild(ctx.doc.createTextNode("Mastodon (test)")); + addr.appendChild(ctx.doc.createElementNS(DamlEngine.XHTML_NS, "wbr")); addr.appendChild(ctx.doc.createTextNode("|")); a = ctx.doc.createElementNS(DamlEngine.XHTML_NS, "a"); a.setAttributeNS(null, "href", "http://www.facebook.com/grotsen"); - a.setAttributeNS(null, "rel", "author"); + a.setAttributeNS(null, "rel", "me"); addr.appendChild(a); a.appendChild(ctx.doc.createTextNode("Facebook")); addr.appendChild(ctx.doc.createTextNode(")")); diff --git a/org/madore/damlengine/TodoWXrefAttr.java b/org/madore/damlengine/TodoWXrefAttr.java index 2f0ca3c..68e5c54 100644 --- a/org/madore/damlengine/TodoWXrefAttr.java +++ b/org/madore/damlengine/TodoWXrefAttr.java @@ -30,9 +30,9 @@ public class TodoWXrefAttr extends TodoAttr { + (wxrefStr.equals("##weblog-selection-older") ? -1 : 1); WeblogSummary sum = WeblogSummary.getSummary(ctx.dc); if ( sum != null && sum.entries != null - && sum.entries.containsKey(new Integer(trgt)) ) { + && sum.entries.containsKey(Integer.valueOf(trgt)) ) { WeblogSummary.EntrySummary ent - = sum.entries.get(new Integer(trgt)); + = sum.entries.get(Integer.valueOf(trgt)); String target = "#d." + ent.date + "." + String.format("%04d", ent.id); this.owner.removeAttributeNode(this.attr); diff --git a/org/madore/damlengine/TodoWeblogSelectionElement.java b/org/madore/damlengine/TodoWeblogSelectionElement.java index 8072061..3029f9f 100644 --- a/org/madore/damlengine/TodoWeblogSelectionElement.java +++ b/org/madore/damlengine/TodoWeblogSelectionElement.java @@ -79,6 +79,8 @@ public final class TodoWeblogSelectionElement extends TodoDefaultElement { categoryNames.get("en").put("lang", "Languages & Linguistics"); categoryNames.get("fr").put("lang", "Langues & Linguistique"); categoryNames.get("ia").put("lang", "Liguas & Linguistica"); + categoryNames.get("en").put("meteo", "Meteorology"); + categoryNames.get("fr").put("meteo", "M\u00e9t\u00e9orologie"); categoryNames.get("en").put("unicode", "Unicode"); categoryNames.get("fr").put("unicode", "Unicode"); categoryNames.get("en").put("cinema", "Films & Movies"); @@ -94,6 +96,8 @@ public final class TodoWeblogSelectionElement extends TodoDefaultElement { categoryNames.get("fr").put("auto-moto", "Auto-Moto"); categoryNames.get("en").put("gardinia", "Parks & Gardens"); categoryNames.get("fr").put("gardinia", "Parcs & Jardins"); + categoryNames.get("en").put("covid-19", "Covid-19"); + categoryNames.get("fr").put("covid-19", "Covid-19"); categoryNames.get("en").put("meta", "Meta"); categoryNames.get("fr").put("meta", "M\u00e9ta"); } @@ -171,7 +175,7 @@ public final class TodoWeblogSelectionElement extends TodoDefaultElement { if ( wsum == null || wsum.entries == null ) throw new IllegalStateException("failed to obtain weblog summary for weblog-selection-single-title"); WeblogSummary.EntrySummary esum - = wsum.entries.get(new Integer(((Context.WeblogSingleSelectionContext)(ctx.wsc)).number)); + = wsum.entries.get(Integer.valueOf(((Context.WeblogSingleSelectionContext)(ctx.wsc)).number)); if ( esum == null ) throw new IllegalStateException("tried weblog-selection-single-title on inexistent entry"); { @@ -184,7 +188,7 @@ public final class TodoWeblogSelectionElement extends TodoDefaultElement { LSInput input = domi.createLSInput(); if ( esum.titleXml == null ) { // If there is no title, use number instead. - str = String.format("%04d", ((Context.WeblogSingleSelectionContext)(ctx.wsc)).number); + str = String.format("#%04d", ((Context.WeblogSingleSelectionContext)(ctx.wsc)).number); Node strNode = ctx.doc.createTextNode(str); span.appendChild(strNode); break; // Leave now! diff --git a/org/madore/damlengine/WeblogDatabaseConnection.java b/org/madore/damlengine/WeblogDatabaseConnection.java index 1a1828d..5d3c8a2 100644 --- a/org/madore/damlengine/WeblogDatabaseConnection.java +++ b/org/madore/damlengine/WeblogDatabaseConnection.java @@ -102,11 +102,14 @@ public final class WeblogDatabaseConnection { final String dbUrl = "jdbc:postgresql://"+dbHost+":"+dbPort+"/"+dbName; final Properties dbProps = new Properties(); + final Driver drv = new Driver(); dbProps.setProperty("user", dbUser); dbProps.setProperty("password", dbPass); dbProps.setProperty("ssl", "true"); + if ( drv.getMajorVersion() >= 42 ) + dbProps.setProperty("sslmode", "prefer"); dbProps.setProperty("sslfactory", "org.postgresql.ssl.NonValidatingFactory"); - conn = (new Driver()).connect(dbUrl, dbProps); + conn = drv.connect(dbUrl, dbProps); conn.createStatement().execute("SET TIME ZONE 0"); pconn.set(conn); } diff --git a/org/madore/damlengine/WeblogSelect.java b/org/madore/damlengine/WeblogSelect.java index 4e759cc..d6ede8b 100644 --- a/org/madore/damlengine/WeblogSelect.java +++ b/org/madore/damlengine/WeblogSelect.java @@ -48,7 +48,7 @@ public final class WeblogSelect { while ( selRes.next() ) { int id = selRes.getInt(1); String content = selRes.getString(2); - wsc.sel.add(new Integer(id)); + wsc.sel.add(Integer.valueOf(id)); wsc.xmlData.add(content); } diff --git a/org/madore/damlengine/WeblogServlet.java b/org/madore/damlengine/WeblogServlet.java index 0f7341c..86f231a 100644 --- a/org/madore/damlengine/WeblogServlet.java +++ b/org/madore/damlengine/WeblogServlet.java @@ -89,8 +89,10 @@ public class WeblogServlet extends HttpServlet { String specialName = selRes.getString(3); if ( id != number ) throw new ServletException("this cannot happen"); - if ( extra != null && ! extra.equals(specialName) ) - return new NoSuchPath(); + if ( ! ( ( extra == null && specialName == null ) + || ( extra != null && specialName != null + && extra.equals(specialName) ) ) ) + return new SingleBlogEntryRedirectPath(date, id, specialName); long lastModified = (long)(mdate*1000); long thisLastModified; try { @@ -108,6 +110,7 @@ public class WeblogServlet extends HttpServlet { throw new ServletException(e); } } + // Legacy support for an old permalink format: if ( inGet && (matcher=Pattern.compile("/d\\.(\\d{4}-\\d{2}-\\d{2})\\.([\\p{Alpha}][\\p{Alnum}\\-]*)\\.html").matcher(pathInfo)).matches() ) { final String date; final String extra; @@ -151,7 +154,7 @@ public class WeblogServlet extends HttpServlet { static final class SingleBlogEntryRedirectPath extends RequestPath { public String date; public int number; - public String extra; + public String extra; // May be null (passed to WeblogLink class) public SingleBlogEntryRedirectPath(String date, int number, String extra) { this.date = date; this.number = number; diff --git a/org/madore/damlengine/cmdlines b/org/madore/damlengine/cmdlines index 1128cd5..25fcd8c 100644 --- a/org/madore/damlengine/cmdlines +++ b/org/madore/damlengine/cmdlines @@ -1,2 +1,2 @@ -export CLASSPATH=$HOME/java/damlengine:/usr/share/java/xercesImpl.jar:/usr/share/java/xml-resolver-1.2.jar:/usr/share/java/xml-commons-resolver-1.1.jar:/usr/share/java/postgresql-jdbc4.jar:/usr/share/java/servlet-api-3.0.jar +export CLASSPATH=$HOME/java/damlengine:/usr/share/java/xercesImpl.jar:/usr/share/java/xml-resolver-1.2.jar:/usr/share/java/xml-commons-resolver-1.1.jar:/usr/share/java/postgresql-jdbc4.jar:/usr/share/java/servlet-api-3.1.jar:/usr/share/java/servlet-api-3.0.jar java org.madore.damlengine.DamlEngine some/file.daml |