Thank you for the response. AMP validation is very restrictive, so I need write <html amp> only, not <html amp=“amp”> or <html amp=“true”>.
So, I go for other fast solution which I use in other project to generate emails. I will show the extended solution in my tapestry5.dev-util.com <http://tapestry5.dev-util.com/> webapp, but as a short summary: AmpPage.java @Inject private Block head, body; ... AmpPage.tml !doctype html> <html xmlns:t="http://tapestry.apache.org/schema/tapestry_5_3.xsd" xmlns:p="tapestry:parameter"> <t:block t:id="head"> <head> ... </head> </t:block> <t:block t:id="body"> <body> ... </body> </t:block> </html> <t:delegate to="block:head"/> <t:delegate to="block:body"/> </html> So AmpPage is the “real" page but it has invalid AMP attributes. So I created a AmpExporterPage: public class AmpExporterPage { @Inject private PartialTemplateRenderer partialTemplateRenderer; @Inject private ComponentSource componentSource; @Inject private Request request; @Inject private Environment environment; public Object onActivate(final EventContext ec) { return new StreamResponse() { @Override public void prepareResponse(final Response response) { } @Override public InputStream getStream() throws IOException { final AmpPage ampPage = (AmpPage) componentSource.getPage(AmpPage.class); ampPage.onActivate(ec); ampPage.setupRender(); final Block head = ampPage.getHead(); final Block body = ampPage.getBody(); environment.push(Heartbeat.class, new HeartbeatImpl()); String markupHead = partialTemplateRenderer.render(head); String markupBody = partialTemplateRenderer.render(body); markupHead = markupHead.replace(" xmlns=\"http://www.w3.org/1999/xhtml\"", ""); markupHead = markupHead.replaceAll("amp-boilerplate=\"amp-boilerplate\"", "amp-boilerplate"); markupBody = markupBody.replace(" xmlns=\"http://www.w3.org/1999/xhtml\"", ""); final StringBuilder sb = new StringBuilder(); sb.append("<!doctype html><html amp>").append(markupHead).append(markupBody).append("</html>"); final InputStream is = new ByteArrayInputStream(sb.toString().getBytes("UTF-8")); return is; } @Override public String getContentType() { return "text/html"; } }; } } I do a speed test and it takes around 40 milliseconds in generate de response, so it’s ok for me. Regards Carlos Montero > El 30/11/2016, a las 14:06, Thiago H. de Paula Figueiredo > <thiag...@gmail.com> escribió: > > On Tue, Nov 29, 2016 at 6:36 PM, Carlos Montero Canabal < > carlosmonterocana...@gmail.com> wrote: > >> Hello Tapestry users, >> > > Hi! > > >> >> I would like to create an amp version of my pages into a tapestry5.4 >> webapp. According to https://www.ampproject.org/ >> docs/reference/spec#required-markup <https://www.ampproject.org/ >> docs/reference/spec#required-markup> the root html only would be: >> >> <html amp> >> >> Tapestry5 make a xhtml compilation for the .tml, so I ask you if there is >> any method to: >> > > That's not correct. Tapestry 5 uses an XML parser for template files, and > attributes without values aren't valid XML. You can try <html amp="amp">. > > >> 1. Exclude de xhtml compilation for this pages >> 2. Intercept the result and modify it to eliminate additional tags added >> by Tapestry. >> 3. Create a MarkupModel for AMPHtml? >> > > Number 3 above is probably the best idea. You'll need to override the > MarkupWriterFactory so you can use your AmpMarkupModel. > > -- > Thiago