blob: af1cec8343d2f83390d197c358cae6fbcf4fce27 [file] [log] [blame]
/*
* Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_EDITING_SERIALIZERS_MARKUP_FORMATTER_H_
#define THIRD_PARTY_BLINK_RENDERER_CORE_EDITING_SERIALIZERS_MARKUP_FORMATTER_H_
#include "base/macros.h"
#include "third_party/blink/renderer/core/editing/editing_strategy.h"
#include "third_party/blink/renderer/core/editing/serializers/serialization.h"
#include "third_party/blink/renderer/platform/wtf/text/string_builder.h"
namespace blink {
class Attribute;
class DocumentType;
class Element;
class Node;
enum EntityMask {
kEntityAmp = 0x0001,
kEntityLt = 0x0002,
kEntityGt = 0x0004,
kEntityQuot = 0x0008,
kEntityNbsp = 0x0010,
kEntityTab = 0x0020,
kEntityLineFeed = 0x0040,
kEntityCarriageReturn = 0x0080,
// Non-breaking space needs to be escaped in innerHTML for compatibility
// reasons. See http://trac.webkit.org/changeset/32879. However, we cannot do
// this in an XML document because it does not have the entity reference
// defined (see bug 19215).
kEntityMaskInCDATA = 0,
kEntityMaskInPCDATA = kEntityAmp | kEntityLt | kEntityGt,
kEntityMaskInHTMLPCDATA = kEntityMaskInPCDATA | kEntityNbsp,
kEntityMaskInAttributeValue =
kEntityAmp | kEntityQuot | kEntityLt | kEntityGt | kEntityTab |
kEntityLineFeed |
kEntityCarriageReturn,
kEntityMaskInHTMLAttributeValue = kEntityAmp | kEntityQuot | kEntityNbsp,
};
enum class SerializationType { kHTML, kXML };
class MarkupFormatter final {
STACK_ALLOCATED();
public:
static void AppendAttributeValue(StringBuilder&, const String&, bool);
static void AppendAttributeAsHTML(StringBuilder& result,
const Attribute& attribute,
const String& value);
static void AppendAttributeAsXMLWithoutNamespace(StringBuilder& result,
const Attribute& attribute,
const String& value);
static void AppendAttribute(StringBuilder& result,
const AtomicString& prefix,
const AtomicString& local_name,
const String& value,
bool document_is_html);
static void AppendCDATASection(StringBuilder&, const String&);
static void AppendCharactersReplacingEntities(StringBuilder& result,
const StringView& source,
EntityMask entity_mask);
static void AppendComment(StringBuilder&, const String&);
static void AppendDocumentType(StringBuilder&, const DocumentType&);
static void AppendProcessingInstruction(StringBuilder&,
const String& target,
const String& data);
static void AppendXMLDeclaration(StringBuilder&, const Document&);
MarkupFormatter(AbsoluteURLs, SerializationType);
void AppendStartMarkup(StringBuilder&, const Node&);
void AppendEndMarkup(StringBuilder&, const Element&);
void AppendEndMarkup(StringBuilder& result,
const Element& element,
const AtomicString& prefix,
const AtomicString& local_name);
bool SerializeAsHTML() const;
void AppendText(StringBuilder&, const Text&);
// Serialize '<' and the element name.
void AppendStartTagOpen(StringBuilder&, const Element&);
void AppendStartTagOpen(StringBuilder& result,
const AtomicString& prefix,
const AtomicString& local_name);
// Serialize '>' or '/>'
void AppendStartTagClose(StringBuilder&, const Element&);
EntityMask EntityMaskForText(const Text&) const;
bool ShouldSelfClose(const Element&) const;
String ResolveURLIfNeeded(const Element&, const Attribute& attribute) const;
private:
const AbsoluteURLs resolve_urls_method_;
SerializationType serialization_type_;
DISALLOW_COPY_AND_ASSIGN(MarkupFormatter);
};
} // namespace blink
#endif