Re: Re: [RFC] [Discussion] DOM HTML5 parsing and serialization support

From: Date: Fri, 29 Sep 2023 21:18:08 +0000
Subject: Re: Re: [RFC] [Discussion] DOM HTML5 parsing and serialization support
References: 1 2  Groups: php.internals 
Request: Send a blank email to internals+get-121186@lists.php.net to get a copy of this message
Hi Dennis On 9/29/23 20:20, Dennis Snell wrote: >> >>> >>> For both, XMLDocument::fromEmpty and >>> HTMLDocument::createEmpty there is an argument available to define >>> the encoding but none of the other createFrom* methods have this >>> argument. >>> >>> As far as I understand, in the these other cases the encoding gets detected from the >>> content of the passed source but what happens is the source does not contain any information about >>> the encoding?. E.g. you load an XML/HTML document over HTTP, the encoding is defined via HTTP header >>> but the content itself doesn't contain it. >>> >> >> Right, we follow the HTML spec in this regard. Roughly speaking we determine the charset in >> the following order of priorities. >> If one option fails, it will fall through to the next one. >> 1. The Content-Type HTTP header from which you loaded the document. >> 2. BOM sniffing in the content. I.e. UTF-8 with BOM and UTF-16 LE/BE prepend the content >> with byte markers. This is used to detect encoding. >> 3. Meta tag in the content. >> >> If it could not be determined at all, UTF-8 will be assumed as it's the default in >> HTML. > > It may sound meticulous, but I’ve tried to emphasize > createFragment() in what’s being built in WordPress because almost > everything being done on HTML within WordPress, and I think within many frameworks, is processing > fragments (and usually short ones at that). Formerly I didn’t realize there was much of a > difference, but text encoding is one of those differences. It’s my understanding that when parsing > a fragment we have to assume an encoding, unless the fragment is starting at a spot in the document > before that’s discovered, presumably only if we’ve constructed a Document with a still-unknown > encoding. > Just chiming in here to say that while we don't offer a createFragment() in this proposal, it's possible to parse fragments by passing the LIBXML_HTML_NOIMPLIED option. Alternatively, in the future I plan to offer innerHTML which you could use then in conjunction with createDocumentFragment(). > So manually setting the encoding of a fragment constructor is not so much overriding as it is > supplying, or at least, that’s one of two normative situations. If we create a fragment with a > context node carrying an encoding already, then we need to ignore any meta tag that specifies > otherwise; likewise if the context node doesn’t carry that encoding we do need to heed it. Sure, I agree it's not overriding in that specific case. In other cases it can be. There may not be an ideal naming that works for all cases. > > I know there’s a huge difference in needs here between people writing scripts to scrape full > HTML documents, but it’s not a small fraction of cases where people want to use DOMDocument > without having the full HTML from start to finish. In the world I work in it’s usually either for > parsing a small fragment to add some attributes or replace a wrapping tag, or for constructing HTML > programmatically to avoid escaping issues and make nesting easy. In both of these cases the text > encoding is implicit unless the function signature makes it explicit. At this stage in development, > we only support some of the “in body” parsing and only support UTF-8, but I thought that it was > important enough to add these as arguments to the creator function so that there’s an awareness > that these values govern how the parse occurs. > > Surely for createFromString() and > createEmpty() we can make the assumption that no character encoding > is set, but I also suspect that a possible majority of the times people use these functions they are > likely calling them when createFragment() is more appropriate, that > they aren’t supplying HTML documents with in-band text encoding information, and so there’s a > chance that de-emphasizing the parameter may be technically more accurate and practically less > helpful. Thanks for the insight. To be honest, I don't have hard feelings about the naming of the parameter. In a way you could say that override_encoding is still accurate, because the fallback default is UTF-8, so you override the fallback in a sense. As the documentation also emphasizes that the DOM extension works internally with UTF-8, this may align with expectations of programmers, but I'm not sure. I think we should really document the parameter very well in the docs. > > Love seeing all the continued work on this! > Thank you so much for your dedication to it. > > Dennis Snell Kind regards Niels

« previous php.internals (#121186) next »