/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "nsISupports.idl" interface nsIOutputStream; webidl Document; webidl Node; webidl Range; webidl Selection; %{ C++ class nsINode; %} [ptr] native nsINodePtr(nsINode); [scriptable, uuid(3d9371d8-a2ad-403e-8b0e-8885ad3562e3)] interface nsIDocumentEncoderNodeFixup : nsISupports { /** * Create a fixed up version of a node. This method is called before * each node in a document is about to be persisted. The implementor * may return a new node with fixed up attributes or null. If null is * returned the node should be used as-is. * @param aNode Node to fixup. * @param [OUT] aSerializeCloneKids True if the document encoder should * apply recursive serialization to the children of the fixed up node * instead of the children of the original node. * @return The resulting fixed up node. */ Node fixupNode(in Node aNode, out boolean aSerializeCloneKids); }; [scriptable, uuid(21f112df-d96f-47da-bfcb-5331273003d1)] interface nsIDocumentEncoder : nsISupports { // Output methods flag bits. There are a frightening number of these, // because everyone wants something a little bit different /** * Output only the selection (as opposed to the whole document). */ const unsigned long OutputSelectionOnly = (1 << 0); /** * Plaintext output: * - Convert html to plaintext that looks like the html. * - Can't be used in conjunction with `OutputPreformatted`. * - Implies wrap (except inside
), since html wraps.
    * HTML and XHTML output:
    * - Do prettyprinting, ignoring existing formatting.
    * - Implies wrap (except in attribute values and inside 
).
    * XML output:
    * - Do prettyprinting, ignoring existing formatting.
    * - Doesn't implicitly wrap
    */
  const unsigned long OutputFormatted     = (1 << 1);

  /** Don't do prettyprinting. Don't do any wrapping that's not in the existing
   * HTML/XML source. This option overrides OutputFormatted if both are set.
   * HTML/XHTML output: If neither are set, there won't be prettyprinting too, but
   * long lines will be wrapped.
   * Supported also in XML and Plaintext output.
   * @note This option does not affect entity conversion.
   */
  const unsigned long OutputRaw           = (1 << 2);

  /**
   * Do not print html head tags.
   * XHTML/HTML output only.
   */
  const unsigned long OutputBodyOnly      = (1 << 3);

  /**
   * Output as though the content is preformatted
   * (e.g. maybe it's wrapped in a PRE or PRE_WRAP style tag)
   * Plaintext output only.
   * Can't be used together with `OutputFormatted`/`OutputFormatFlowed`.
   * XXXbz How does this interact with OutputRaw?
   */
  const unsigned long OutputPreformatted  = (1 << 4);

  /**
   * Wrap even if we're not doing formatted output (e.g. for text fields).
   * Supported in XML, XHTML, HTML and Plaintext output.
   * Set implicitly in HTML/XHTML output when no OutputRaw.
   * Ignored when OutputRaw.
   * For XML, XHTML and  HTML: does not wrap values in attributes.
   * XXXLJ: set implicitly in HTML/XHTML output, to keep compatible behaviors
   *        for old callers of this interface
   * XXXbz How does this interact with OutputFormatFlowed?
   */
  const unsigned long OutputWrap          = (1 << 5);

  /**
   * Output for format flowed (RFC 2646). This is used when converting
   * to text for mail sending. This differs just slightly
   * but in an important way from normal formatted, and that is that
   * lines are space stuffed. This can't (correctly) be done later.
   * PlainText output only.
   * If this flag is set, `OutputFormat` has to be set too.
   * XXXbz How does this interact with OutputRaw/OutputWrap?
   */
  const unsigned long OutputFormatFlowed  = (1 << 6);

  /**
   * Convert links, image src, and script src to absolute URLs when possible.
   * XHTML/HTML output only.
   */
  const unsigned long OutputAbsoluteLinks = (1 << 7);

  /**
   * LineBreak processing: if this flag is set than CR line breaks will
   * be written. If neither this nor OutputLFLineBreak is set, then we
   * will use platform line breaks. The combination of the two flags will
   * cause CRLF line breaks to be written.
   */
  const unsigned long OutputCRLineBreak = (1 << 9);

  /**
   * LineBreak processing: if this flag is set than LF line breaks will
   * be written. If neither this nor OutputCRLineBreak is set, then we
   * will use platform line breaks. The combination of the two flags will
   * cause CRLF line breaks to be written.
   */
  const unsigned long OutputLFLineBreak = (1 << 10);

  /**
   * Output the content of noscript elements (only for serializing
   * to plaintext).
   */
  const unsigned long OutputNoScriptContent = (1 << 11);

  /**
   * Output the content of noframes elements (only for serializing
   * to plaintext). (Used only internally in the plain text serializer;
   * ignored if passed by the caller.)
   */
  const unsigned long OutputNoFramesContent = (1 << 12);

  /**
   * Don't allow any formatting nodes (e.g. 
, ) inside a
.
   * This is used primarily by mail. XHTML/HTML output only.
   */
  const unsigned long OutputNoFormattingInPre = (1 << 13);

  /**
   * Encode entities when outputting to a string.
   * E.g. If set, we'll output   if clear, we'll output 0xa0.
   * The basic set is just   & < > " for interoperability
   * with older products that don't support α and friends.
   * HTML output only.
   */
  const unsigned long OutputEncodeBasicEntities = (1 << 14);

  /**
   * Normally   is replaced with a space character when
   * encoding data as plain text, set this flag if that's
   * not desired.
   * Plaintext output only.
   */
  const unsigned long OutputPersistNBSP = (1 << 17);

  /**
   * Normally when serializing the whole document using the HTML or
   * XHTML serializer, the encoding declaration is rewritten to match.
   * This flag suppresses that behavior.
   */
  const unsigned long OutputDontRewriteEncodingDeclaration = (1 << 18);

  /**
   * When using the HTML or XHTML serializer, skip elements that are not
   * visible when this flag is set.  Elements are not visible when they
   * have CSS style display:none or visibility:collapse, for example.
   */
  const unsigned long SkipInvisibleContent = (1 << 19);

  /**
   * Output for delsp=yes (RFC 3676). This is used with OutputFormatFlowed
   * when converting to text for mail sending.
   * PlainText output only.
   */
  const unsigned long OutputFormatDelSp  = (1 << 20);

  /**
   * Drop 
elements considered "invisible" by the editor. OutputPreformatted * implies this flag. */ const unsigned long OutputDropInvisibleBreak = (1 << 21); /** * Don't check for _moz_dirty attributes when deciding whether to * pretty-print if this flag is set (bug 599983). */ const unsigned long OutputIgnoreMozDirty = (1 << 22); /** * Serialize in a way that is suitable for copying a plaintext version of the * document to the clipboard. This can for example cause line endings to be * injected at preformatted block element boundaries. */ const unsigned long OutputForPlainTextClipboardCopy = (1 << 25); /** * Include ruby annotations and ruby parentheses in the output. * PlainText output only. */ const unsigned long OutputRubyAnnotation = (1 << 26); /** * Disallow breaking of long character strings. This is important * for serializing e-mail which contains CJK strings. These must * not be broken just as "normal" longs strings aren't broken. */ const unsigned long OutputDisallowLineBreaking = (1 << 27); /** * Release reference of Document after using encodeTo* method to recycle * this encoder without holding Document. To use this encoder again, * we have to call init again. */ const unsigned long RequiresReinitAfterOutput = (1 << 28); /** * Initialize with a pointer to the document and the mime type. * Resets wrap column to 72 and resets node fixup. * @param aDocument Document to encode. * @param aMimeType MimeType to use. May also be set by SetMimeType. * @param aFlags Flags to use while encoding. May also be set by SetFlags. */ void init(in Document aDocument, in AString aMimeType, in unsigned long aFlags); [noscript] void nativeInit(in Document aDocument, in AString aMimeType, in unsigned long aFlags); /** * If the selection is set to a non-null value, then the * selection is used for encoding, otherwise the entire * document is encoded. * @param aSelection The selection to encode. */ void setSelection(in Selection aSelection); /** * If the range is set to a non-null value, then the * range is used for encoding, otherwise the entire * document or selection is encoded. * @param aRange The range to encode. */ void setRange(in Range aRange); /** * If the node is set to a non-null value, then the * node is used for encoding, otherwise the entire * document or range or selection is encoded. * @param aNode The node to encode. */ void setNode(in Node aNode); /** * If the container is set to a non-null value, then its * child nodes are used for encoding, otherwise the entire * document or range or selection or node is encoded. * @param aContainer The node which child nodes will be encoded. */ void setContainerNode(in Node aContainer); /** * Documents typically have an intrinsic character set, * but if no intrinsic value is found, the platform character set * is used. This function overrides both the intrinisc and platform * charset. * @param aCharset Overrides the both the intrinsic or platform * character set when encoding the document. * * Possible result codes: NS_ERROR_NO_CHARSET_CONVERTER */ void setCharset(in ACString aCharset); /** * Set a wrap column. This may have no effect in some types of encoders. * @param aWrapColumn Column to which to wrap. If 0, wrapping is disabled. */ void setWrapColumn(in unsigned long aWrapColumn); /** * The mime type preferred by the encoder. This piece of api was * added because the copy encoder may need to switch mime types on you * if you ask it to copy html that really represents plaintext content. * Call this AFTER Init() and SetSelection() have both been called. */ readonly attribute AString mimeType; /** * Encode the document and send the result to the nsIOutputStream. * * Possible result codes are the stream errors which might have * been encountered. * @param aStream Stream into which to encode. */ void encodeToStream(in nsIOutputStream aStream); /** * Encode the document into a string. * * @return The document encoded into a string. */ AString encodeToString(); /** * Encode the document into a string. Stores the extra context information * into the two arguments. * @param [OUT] aContextString The string where the parent hierarchy * information will be stored. * @param [OUT] aInfoString The string where extra context info will * be stored. * @return The document encoded as a string. * */ AString encodeToStringWithContext( out AString aContextString, out AString aInfoString); /** * Encode the document into a string of limited size. * @param aMaxLength After aMaxLength characters, the encoder will stop * encoding new data. * Only values > 0 will be considered. * The returned string may be slightly larger than * aMaxLength because some serializers (eg. HTML) * may need to close some tags after they stop * encoding new data, or finish a line (72 columns * by default for the plain text serializer). * * @return The document encoded into a string. */ AString encodeToStringWithMaxLength(in unsigned long aMaxLength); /** * Set the fixup object associated with node persistence. * @param aFixup The fixup object. */ void setNodeFixup(in nsIDocumentEncoderNodeFixup aFixup); }; %{ C++ template struct already_AddRefed; bool do_getDocumentTypeSupportedForEncoding(const char* aContentType); already_AddRefed do_createDocumentEncoder(const char* aContentType); already_AddRefed do_createHTMLCopyEncoder(); %}