| rfc8792xml2.original.xml | rfc8792.xml | |||
|---|---|---|---|---|
| <?xml version='1.0'?> | <?xml version='1.0' encoding='utf-8'?> | |||
| <!DOCTYPE rfc SYSTEM "rfc2629.dtd"> | <!DOCTYPE rfc SYSTEM "rfc2629-xhtml.ent"> | |||
| <?rfc toc="yes"?> | <rfc xmlns:xi="http://www.w3.org/2001/XInclude" category="info" | |||
| <?rfc symrefs="yes"?> | ipr="trust200902" docName="draft-ietf-netmod-artwork-folding-12" | |||
| <?rfc sortrefs="yes" ?> | number="8792" obsoletes="" updates="" submissionType="IETF" | |||
| <?rfc compact="yes"?> | consensus="true" xml:lang="en" tocInclude="true" symRefs="true" sortRefs="t | |||
| <?rfc subcompact="no"?> | rue" version="3"> | |||
| <?rfc linkmailto="no" ?> | <!-- xml2rfc v2v3 conversion 2.40.1 --> | |||
| <?rfc editing="no" ?> | ||||
| <?rfc comments="yes" ?> | ||||
| <?rfc inline="yes"?> | ||||
| <?rfc rfcedstyle="yes"?> | ||||
| <?rfc-ext allow-markup-in-artwork="yes" ?> | ||||
| <?rfc-ext include-index="no" ?> | ||||
| <!--<?rfc strict="no"?> --> | ||||
| <rfc category="info" | ||||
| ipr="trust200902" | ||||
| docName="draft-ietf-netmod-artwork-folding-12"> | ||||
| <front> | <front> | |||
| <title abbrev="Handling Long Lines in Inclusions">Handling Long Lines in I | <title abbrev="Handling Long Lines in Content">Handling Long Lines in | |||
| nclusions in Internet-Drafts and RFCs</title> | Content of Internet-Drafts and RFCs</title> | |||
| <author initials="K." surname="Watsen" fullname="Kent Watsen"> | ||||
| <organization>Watsen Networks</organization> | <seriesInfo name="RFC" value="8792"/> | |||
| <address> | <author initials="K." surname="Watsen" fullname="Kent Watsen"> | |||
| <email>kent+ietf@watsen.net</email> | <organization>Watsen Networks</organization> | |||
| </address> | <address> | |||
| </author> | <email>kent+ietf@watsen.net</email> | |||
| <author initials="E." surname="Auerswald" fullname="Erik Auerswald"> | </address> | |||
| <organization>Individual Contributor</organization> | </author> | |||
| <address> | <author initials="E." surname="Auerswald" fullname="Erik Auerswald"> | |||
| <email>auerswal@unix-ag.uni-kl.de</email> | <organization>Individual Contributor</organization> | |||
| </address> | <address> | |||
| </author> | <email>auerswal@unix-ag.uni-kl.de</email> | |||
| <author initials="A." surname="Farrel" fullname="Adrian Farrel" > | </address> | |||
| <organization>Old Dog Consulting</organization> | </author> | |||
| <address> | <author initials="A." surname="Farrel" fullname="Adrian Farrel"> | |||
| <email>adrian@olddog.co.uk</email> | <organization>Old Dog Consulting</organization> | |||
| </address> | <address> | |||
| </author> | <email>adrian@olddog.co.uk</email> | |||
| <author initials="Q." surname="Wu" fullname="Qin Wu"> | </address> | |||
| <organization>Huawei Technologies</organization> | </author> | |||
| <address> | <author initials="Q." surname="Wu" fullname="Qin Wu"> | |||
| <email>bill.wu@huawei.com</email> | <organization>Huawei Technologies</organization> | |||
| </address> | <address> | |||
| </author> | <email>bill.wu@huawei.com</email> | |||
| <date/> | </address> | |||
| <area>Operations</area> | </author> | |||
| <workgroup>NETMOD Working Group</workgroup> | <date month="June" year="2020"/> | |||
| <keyword>sourcecode</keyword> | <keyword>sourcecode</keyword> | |||
| <keyword>artwork</keyword> | <keyword>artwork</keyword> | |||
| <abstract> | <abstract> | |||
| <t>This document defines two strategies for handling long lines in wid | <t>This document defines two strategies for handling long lines in width-b | |||
| th-bounded | ounded | |||
| text content. One strategy is based on the historical use of a single | text content. One strategy, called the "single backslash" strategy, i | |||
| backslash | s based on the historical use of a single backslash | |||
| ('\') character to indicate where line-folding has occurred, with the continuation | ('\') character to indicate where line-folding has occurred, with the continuation | |||
| occurring with the first non-space (' ') character on the next line. | occurring with the first character that is not a space character ('&nb | |||
| The second | sp;') on the next line. The second | |||
| strategy extends the first strategy by adding a second backslash chara | strategy, called the "double backslash" strategy, extends the first st | |||
| cter to | rategy by adding a second backslash character to | |||
| identify where the continuation begins and is thereby able to handle c ases not | identify where the continuation begins and is thereby able to handle c ases not | |||
| supported by the first strategy. Both strategies use a self-describin g header | supported by the first strategy. Both strategies use a self-describin g header | |||
| enabling automated reconstitution of the original content.</t> | enabling automated reconstitution of the original content.</t> | |||
| </abstract> | </abstract> | |||
| <note title="Editorial Note (To be removed by RFC Editor)"> | </front> | |||
| <t>Please be aware that this document uses throughout the five-charact | <middle> | |||
| er text | <section numbered="true" toc="default"> | |||
| sequence located between the following two double-quotes: "(' ')". | <name>Introduction</name> | |||
| It has been | <t><xref target="RFC7994" format="default"/> sets out the requirements for | |||
| observed that some renderings of this text sequence produces a natur | ||||
| al | ||||
| line break at the space character in the middle, thus causing "('" t | ||||
| o appear | ||||
| at the end of the first line and "')" to appear at the beginning of | ||||
| the next | ||||
| line. Such a line-break is confusing and should not occur in the RF | ||||
| C output | ||||
| formats.</t> | ||||
| </note> | ||||
| </front> | ||||
| <middle> | ||||
| <section title="Introduction"> | ||||
| <t><xref target="RFC7994"/> sets out the requirements for | ||||
| plain-text RFCs and states that each line of an RFC (and hence of | plain-text RFCs and states that each line of an RFC (and hence of | |||
| an Internet-Draft) must be limited to 72 characters followed by | an Internet-Draft) must be limited to 72 characters followed by | |||
| the character sequence that denotes an end-of-line (EOL).</t> | the character sequence that denotes an end-of-line (EOL).</t> | |||
| <t>Internet-Drafts and RFCs often include example text or code | ||||
| <t>Internet-Drafts and RFCs often include example text or code | fragments. Many times, the example text or code exceeds the 72-characte | |||
| fragments. Many times the example text or code | r line-length limit. The 'xml2rfc' utility <xref target="xml2rfc" format="defau | |||
| exceeds the 72 character line-length limit. The `xml2rfc` <xref target= | lt"/>, at the time of this document's publication, does not | |||
| "xml2rfc"/> | ||||
| utility, at the time of this document's publication, does not | ||||
| attempt to wrap the content of such inclusions, simply issuing | attempt to wrap the content of such inclusions, simply issuing | |||
| a warning whenever lines exceed 69 characters. Historically, | a warning whenever lines exceed 69 characters. Historically, | |||
| there has been no RFC-Editor-recommended convention in place | there has been no convention recommended by the RFC Editor in place | |||
| for how to handle long lines in such inclusions, other than advising | for how to handle long lines in such inclusions, other than advising | |||
| authors to clearly indicate what manipulation has occurred.</t> | authors to clearly indicate what manipulation has occurred.</t> | |||
| <t>This document defines two strategies for handling long lines in width-b ounded | <t>This document defines two strategies for handling long lines in width-b ounded | |||
| text content. One strategy is based on the historical use of a single b ackslash | text content. One strategy, called the "single backslash" strategy, is based on the historical use of a single backslash | |||
| ('\') character to indicate where line-folding has occurred, with the co ntinuation | ('\') character to indicate where line-folding has occurred, with the co ntinuation | |||
| occurring with the first non-space (' ') character on the next line. Th | occurring with the first character that is not a space character ('  | |||
| e second | ;') on the next line. The second | |||
| strategy extends the first strategy by adding a second backslash charact | strategy, called the "double backslash" strategy, extends the first stra | |||
| er to | tegy by adding a second backslash character to | |||
| identify where the continuation begins and is thereby able to handle cas es not | identify where the continuation begins and is thereby able to handle cas es not | |||
| supported by the first strategy. Both strategies use a self-describing header | supported by the first strategy. Both strategies use a self-describing header | |||
| enabling automated reconstitution of the original content.</t> | enabling automated reconstitution of the original content.</t> | |||
| <t>The strategies defined in this document work on any text content but ar | ||||
| <t>The strategies defined in this document work on any text content, but a | e | |||
| re | ||||
| primarily intended for a structured sequence of lines, such as would be | primarily intended for a structured sequence of lines, such as would be | |||
| referenced by the <sourcecode> element defined in Section 2.48 of | referenced by the <sourcecode> element defined in <xref target="RF | |||
| <xref target="RFC7991"/>, rather than for two-dimensional imagery, such | C7991" sectionFormat="of" section="2.48"/>, rather than for two-dimensional imag | |||
| as would be referenced by the <artwork> element defined in Section | ery, such | |||
| 2.5 of <xref target="RFC7991"/>.</t> | as would be referenced by the <artwork> element defined in <xref t | |||
| arget="RFC7991" sectionFormat="of" section="2.5"/>.</t> | ||||
| <t>Note that text files are represented as lines having their first | <t>Note that text files are represented as lines having their first | |||
| character in column 1, and a line length of N where the last | character in column 1, and a line length of N where the last | |||
| character is in the Nth column and is immediately followed by an end | character is in the Nth column and is immediately followed by an | |||
| of line character sequence.</t> | end-of-line character sequence.</t> | |||
| </section> | </section> | |||
| <section numbered="true" toc="default"> | ||||
| <section title="Applicability Statement"> | <name>Applicability Statement</name> | |||
| <t>The formats and algorithms defined in this document may be used | <t>The formats and algorithms defined in this document may be used | |||
| in any context, whether for IETF documents or in other situations | in any context, whether for IETF documents or in other situations | |||
| where structured folding is desired.</t> | where structured folding is desired.</t> | |||
| <t>Within the IETF, this work primarily targets the xml2rfc v3 | <t>Within the IETF, this work primarily targets the xml2rfc v3 | |||
| <sourcecode> element (Section 2.48 of <xref target="RFC7991"/>) | <sourcecode> element (<xref target="RFC7991" sectionFormat="of" | |||
| and the xml2rfc v2 <artwork> element (Section 2.5 of | section="2.48"/>) | |||
| <xref target="RFC7749"/>) that, for lack of a better option, is | and the xml2rfc v2 <artwork> element (<xref | |||
| currently used for both source code and artwork. This work may | target="RFC7749" sectionFormat="of" section="2.5"/>), which, for | |||
| lack of a better option, is used in xml2rfc v2 for both source code an | ||||
| d artwork. This work may | ||||
| also be used for the xml2rfc v3 <artwork> element | also be used for the xml2rfc v3 <artwork> element | |||
| (Section 2.5 of <xref target="RFC7991"/>) but, as described in | (<xref target="RFC7991" sectionFormat="of" section="2.5"/>), but as de | |||
| <xref target="not-for-art"/>, it is generally not recommended.</t> | scribed in | |||
| </section> | <xref target="not-for-art" format="default"/>, it is generally not rec | |||
| ommended.</t> | ||||
| <section title="Requirements Language" anchor="requirements-language"> | </section> | |||
| <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL | <section anchor="requirements-language" numbered="true" toc="default"> | |||
| NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", | <name>Requirements Language</name> | |||
| "MAY", and "OPTIONAL" in this document are to be interpreted as | <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", | |||
| described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> | "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", | |||
| when, and only when, they appear in all capitals, as shown here.</t> | "<bcp14>SHALL NOT</bcp14>", "<bcp14>SHOULD</bcp14>", | |||
| </section> | "<bcp14>SHOULD NOT</bcp14>", | |||
| "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>", | ||||
| <section title="Goals"> | "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document | |||
| <section title="Automated Folding of Long Lines in Text Content"> | are to be interpreted as described in BCP 14 | |||
| <t>Automated folding of long lines is needed in order to support | <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only | |||
| drafts that are dynamically compiled to include content with | when, they appear in all capitals, as shown here.</t> | |||
| </section> | ||||
| <section numbered="true" toc="default"> | ||||
| <name>Goals</name> | ||||
| <section numbered="true" toc="default"> | ||||
| <name>Automated Folding of Long Lines in Text Content</name> | ||||
| <t>Automated folding of long lines is needed in order to support | ||||
| documents that are dynamically compiled to include content with | ||||
| potentially unconstrained line lengths. For instance, the | potentially unconstrained line lengths. For instance, the | |||
| build process may wish to include content from other local | build process may wish to include content from other local | |||
| files or dynamically generated by some external process. | files or content that is dynamically generated by some external proc ess. | |||
| Both of these cases are discussed next.</t> | Both of these cases are discussed next.</t> | |||
| <t>Many drafts need to include the content from local files (e.g., | <t>Many documents need to include the content from local files (e.g., | |||
| XML, JSON, ABNF, ASN.1). Prior to including a file's content, | XML, JSON, ABNF, ASN.1). Prior to including a file's content, | |||
| the build process SHOULD first validate these source files | the build process <bcp14>SHOULD</bcp14> first validate these source files | |||
| using format-specific validators. In order for such tooling | using format-specific validators. In order for such tooling | |||
| to be able to process the files, the files must be in their | to be able to process the files, the files must be in their | |||
| original/natural state, which may entail them having some long | original/natural state, which may entail them having some long | |||
| lines. Thus, these source files need to be folded before | lines. Thus, these source files need to be folded before | |||
| inclusion into the XML document, in order to satisfy `xml2rfc` | inclusion into the XML document, in order to satisfy 'xml2rfc' | |||
| line length limits.</t> | line-length limits.</t> | |||
| <t>Similarly, drafts sometimes contain dynamically generated | <t>Similarly, documents sometimes contain dynamically generated | |||
| output, typically from an external process operating on the | output, typically from an external process operating on the | |||
| same source files discussed in the previous paragraph. For | same source files discussed in the previous paragraph. For | |||
| instance, such processes may translate the input format to | instance, such processes may translate the input format to | |||
| another format or render a report over or a view of the input | another format, or they may render a report on, or a view of, the in put | |||
| file. In some cases, the dynamically generated output may | file. In some cases, the dynamically generated output may | |||
| contain lines exceeding the `xml2rfc` line length limits.</t> | contain lines exceeding the 'xml2rfc' line-length limits.</t> | |||
| <t>In both cases, folding is required and SHOULD be automated | <t>In both cases, folding is required and <bcp14>SHOULD</bcp14> be autom | |||
| ated | ||||
| to reduce effort and errors resulting from manual processing.</t> | to reduce effort and errors resulting from manual processing.</t> | |||
| </section> | </section> | |||
| <section title="Automated Reconstitution of the Original Text Content"> | <section numbered="true" toc="default"> | |||
| <t>Automated reconstitution of the exact original text content is need | <name>Automated Reconstitution of the Original Text Content</name> | |||
| ed to | <t>Automated reconstitution of the exact original text content is needed | |||
| to | ||||
| support validation of text-based content extracted from documents.</ t> | support validation of text-based content extracted from documents.</ t> | |||
| <t>For instance, already YANG <xref target="RFC7950"/> modules are | <t>For instance, YANG modules <xref target="RFC7950" | |||
| format="default"/> are already | ||||
| extracted from Internet-Drafts and validated as part of the | extracted from Internet-Drafts and validated as part of the | |||
| draft-submission process. Additionally, the desire to validate | submission process. Additionally, the desire to validate | |||
| instance examples (i.e., XML/JSON documents) contained within | instance examples (i.e., XML/JSON documents) contained within | |||
| Internet-Drafts has been discussed (<xref target="yang-doctors-threa | Internet-Drafts has been discussed <xref | |||
| d"/>).</t> | target="yang-doctors-thread" format="default"/>. | |||
| </section> | </t> | |||
| </section> | </section> | |||
| </section> | ||||
| <section title="Limitations"> | <section numbered="true" toc="default"> | |||
| <section title="Not Recommended for Graphical Artwork" anchor="not-for-a | <name>Limitations</name> | |||
| rt"> | <section anchor="not-for-art" numbered="true" toc="default"> | |||
| <t>While the solution presented in this document works on any | <name>Not Recommended for Graphical Artwork</name> | |||
| <t>While the solution presented in this document works on any | ||||
| kind of text-based content, it is most useful on content that | kind of text-based content, it is most useful on content that | |||
| represents source code (XML, JSON, etc.) or, more generally, on | represents source code (XML, JSON, etc.) or, more generally, on | |||
| content that has not been laid out in two dimensions (e.g., diagrams). </t> | content that has not been laid out in two dimensions (e.g., diagrams). </t> | |||
| <t>Fundamentally, the issue is whether the text content remains readab le | <t>Fundamentally, the issue is whether the text content remains readable | |||
| once folded. Text content that is unpredictable is especially suscept ible | once folded. Text content that is unpredictable is especially suscept ible | |||
| to looking bad when folded; falling into this category are most | to looking bad when folded; falling into this category are most | |||
| UML diagrams, YANG tree diagrams, and ASCII art in general.</t> | Unified Modeling Language (UML) diagrams, YANG tree diagrams, and ASCI | |||
| <t>It is NOT RECOMMENDED to use the solution presented in | I art in general.</t> | |||
| <t>It is <bcp14>NOT RECOMMENDED</bcp14> to use the solution presented in | ||||
| this document on graphical artwork.</t> | this document on graphical artwork.</t> | |||
| </section> | </section> | |||
| <section title="Doesn't Work as Well as Format-Specific Options"> | <section numbered="true" toc="default"> | |||
| <t>The solution presented in this document works generically | <name>Doesn't Work as Well as Format-Specific Options</name> | |||
| <t>The solution presented in this document works generically | ||||
| for all text-based content, as it only views content as plain | for all text-based content, as it only views content as plain | |||
| text. However, various formats sometimes have built-in mechanisms | text. However, various formats sometimes have built-in mechanisms | |||
| that are better suited to prevent long lines.</t> | that are better suited to prevent long lines.</t> | |||
| <t>For instance, both the `pyang` <xref target="pyang"/> and `yanglint | <t>For instance, both the 'pyang' and 'yanglint' utilities <xref target= | |||
| ` <xref target="yanglint"/> utilities | "pyang" | |||
| have the command line option "--tree-line-length" that can | format="default"/> <xref target="yanglint" format="default"/> | |||
| be used to indicate a desired maximum line length for when | have the command-line option "tree-line-length", which can | |||
| generating tree diagrams <xref target="RFC8340"/>.</t> | be used to indicate a desired maximum line length when | |||
| <t>In another example, some source formats (e.g., YANG | generating YANG tree diagrams <xref target="RFC8340" format="default"/ | |||
| <xref target="RFC7950"/>) allow any quoted string to be | >. | |||
| </t> | ||||
| <t>In another example, some source formats (e.g., YANG | ||||
| <xref target="RFC7950" format="default"/>) allow any quoted string to | ||||
| be | ||||
| broken up into substrings separated by a concatenation | broken up into substrings separated by a concatenation | |||
| character (e.g., '+'), any of which can be on a different | character (e.g., '+'), any of which can be on a different | |||
| line.</t> | line.</t> | |||
| <t>It is RECOMMENDED that authors do as much as possible | <t>It is <bcp14>RECOMMENDED</bcp14> that authors do as much as possible | |||
| within the selected format to avoid long lines.</t> | within the selected format to avoid long lines.</t> | |||
| </section> | ||||
| </section> | </section> | |||
| </section> | ||||
| <section title="Two Folding Strategies" anchor="two-strategies"> | <section anchor="two-strategies" numbered="true" toc="default"> | |||
| <t>This document defines two nearly identical strategies for folding | <name>Two Folding Strategies</name> | |||
| <t>This document defines two nearly identical strategies for folding | ||||
| text-based content. | text-based content. | |||
| <list style="hanging" hangIndent="6"> | </t> | |||
| <t hangText=" The Single Backslash Strategy ('\'):">Uses a backsla | <dl newline="true" spacing="normal"> | |||
| sh | <dt>The Single Backslash Strategy ('\'):</dt> | |||
| ('\') character at the end of the line where folding occurs, and | <dd>Uses a backslash | |||
| assumes that the continuation begins at the first character that i | ('\') character at the end of the line where folding occurs, | |||
| s not | and assumes that the continuation begins at the first character th | |||
| a space character (' ') on the following line.</t> | at is not | |||
| <t hangText=" The Double Backslash Strategy ('\\'):">Uses a backsl | a space character (' ') on the following line.</dd> | |||
| ash | <dt>The Double Backslash Strategy ('\\'):</dt> | |||
| ('\') character at the end of the line where folding occurs, and | <dd>Uses a backslash | |||
| assumes that the continuation begins after a second backslash ('\' | ('\') character at the end of the line where folding occurs, | |||
| ) | and assumes that the continuation begins after a second backslash | |||
| character on the following line.</t> | ('\') | |||
| </list> | character on the following line.</dd> | |||
| </t> | </dl> | |||
| <section title="Comparison"> | <section numbered="true" toc="default"> | |||
| <t>The first strategy produces more readable output, however it is | <name>Comparison</name> | |||
| <t>The first strategy produces output that is more readable. However, (1 | ||||
| ) it is | ||||
| significantly more likely to encounter unfoldable input (e.g., | significantly more likely to encounter unfoldable input (e.g., | |||
| a long line containing only space characters) and, for long lines | a long line containing only space characters), and (2) for long lines | |||
| that can be folded, automation implementations may encounter | that can be folded, automation implementations may encounter | |||
| scenarios that will produce errors without special care.</t> | scenarios that, without special care, will produce errors.</t> | |||
| <t>The second strategy produces less readable output, but is | <t>The second strategy produces output that is less readable, but it is | |||
| unlikely to encounter unfoldable input, there are no long lines | unlikely to encounter unfoldable input, there are no long lines | |||
| that cannot be folded, and no special care is required for when | that cannot be folded, and no special care is required when | |||
| folding a long line.</t> | folding a long line.</t> | |||
| </section> | </section> | |||
| <section title="Recommendation"> | <section numbered="true" toc="default"> | |||
| <t>It is RECOMMENDED for implementations to first attempt to fold | <name>Recommendation</name> | |||
| <t>It is <bcp14>RECOMMENDED</bcp14> that implementations first attempt t | ||||
| o fold | ||||
| content using the single backslash strategy and, only in the | content using the single backslash strategy and, only in the | |||
| unlikely event that it cannot fold the input or the folding | unlikely event that it cannot fold the input or the folding | |||
| logic is unable to cope with a contingency occurring on the | logic is unable to cope with a contingency occurring on the | |||
| desired folding column, then fallback to the double backslash | desired folding column, then fall back to the double backslash | |||
| strategy.</t> | strategy.</t> | |||
| </section> | ||||
| </section> | </section> | |||
| </section> | ||||
| <section title="The Single Backslash Strategy ('\')" anchor="single-slash" | <section anchor="single-slash" numbered="true" toc="default"> | |||
| > | <name>The Single Backslash Strategy ('\')</name> | |||
| <section title="Folded Structure"> | <section numbered="true" toc="default"> | |||
| <t>Text content that has been folded as specified by this strategy | <name>Folded Structure</name> | |||
| MUST adhere to the following structure.</t> | <t>Text content that has been folded as specified by this strategy | |||
| <section title="Header" anchor="single-header"> | <bcp14>MUST</bcp14> adhere to the following structure.</t> | |||
| <t>The header is two lines long.</t> | <section anchor="single-header" numbered="true" toc="default"> | |||
| <t>The first line is the following 46-character string that | <name>Header</name> | |||
| MAY be surrounded by any number of printable characters. | <t>The header is two lines long.</t> | |||
| <t>The first line is the following 36-character string; this string | ||||
| <bcp14>MAY</bcp14> be surrounded by any number of printable characte | ||||
| rs. | ||||
| This first line cannot itself be folded. | This first line cannot itself be folded. | |||
| <figure> | </t> | |||
| <artwork><![CDATA[ | <artwork name="header1_line1.txt"><![CDATA[ | |||
| NOTE: '\' line wrapping per BCP XXX (RFC XXXX) | NOTE: '\' line wrapping per RFC 8792]]></artwork> | |||
| ]]></artwork> | <t>The second line is an empty line, containing only the end-of-line | |||
| <postamble> | ||||
| [Note to RFC Editor: Please replace XXX and XXXX with the numb | ||||
| ers | ||||
| assigned to this document and delete this note. Please make t | ||||
| his | ||||
| change in multiple places in this document.] | ||||
| </postamble> | ||||
| </figure> | ||||
| </t> | ||||
| <t>The second line is an empty line, containing only the end-of-line | ||||
| character sequence. This line provides visual separation for | character sequence. This line provides visual separation for | |||
| readability.</t> | readability.</t> | |||
| </section> | </section> | |||
| <section title="Body"> | <section numbered="true" toc="default"> | |||
| <t>The character encoding is the same as described in Section 2 | <name>Body</name> | |||
| of <xref target="RFC7994"/>, except that, per <xref target="RFC7991" | <t>The character encoding is the same as the encoding described in <xr | |||
| />, | ef target="RFC7994" sectionFormat="of" section="2"/>, except that, per <xref tar | |||
| get="RFC7991" format="default"/>, | ||||
| tab characters are prohibited.</t> | tab characters are prohibited.</t> | |||
| <t>Lines that have a backslash ('\') occurring as the last character in | <t>Lines that have a backslash ('\') occurring as the last character i n | |||
| a line are considered "folded".</t> | a line are considered "folded".</t> | |||
| <t>Exceptionally long lines may be folded multiple times.</t> | <t>Exceptionally long lines MAY be folded multiple times.</t> | |||
| </section> | ||||
| </section> | </section> | |||
| </section> | ||||
| <section title="Algorithm" anchor="single-algorithm"> | <section anchor="single-algorithm" numbered="true" toc="default"> | |||
| <t>This section describes a process for folding and unfolding long | <name>Algorithm</name> | |||
| <t>This section describes a process for folding and unfolding long | ||||
| lines when they are encountered in text content.</t> | lines when they are encountered in text content.</t> | |||
| <t>The steps are complete, but implementations MAY achieve the same | <t>The steps are complete, but implementations <bcp14>MAY</bcp14> achiev e the same | |||
| result in other ways.</t> | result in other ways.</t> | |||
| <t>When a larger document contains multiple instances of text content | <t>When a larger document contains multiple instances of text content | |||
| that may need to be folded or unfolded, another process must | that may need to be folded or unfolded, another process must | |||
| insert/extract the individual text content instances to/from the | insert&wj;/extract the individual text content instances to/from the | |||
| larger document prior to utilizing the algorithms described in this | larger document prior to utilizing the algorithms described in this | |||
| section. For example, the `xiax` utility <xref target="xiax"/> does | section. For example, the 'xiax' utility <xref target="xiax" format | |||
| this.</t> | ="default"/> does this.</t> | |||
| <section title="Folding" anchor="single-folding"> | <section anchor="single-folding" numbered="true" toc="default"> | |||
| <t>Determine the desired maximum line length from input to the | <name>Folding</name> | |||
| line-wrapping process, such as from a command line | <t>Determine the desired maximum line length from input to the | |||
| line-wrapping process, such as from a command-line | ||||
| parameter. If no value is explicitly specified, the value "69" | parameter. If no value is explicitly specified, the value "69" | |||
| SHOULD be used.</t> | <bcp14>SHOULD</bcp14> be used.</t> | |||
| <t>Ensure that the desired maximum line length is not less than | <t>Ensure that the desired maximum line length is not less than | |||
| the minimum header, which is 46 characters. If the desired | the minimum header, which is 36 characters. If the desired | |||
| maximum line length is less than this minimum, exit (this text-based | maximum line length is less than this minimum, exit (this text-based | |||
| content cannot be folded).</t> | content cannot be folded).</t> | |||
| <t>Scan the text content for horizontal tab characters. If any | <t>Scan the text content for horizontal tab characters. If any | |||
| horizontal tab characters appear, either resolve them to space | horizontal tab characters appear, either resolve them to space | |||
| characters or exit, forcing the input provider to convert them | characters or exit, forcing the input provider to convert them | |||
| to space characters themselves first.</t> | to space characters themselves first.</t> | |||
| <t>Scan the text content to ensure at least one line exceeds the | <t>Scan the text content to ensure that at least one line exceeds the | |||
| desired maximum. If no line exceeds the desired maximum, exit | desired maximum. If no line exceeds the desired maximum, exit | |||
| (this text content does not | (this text content does not | |||
| need to be folded).</t> | need to be folded).</t> | |||
| <t>Scan the text content to ensure no existing lines already end wit h a | <t>Scan the text content to ensure that no existing lines already end with a | |||
| backslash ('\') character, as this could lead to an ambiguous result . | backslash ('\') character, as this could lead to an ambiguous result . | |||
| If such a line is found, and its width is less than the desired maxi mum, | If such a line is found, and its width is less than the desired maxi mum, | |||
| then it SHOULD be flagged for forced folding (folding even though | then it <bcp14>SHOULD</bcp14> be flagged for "forced" folding (foldi ng even though | |||
| unnecessary). If the folding implementation doesn't support forced | unnecessary). If the folding implementation doesn't support forced | |||
| foldings, it MUST exit.</t> | foldings, it <bcp14>MUST</bcp14> exit.</t> | |||
| <t>If this text content needs to and can be folded, insert the heade | <t>If this text content needs to, and can, be folded, insert the heade | |||
| r | r | |||
| described in <xref target="single-header" />, ensuring that any addi | described in <xref target="single-header" format="default"/>, ensuri | |||
| tional | ng that any additional | |||
| printable characters surrounding the header do not result in a | printable characters surrounding the header do not result in a | |||
| line exceeding the desired maximum.</t> | line exceeding the desired maximum.</t> | |||
| <t>For each line in the text content, from top-to-bottom, if the lin | <t>For each line in the text content, from top to bottom, if the line | |||
| e | exceeds the desired maximum or requires a forced folding, then fol | |||
| exceeds the desired maximum, or requires a forced folding, then fo | d | |||
| ld | the line by performing the following steps: | |||
| the line by: | </t> | |||
| <list style="numbers"> | <ol spacing="normal" type="1"> | |||
| <t>Determine where the fold will occur. This location MUST be b | <li>Determine where the fold will occur. This location <bcp14>MUST< | |||
| efore | /bcp14> be before | |||
| or at the desired maximum column, and MUST NOT be chosen such | or at the desired maximum column and <bcp14>MUST NOT</bcp14> b | |||
| that | e chosen such that | |||
| the character immediately after the fold is a space (' ') char | the character immediately after the fold is a space (' ') | |||
| acter. | character. | |||
| For forced foldings, the location is between the '\' and the e | For forced foldings, the location is between the '\' and the e | |||
| nd of | nd-of-line sequence. If no such location can be found, then exit (this | |||
| line sequence. If no such location can be found, then exit (t | text content cannot be folded).</li> | |||
| his | <li>At the location where the fold is to occur, insert a backslash | |||
| text content cannot be folded).</t> | ('\') character followed by the end-of-line character sequence | |||
| <t>At the location where the fold is to occur, insert a backslas | .</li> | |||
| h | <li>On the following line, insert any number of space (' ') cha | |||
| ('\') character followed by the end of line character sequence | racters, | |||
| .</t> | provided that the resulting line does not | |||
| <t>On the following line, insert any number of space (' ') chara | exceed the desired maximum. | |||
| cters, | </li> | |||
| subject to the resulting line not exceeding the desired maximu | </ol> | |||
| m.</t> | <t>The result of the previous operation is that the next line starts | |||
| </list> | with an arbitrary number of space (' ') characters, followed by | |||
| </t> | the | |||
| <t>The result of the previous operation is that the next line starts | ||||
| with an arbitrary number of space (' ') characters, followed by the | ||||
| character that was previously occupying the position where the fold | character that was previously occupying the position where the fold | |||
| occurred.</t> | occurred.</t> | |||
| <t>Continue in this manner until reaching the end of the text conten t. Note | <t>Continue in this manner until reaching the end of the text content. Note | |||
| that this algorithm naturally addresses the case where the remainder | that this algorithm naturally addresses the case where the remainder | |||
| of a folded line is still longer than the desired maximum, and hence | of a folded line is still longer than the desired maximum and, hence , | |||
| needs to be folded again, ad infinitum.</t> | needs to be folded again, ad infinitum.</t> | |||
| <t>The process described in this section is illustrated by the "fold | <t>The process described in this section is illustrated by the "fold_i | |||
| _it_1()" | t_1()" | |||
| function in <xref target="script" />.</t> | function in <xref target="script" format="default"/>.</t> | |||
| </section> | </section> | |||
| <section title="Unfolding"> | <section numbered="true" toc="default"> | |||
| <t>Scan the beginning of the text content for the header described i | <name>Unfolding</name> | |||
| n | <t>Scan the beginning of the text content for the header described in | |||
| <xref target="single-header"/>. If the header is not present, exi | <xref target="single-header" format="default"/>. If the header is | |||
| t | not present, exit | |||
| (this text content does not need to be unfolded).</t> | (this text content does not need to be unfolded).</t> | |||
| <t>Remove the 2-line header from the text content.</t> | <t>Remove the two-line header from the text content.</t> | |||
| <t>For each line in the text content, from top-to-bottom, if the lin | <t>For each line in the text content, from top to bottom, if the line | |||
| e has | has | |||
| a backslash ('\') character immediately followed by the end of line | a backslash ('\') character immediately followed by the end-of-line | |||
| character sequence, then the line can be unfolded. | character sequence, then the line can be unfolded. | |||
| Remove the backslash ('\') character, the end of line character | Remove the backslash ('\') character, the end-of-line character | |||
| sequence, and any leading space (' ') characters, which will bring u | sequence, and any leading space (' ') characters, which will br | |||
| p | ing up | |||
| the next line. Then continue to scan each line in the text content | the next line. Then continue to scan each line in the text content | |||
| starting with the current line (in case it was multiply folded).</t> | starting with the current line (in case it was multiply folded).</t> | |||
| <t>Continue in this manner until reaching the end of the text conten | <t>Continue in this manner until reaching the end of the text content. | |||
| t.</t> | </t> | |||
| <t>The process described in this section is illustrated by the "unfo | <t>The process described in this section is illustrated by the "unfold | |||
| ld_it_1()" | _it_1()" | |||
| function in <xref target="script" />.</t> | function in <xref target="script" format="default"/>.</t> | |||
| </section> | ||||
| </section> | </section> | |||
| </section> | </section> | |||
| </section> | ||||
| <section title="The Double Backslash Strategy ('\\')" anchor="double-slash | <section anchor="double-slash" numbered="true" toc="default"> | |||
| "> | <name>The Double Backslash Strategy ('\\')</name> | |||
| <section numbered="true" toc="default"> | ||||
| <section title="Folded Structure"> | <name>Folded Structure</name> | |||
| <t>Text content that has been folded as specified by this strategy | <t>Text content that has been folded as specified by this strategy | |||
| MUST adhere to the following structure.</t> | <bcp14>MUST</bcp14> adhere to the following structure.</t> | |||
| <section title="Header" anchor="double-header"> | <section anchor="double-header" numbered="true" toc="default"> | |||
| <t>The header is two lines long.</t> | <name>Header</name> | |||
| <t>The first line is the following 47-character string that | <t>The header is two lines long.</t> | |||
| MAY be surrounded by any number of printable characters. | <t>The first line is the following 37-character string; this string | |||
| <bcp14>MAY</bcp14> be surrounded by any number of printable characte | ||||
| rs. | ||||
| This first line cannot itself be folded. | This first line cannot itself be folded. | |||
| <figure> | </t> | |||
| <artwork><![CDATA[ | <artwork name="header2_line1.txt"><![CDATA[ | |||
| NOTE: '\\' line wrapping per BCP XXX (RFC XXXX) | NOTE: '\\' line wrapping per RFC 8792]]></artwork> | |||
| ]]></artwork> | <t>The second line is an empty line, containing only the end-of-line | |||
| <postamble> | ||||
| [Note to RFC Editor: Please replace XXX and XXXX with the numb | ||||
| ers | ||||
| assigned to this document and delete this note. Please make t | ||||
| his | ||||
| change in multiple places in this document.] | ||||
| </postamble> | ||||
| </figure> | ||||
| </t> | ||||
| <t>The second line is an empty line, containing only the end-of-line | ||||
| character sequence. This line provides visual separation for | character sequence. This line provides visual separation for | |||
| readability.</t> | readability.</t> | |||
| </section> | </section> | |||
| <section title="Body"> | <section numbered="true" toc="default"> | |||
| <t>The character encoding is the same as described in Section 2 | <name>Body</name> | |||
| of <xref target="RFC7994"/>, except that, per <xref target="RFC7991" | <t>The character encoding is the same as the encoding described in <xr | |||
| />, | ef target="RFC7994" sectionFormat="of" section="2"/>, except that, per <xref tar | |||
| get="RFC7991" format="default"/>, | ||||
| tab characters are prohibited.</t> | tab characters are prohibited.</t> | |||
| <t>Lines that have a backslash ('\') occurring as the last character | <t>Lines that have a backslash ('\') occurring as the last character i | |||
| in | n | |||
| a line immediately followed by the end of line character sequence, w | a line immediately followed by the end-of-line character sequence, w | |||
| hen | hen | |||
| the subsequent line starts with a backslash ('\') as the first non-s | the subsequent line starts with a backslash ('\') as the first | |||
| pace | character that is not a space character (' '), are considered " | |||
| (' ') character, are considered "folded".</t> | folded".</t> | |||
| <t>Exceptionally long lines may be folded multiple times.</t> | <t>Exceptionally long lines MAY be folded multiple times.</t> | |||
| </section> | ||||
| </section> | </section> | |||
| </section> | ||||
| <section title="Algorithm" anchor="double-algorithm"> | <section anchor="double-algorithm" numbered="true" toc="default"> | |||
| <t>This section describes a process for folding and unfolding long | <name>Algorithm</name> | |||
| <t>This section describes a process for folding and unfolding long | ||||
| lines when they are encountered in text content.</t> | lines when they are encountered in text content.</t> | |||
| <t>The steps are complete, but implementations MAY achieve the same | <t>The steps are complete, but implementations <bcp14>MAY</bcp14> achiev e the same | |||
| result in other ways.</t> | result in other ways.</t> | |||
| <t>When a larger document contains multiple instances of text content | <t>When a larger document contains multiple instances of text content | |||
| that may need to be folded or unfolded, another process must | that may need to be folded or unfolded, another process must | |||
| insert/extract the individual text content instances to/from the | insert&wj;/extract the individual text content instances to/from the | |||
| larger document prior to utilizing the algorithms described in this | larger document prior to utilizing the algorithms described in this | |||
| section. For example, the `xiax` utility <xref target="xiax"/> does | section. For example, the 'xiax' utility <xref target="xiax" format | |||
| this.</t> | ="default"/> does this.</t> | |||
| <section title="Folding" anchor="double-folding"> | <section anchor="double-folding" numbered="true" toc="default"> | |||
| <t>Determine the desired maximum line length from input to the | <name>Folding</name> | |||
| line-wrapping process, such as from a command line | <t>Determine the desired maximum line length from input to the | |||
| line-wrapping process, such as from a command-line | ||||
| parameter. If no value is explicitly specified, the value "69" | parameter. If no value is explicitly specified, the value "69" | |||
| SHOULD be used.</t> | <bcp14>SHOULD</bcp14> be used.</t> | |||
| <t>Ensure that the desired maximum line length is not less than | <t>Ensure that the desired maximum line length is not less than | |||
| the minimum header, which is 47 characters. If the desired | the minimum header, which is 37 characters. If the desired | |||
| maximum line length is less than this minimum, exit (this text-based | maximum line length is less than this minimum, exit (this text-based | |||
| content cannot be folded).</t> | content cannot be folded).</t> | |||
| <t>Scan the text content for horizontal tab characters. If any | <t>Scan the text content for horizontal tab characters. If any | |||
| horizontal tab characters appear, either resolve them to space | horizontal tab characters appear, either resolve them to space | |||
| characters or exit, forcing the input provider to convert them | characters or exit, forcing the input provider to convert them | |||
| to space characters themselves first.</t> | to space characters themselves first.</t> | |||
| <t>Scan the text content to see if any line exceeds the desired maxi mum. | <t>Scan the text content to see if any line exceeds the desired maximu m. | |||
| If no line exceeds the desired maximum, exit (this text content does not | If no line exceeds the desired maximum, exit (this text content does not | |||
| need to be folded).</t> | need to be folded).</t> | |||
| <t>Scan the text content to ensure no existing lines already end wit h a | <t>Scan the text content to ensure that no existing lines already end with a | |||
| backslash ('\') character while the subsequent line starts with a | backslash ('\') character while the subsequent line starts with a | |||
| backslash ('\') character as the first non-space (' ') character, | backslash ('\') character as the first character that is not a | |||
| as this could lead to an ambiguous result. If such a line is found, | space character (' '), | |||
| and its width is less than the desired maximum, then it SHOULD be | as this could lead to an ambiguous result. If such a line is found | |||
| and its width is less than the desired maximum, then it <bcp14>SHOUL | ||||
| D</bcp14> be | ||||
| flagged for forced folding (folding even though unnecessary). If | flagged for forced folding (folding even though unnecessary). If | |||
| the folding implementation doesn't support forced foldings, it MUST | the folding implementation doesn't support forced foldings, it <bcp1 4>MUST</bcp14> | |||
| exit.</t> | exit.</t> | |||
| <t>If this text content needs to and can be folded, insert the heade | <t>If this text content needs to, and can, be folded, insert the heade | |||
| r | r | |||
| described in <xref target="double-header" />, ensuring that any addi | described in <xref target="double-header" format="default"/>, ensuri | |||
| tional | ng that any additional | |||
| printable characters surrounding the header do not result in a | printable characters surrounding the header do not result in a | |||
| line exceeding the desired maximum.</t> | line exceeding the desired maximum.</t> | |||
| <t>For each line in the text content, from top-to-bottom, if the lin | <t>For each line in the text content, from top to bottom, if the line | |||
| e | exceeds the desired maximum or requires a forced folding, then | |||
| exceeds the desired maximum, or requires a forced folding, then | fold the line by performing the following steps: | |||
| fold the line by: | </t> | |||
| <list style="numbers"> | <ol spacing="normal" type="1"> | |||
| <t>Determine where the fold will occur. This location MUST be b | <li>Determine where the fold will occur. This location <bcp14>MUST< | |||
| efore | /bcp14> be before | |||
| or at the desired maximum column. For forced foldings, the lo cation | or at the desired maximum column. For forced foldings, the lo cation | |||
| is between the '\' and the end of line sequence on the first l | is between the '\' and the end-of-line sequence on the first l | |||
| ine.</t> | ine.</li> | |||
| <t>At the location where the fold is to occur, insert a first | <li>At the location where the fold is to occur, insert a first | |||
| backslash ('\') character followed by the end of line characte | backslash ('\') character followed by the end-of-line characte | |||
| r | r | |||
| sequence.</t> | sequence.</li> | |||
| <t>On the following line, insert any number of space (' ') chara | <li>On the following line, insert any number of space (' ') cha | |||
| cters, | racters, | |||
| subject to the resulting line not exceeding the desired maximu | provided that the resulting line does not | |||
| m, | exceed the desired maximum, | |||
| followed by a second backslash ('\') character.</t> | followed by a second backslash ('\') character.</li> | |||
| </list> | </ol> | |||
| </t> | <t>The result of the previous operation is that the next line starts | |||
| <t>The result of the previous operation is that the next line starts | with an arbitrary number of space (' ') characters, followed by | |||
| with an arbitrary number of space (' ') characters, followed by a | a | |||
| backslash ('\') character, immediately followed by the character tha t | backslash ('\') character, immediately followed by the character tha t | |||
| was previously occupying the position where the fold occurred.</t> | was previously occupying the position where the fold occurred.</t> | |||
| <t>Continue in this manner until reaching the end of the text conten t. Note | <t>Continue in this manner until reaching the end of the text content. Note | |||
| that this algorithm naturally addresses the case where the remainder | that this algorithm naturally addresses the case where the remainder | |||
| of a folded line is still longer than the desired maximum, and hence | of a folded line is still longer than the desired maximum and, hence , | |||
| needs to be folded again, ad infinitum.</t> | needs to be folded again, ad infinitum.</t> | |||
| <t>The process described in this section is illustrated by the "fold | <t>The process described in this section is illustrated by the "fold_i | |||
| _it_2()" | t_2()" | |||
| function in <xref target="script" />.</t> | function in <xref target="script" format="default"/>.</t> | |||
| </section> | </section> | |||
| <section title="Unfolding"> | <section numbered="true" toc="default"> | |||
| <t>Scan the beginning of the text content for the header described i | <name>Unfolding</name> | |||
| n | <t>Scan the beginning of the text content for the header described in | |||
| <xref target="double-header"/>. If the header is not present, exi | <xref target="double-header" format="default"/>. If the header is | |||
| t | not present, exit | |||
| (this text content does not need to be unfolded).</t> | (this text content does not need to be unfolded).</t> | |||
| <t>Remove the 2-line header from the text content.</t> | <t>Remove the two-line header from the text content.</t> | |||
| <t>For each line in the text content, from top-to-bottom, if the lin | <t>For each line in the text content, from top to bottom, if the line | |||
| e has | has | |||
| a backslash ('\') character immediately followed by the end of line | a backslash ('\') character immediately followed by the end-of-line | |||
| character sequence, and if the next line has a backslash ('\') chara | character sequence and if the next line has a backslash ('\') charac | |||
| cter | ter | |||
| as the first non-space (' ') character, then the lines can be unfold | as the first character that is not a space character (' '), the | |||
| ed. | n the lines can be unfolded. | |||
| Remove the first backslash ('\') character, the end of line characte | Remove the first backslash ('\') character, the end-of-line characte | |||
| r | r | |||
| sequence, any leading space (' ') characters, and the second backsla | sequence, any leading space (' ') characters, and the second ba | |||
| sh | ckslash | |||
| ('\') character, which will bring up the next line. Then continue t | ('\') character, which will bring up the next line. Then, continue | |||
| o | to | |||
| scan each line in the text content starting with the current line (i n case | scan each line in the text content starting with the current line (i n case | |||
| it was multiply folded).</t> | it was multiply folded).</t> | |||
| <t>Continue in this manner until reaching the end of the text conten | <t>Continue in this manner until reaching the end of the text content. | |||
| t.</t> | </t> | |||
| <t>The process described in this section is illustrated by the "unfo | <t>The process described in this section is illustrated by the "unfold | |||
| ld_it_2()" | _it_2()" | |||
| function in <xref target="script" />.</t> | function in <xref target="script" format="default"/>.</t> | |||
| </section> | ||||
| </section> | </section> | |||
| </section> | </section> | |||
| </section> | ||||
| <section anchor="example" title="Examples"> | <section anchor="example" numbered="true" toc="default"> | |||
| <t>The following self-documenting examples illustrate folded | <name>Examples</name> | |||
| <t>The following self-documenting examples illustrate folded | ||||
| text-based content.</t> | text-based content.</t> | |||
| <t>The source text content cannot be presented here, as it would | ||||
| <t>The source text content cannot be presented here, as it would | ||||
| again be folded. Alas, only the results can be provided.</t> | again be folded. Alas, only the results can be provided.</t> | |||
| <section numbered="true" toc="default"> | ||||
| <section title="Example Showing Boundary Conditions"> | <name>Example Showing Boundary Conditions</name> | |||
| <t>This example illustrates boundary conditions. The input contains | <t>This example illustrates boundary conditions. The input contains | |||
| seven lines, each line one character longer than the previous line. | seven lines, each line one character longer than the previous line. | |||
| Numbers for counting purposes. The default desired maximum column | Numbers are used for counting purposes. The default desired maximum column | |||
| value "69" is used.</t> | value "69" is used.</t> | |||
| <section title="Using '\'"> | <section numbered="true" toc="default"> | |||
| <figure> | <name>Using '\'</name> | |||
| <artwork><![CDATA[ | <artwork name="example-1.1.txt.folded" type="" align="left" alt=""><![ | |||
| ========== NOTE: '\' line wrapping per BCP XXX (RFC XXXX) =========== | CDATA[ | |||
| ========== NOTE: '\' line wrapping per RFC 8792 =========== | ||||
| 123456789012345678901234567890123456789012345678901234567890123456 | 123456789012345678901234567890123456789012345678901234567890123456 | |||
| 1234567890123456789012345678901234567890123456789012345678901234567 | 1234567890123456789012345678901234567890123456789012345678901234567 | |||
| 12345678901234567890123456789012345678901234567890123456789012345678 | 12345678901234567890123456789012345678901234567890123456789012345678 | |||
| 123456789012345678901234567890123456789012345678901234567890123456789 | 123456789012345678901234567890123456789012345678901234567890123456789 | |||
| 12345678901234567890123456789012345678901234567890123456789012345678\ | 12345678901234567890123456789012345678901234567890123456789012345678\ | |||
| 90 | 90 | |||
| 12345678901234567890123456789012345678901234567890123456789012345678\ | 12345678901234567890123456789012345678901234567890123456789012345678\ | |||
| 901 | 901 | |||
| 12345678901234567890123456789012345678901234567890123456789012345678\ | 12345678901234567890123456789012345678901234567890123456789012345678\ | |||
| 9012 | 9012]]></artwork> | |||
| ]]></artwork> | </section> | |||
| </figure> | <section numbered="true" toc="default"> | |||
| </section> | <name>Using '\\'</name> | |||
| <section title="Using '\\'"> | <artwork name="example-1.2.txt.folded" type="" align="left" alt=""><![ | |||
| <figure> | CDATA[ | |||
| <artwork><![CDATA[ | ========== NOTE: '\\' line wrapping per RFC 8792 ========== | |||
| ========== NOTE: '\\' line wrapping per BCP XXX (RFC XXXX) ========== | ||||
| 123456789012345678901234567890123456789012345678901234567890123456 | 123456789012345678901234567890123456789012345678901234567890123456 | |||
| 1234567890123456789012345678901234567890123456789012345678901234567 | 1234567890123456789012345678901234567890123456789012345678901234567 | |||
| 12345678901234567890123456789012345678901234567890123456789012345678 | 12345678901234567890123456789012345678901234567890123456789012345678 | |||
| 123456789012345678901234567890123456789012345678901234567890123456789 | 123456789012345678901234567890123456789012345678901234567890123456789 | |||
| 12345678901234567890123456789012345678901234567890123456789012345678\ | 12345678901234567890123456789012345678901234567890123456789012345678\ | |||
| \90 | \90 | |||
| 12345678901234567890123456789012345678901234567890123456789012345678\ | 12345678901234567890123456789012345678901234567890123456789012345678\ | |||
| \901 | \901 | |||
| 12345678901234567890123456789012345678901234567890123456789012345678\ | 12345678901234567890123456789012345678901234567890123456789012345678\ | |||
| \9012 | \9012]]></artwork> | |||
| ]]></artwork> | ||||
| </figure> | ||||
| </section> | ||||
| </section> | </section> | |||
| </section> | ||||
| <section title="Example Showing Multiple Wraps of a Single Line"> | <section numbered="true" toc="default"> | |||
| <t>This example illustrates what happens when a very long line needs t | <name>Example Showing Multiple Wraps of a Single Line</name> | |||
| o | <t>This example illustrates what happens when a very long line needs to | |||
| be folded multiple times. The input contains one line containing | be folded multiple times. The input contains one line containing | |||
| 280 characters. Numbers for counting purposes. The default | 280 characters. Numbers are used for counting purposes. The defaul t | |||
| desired maximum column value "69" is used.</t> | desired maximum column value "69" is used.</t> | |||
| <section title="Using '\'"> | <section numbered="true" toc="default"> | |||
| <figure> | <name>Using '\'</name> | |||
| <artwork><![CDATA[ | <artwork name="example-2.1.txt.folded" type="" align="left" alt=""><![ | |||
| ========== NOTE: '\' line wrapping per BCP XXX (RFC XXXX) =========== | CDATA[ | |||
| ========== NOTE: '\' line wrapping per RFC 8792 =========== | ||||
| 12345678901234567890123456789012345678901234567890123456789012345678\ | 12345678901234567890123456789012345678901234567890123456789012345678\ | |||
| 90123456789012345678901234567890123456789012345678901234567890123456\ | 90123456789012345678901234567890123456789012345678901234567890123456\ | |||
| 78901234567890123456789012345678901234567890123456789012345678901234\ | 78901234567890123456789012345678901234567890123456789012345678901234\ | |||
| 56789012345678901234567890123456789012345678901234567890123456789012\ | 56789012345678901234567890123456789012345678901234567890123456789012\ | |||
| 34567890 | 34567890]]></artwork> | |||
| ]]></artwork> | </section> | |||
| </figure> | <section numbered="true" toc="default"> | |||
| </section> | <name>Using '\\'</name> | |||
| <section title="Using '\\'"> | <artwork name="example-2.2.txt.folded" type="" align="left" alt=""><![ | |||
| <figure> | CDATA[ | |||
| <artwork><![CDATA[ | ========== NOTE: '\\' line wrapping per RFC 8792 ========== | |||
| ========== NOTE: '\\' line wrapping per BCP XXX (RFC XXXX) ========== | ||||
| 12345678901234567890123456789012345678901234567890123456789012345678\ | 12345678901234567890123456789012345678901234567890123456789012345678\ | |||
| \9012345678901234567890123456789012345678901234567890123456789012345\ | \9012345678901234567890123456789012345678901234567890123456789012345\ | |||
| \6789012345678901234567890123456789012345678901234567890123456789012\ | \6789012345678901234567890123456789012345678901234567890123456789012\ | |||
| \3456789012345678901234567890123456789012345678901234567890123456789\ | \3456789012345678901234567890123456789012345678901234567890123456789\ | |||
| \01234567890 | \01234567890]]></artwork> | |||
| ]]></artwork> | ||||
| </figure> | ||||
| </section> | ||||
| </section> | </section> | |||
| </section> | ||||
| <section title="Example Showing "Smart" Folding"> | <section numbered="true" toc="default"> | |||
| <t>This example illustrates how readability can be improved via "smart | <name>Example Showing "Smart" Folding</name> | |||
| " | <t>This example illustrates how readability can be improved via "smart" | |||
| folding, whereby folding occurs at format-specific locations and | folding, whereby folding occurs at format-specific locations and | |||
| format-specific indentations are used.</t> | format-specific indentations are used.</t> | |||
| <t>The text content was manually folded, since the script in the appen dix | <t>The text content was manually folded, since the script in <xref targe t="script"/> | |||
| does not implement smart folding.</t> | does not implement smart folding.</t> | |||
| <t>Note that the headers are surrounded by different printable charact | <t>Note that the headers are surrounded by different printable character | |||
| ers | s | |||
| than shown in the script-generated examples.</t> | than those shown in the script-generated examples.</t> | |||
| <section title="Using '\'"> | <section numbered="true" toc="default"> | |||
| <figure> | <name>Using '\'</name> | |||
| <artwork><![CDATA[ | <artwork name="example-3.1.txt.folded.smart"><![CDATA[ | |||
| [NOTE: '\' line wrapping per BCP XXX (RFC XXXX)] | [NOTE: '\' line wrapping per RFC 8792] | |||
| <yang-library | <yang-library | |||
| xmlns="urn:ietf:params:xml:ns:yang:ietf-yang-library" | xmlns="urn:ietf:params:xml:ns:yang:ietf-yang-library" | |||
| xmlns:ds="urn:ietf:params:xml:ns:yang:ietf-datastores"> | xmlns:ds="urn:ietf:params:xml:ns:yang:ietf-datastores"> | |||
| <module-set> | <module-set> | |||
| <name>config-modules</name> | <name>config-modules</name> | |||
| <module> | <module> | |||
| <name>ietf-interfaces</name> | <name>ietf-interfaces</name> | |||
| <revision>2018-02-20</revision> | <revision>2018-02-20</revision> | |||
| <namespace>\ | <namespace>\ | |||
| urn:ietf:params:xml:ns:yang:ietf-interfaces\ | urn:ietf:params:xml:ns:yang:ietf-interfaces\ | |||
| </namespace> | </namespace> | |||
| </module> | </module> | |||
| ... | ... | |||
| </module-set> | </module-set> | |||
| ... | ... | |||
| </yang-library> | </yang-library>]]></artwork> | |||
| ]]></artwork> | <t>Below is the equivalent of the above, but it was folded using the | |||
| </figure> | script in <xref target="script"/>.</t> | |||
| <t>Below is the equivalent to the above, but it was folded using the | <artwork name="example-3.1.txt.folded.rfcfold"><![CDATA[ | |||
| script in the appendix.</t> | ========== NOTE: '\' line wrapping per RFC 8792 =========== | |||
| <figure> | ||||
| <artwork><![CDATA[ | ||||
| ========== NOTE: '\' line wrapping per BCP XXX (RFC XXXX) =========== | ||||
| <yang-library | <yang-library | |||
| xmlns="urn:ietf:params:xml:ns:yang:ietf-yang-library" | xmlns="urn:ietf:params:xml:ns:yang:ietf-yang-library" | |||
| xmlns:ds="urn:ietf:params:xml:ns:yang:ietf-datastores"> | xmlns:ds="urn:ietf:params:xml:ns:yang:ietf-datastores"> | |||
| <module-set> | <module-set> | |||
| <name>config-modules</name> | <name>config-modules</name> | |||
| <module> | <module> | |||
| <name>ietf-interfaces</name> | <name>ietf-interfaces</name> | |||
| <revision>2018-02-20</revision> | <revision>2018-02-20</revision> | |||
| <namespace>urn:ietf:params:xml:ns:yang:ietf-interfaces</namesp\ | <namespace>urn:ietf:params:xml:ns:yang:ietf-interfaces</namesp\ | |||
| ace> | ace> | |||
| </module> | </module> | |||
| ... | ... | |||
| </module-set> | </module-set> | |||
| ... | ... | |||
| </yang-library> | </yang-library>]]></artwork> | |||
| ]]></artwork> | </section> | |||
| </figure> | <section numbered="true" toc="default"> | |||
| </section> | <name>Using '\\'</name> | |||
| <section title="Using '\\'"> | <artwork name="example-3.2.txt.folded.smart"><![CDATA[ | |||
| <figure> | [NOTE: '\\' line wrapping per RFC 8792] | |||
| <artwork><![CDATA[ | ||||
| [NOTE: '\\' line wrapping per BCP XXX (RFC XXXX)] | ||||
| <yang-library | <yang-library | |||
| xmlns="urn:ietf:params:xml:ns:yang:ietf-yang-library" | xmlns="urn:ietf:params:xml:ns:yang:ietf-yang-library" | |||
| xmlns:ds="urn:ietf:params:xml:ns:yang:ietf-datastores"> | xmlns:ds="urn:ietf:params:xml:ns:yang:ietf-datastores"> | |||
| <module-set> | <module-set> | |||
| <name>config-modules</name> | <name>config-modules</name> | |||
| <module> | <module> | |||
| <name>ietf-interfaces</name> | <name>ietf-interfaces</name> | |||
| <revision>2018-02-20</revision> | <revision>2018-02-20</revision> | |||
| <namespace>\ | <namespace>\ | |||
| \urn:ietf:params:xml:ns:yang:ietf-interfaces\ | \urn:ietf:params:xml:ns:yang:ietf-interfaces\ | |||
| \</namespace> | \</namespace> | |||
| </module> | </module> | |||
| ... | ... | |||
| </module-set> | </module-set> | |||
| ... | ... | |||
| </yang-library> | </yang-library>]]></artwork> | |||
| ]]></artwork> | <t>Below is the equivalent of the above, but it was folded using the | |||
| </figure> | script in <xref target="script"/>.</t> | |||
| <t>Below is the equivalent to the above, but it was folded using the | <artwork name="example-3.2.txt.folded.rfcfold"><![CDATA[ | |||
| script in the appendix.</t> | ========== NOTE: '\\' line wrapping per RFC 8792 ========== | |||
| <figure> | ||||
| <artwork><![CDATA[ | ||||
| ========== NOTE: '\\' line wrapping per BCP XXX (RFC XXXX) ========== | ||||
| <yang-library | <yang-library | |||
| xmlns="urn:ietf:params:xml:ns:yang:ietf-yang-library" | xmlns="urn:ietf:params:xml:ns:yang:ietf-yang-library" | |||
| xmlns:ds="urn:ietf:params:xml:ns:yang:ietf-datastores"> | xmlns:ds="urn:ietf:params:xml:ns:yang:ietf-datastores"> | |||
| <module-set> | <module-set> | |||
| <name>config-modules</name> | <name>config-modules</name> | |||
| <module> | <module> | |||
| <name>ietf-interfaces</name> | <name>ietf-interfaces</name> | |||
| <revision>2018-02-20</revision> | <revision>2018-02-20</revision> | |||
| <namespace>urn:ietf:params:xml:ns:yang:ietf-interfaces</namesp\ | <namespace>urn:ietf:params:xml:ns:yang:ietf-interfaces</namesp\ | |||
| \ace> | \ace> | |||
| </module> | </module> | |||
| ... | ... | |||
| </module-set> | </module-set> | |||
| ... | ... | |||
| </yang-library> | </yang-library>]]></artwork> | |||
| ]]></artwork> | ||||
| </figure> | ||||
| </section> | ||||
| </section> | </section> | |||
| </section> | ||||
| <section title="Example Showing "Forced" Folding"> | <section numbered="true" toc="default"> | |||
| <t>This example illustrates how invalid sequences in lines that do not | <name>Example Showing "Forced" Folding</name> | |||
| <t>This example illustrates how invalid sequences in lines that do not | ||||
| have to be folded can be handled via forced folding, whereby the fol ding | have to be folded can be handled via forced folding, whereby the fol ding | |||
| occurs even though unnecessary.</t> | occurs even though unnecessary.</t> | |||
| <t> | ||||
| <figure> | <artwork name="example-4.txt" type="" align="left" alt=""><![CDATA[ | |||
| <artwork><![CDATA[ | The following line exceeds a 68-char max and, thus, demands folding: | |||
| The following line exceeds a 68-char max, thus demands folding | ||||
| 123456789012345678901234567890123456789012345678901234567890123456789 | 123456789012345678901234567890123456789012345678901234567890123456789 | |||
| This line ends with a backslash \ | This line ends with a backslash \ | |||
| This line ends with a backslash \ | This line ends with a backslash \ | |||
| \ This line begins with a backslash | \ This line begins with a backslash | |||
| Following is an indented 3x3 block of backslashes: | The following is an indented 3x3 block of backslashes: | |||
| \\\ | ||||
| \\\ | \\\ | |||
| \\\ | \\\ | |||
| ]]></artwork> | \\\]]></artwork> | |||
| </figure> | <t>The samples below were manually folded, since the script in the appen | |||
| </t> | dix | |||
| <t>The samples below were manually folded, since the script in the app | ||||
| endix | ||||
| does not implement forced folding.</t> | does not implement forced folding.</t> | |||
| <t>Note that the headers are prefixed by a pound ('#') character, rath | <t>Note that the headers are prefixed by a pound ('#') character, rather | |||
| er | than surrounded by 'equals' ('=') characters as shown in the script- | |||
| than surrounded by equal ('=') characters as shown in the script-gen | generated | |||
| erated | ||||
| examples.</t> | examples.</t> | |||
| <section title="Using '\'"> | <section numbered="true" toc="default"> | |||
| <figure> | <name>Using '\'</name> | |||
| <artwork><![CDATA[ | <artwork name="example-4.1.txt.folded.forced" type="" align="left" alt | |||
| # NOTE: '\' line wrapping per BCP XXX (RFC XXXX) | =""><![CDATA[ | |||
| # NOTE: '\' line wrapping per RFC 8792 | ||||
| The following line exceeds a 68-char max, thus demands folding | The following line exceeds a 68-char max and, thus, demands folding: | |||
| 1234567890123456789012345678901234567890123456789012345678901234567\ | 1234567890123456789012345678901234567890123456789012345678901234567\ | |||
| 89 | 89 | |||
| This line ends with a backslash \\ | This line ends with a backslash \\ | |||
| This line ends with a backslash \\ | This line ends with a backslash \\ | |||
| \ This line begins with a backslash | \ This line begins with a backslash | |||
| Following is an indented 3x3 block of backslashes: | The following is an indented 3x3 block of backslashes: | |||
| \\\\ | \\\\ | |||
| \\\\ | \\\\ | |||
| \\\ | \\\]]></artwork> | |||
| ]]></artwork> | </section> | |||
| </figure> | <section numbered="true" toc="default"> | |||
| </section> | <name>Using '\\'</name> | |||
| <section title="Using '\\'"> | <artwork name="example-4.2.txt.folded.forced" type="" align="left" alt | |||
| <figure> | =""><![CDATA[ | |||
| <artwork><![CDATA[ | # NOTE: '\\' line wrapping per RFC 8792 | |||
| # NOTE: '\\' line wrapping per BCP XXX (RFC XXXX) | ||||
| The following line exceeds a 68-char max, thus demands folding | The following line exceeds a 68-char max and, thus, demands folding: | |||
| 1234567890123456789012345678901234567890123456789012345678901234567\ | 1234567890123456789012345678901234567890123456789012345678901234567\ | |||
| \89 | \89 | |||
| This line ends with a backslash \ | This line ends with a backslash \ | |||
| This line ends with a backslash \\ | This line ends with a backslash \\ | |||
| \ | \ | |||
| \ This line begins with a backslash | \ This line begins with a backslash | |||
| Following is an indented 3x3 block of backslashes: | The following is an indented 3x3 block of backslashes: | |||
| \\\\ | \\\\ | |||
| \ | \ | |||
| \\\\ | \\\\ | |||
| \ | \ | |||
| \\\ | \\\]]></artwork> | |||
| ]]></artwork> | ||||
| </figure> | ||||
| </section> | ||||
| </section> | </section> | |||
| </section> | </section> | |||
| </section> | ||||
| <section title="Security Considerations" anchor="sec-cons"> | <section anchor="sec-cons" numbered="true" toc="default"> | |||
| <t>This BCP has no Security Considerations.</t> | <name>Security Considerations</name> | |||
| </section> | <t>This document has no security considerations.</t> | |||
| </section> | ||||
| <section title="IANA Considerations" anchor="iana-cons"> | <section anchor="iana-cons" numbered="true" toc="default"> | |||
| <t>This BCP has no IANA Considerations.</t> | <name>IANA Considerations</name> | |||
| </section> | <t>This document has no IANA actions.</t> | |||
| </section> | ||||
| </middle> | </middle> | |||
| <back> | ||||
| <back> | <references> | |||
| <name>References</name> | ||||
| <references title="Normative References"> | <references> | |||
| <?rfc include="reference.RFC.2119.xml"?> | <name>Normative References</name> | |||
| <?rfc include="reference.RFC.7991.xml"?> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.2119. | |||
| <?rfc include="reference.RFC.8174.xml"?> | xml"/> | |||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.7991. | ||||
| xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8174. | ||||
| xml"/> | ||||
| </references> | </references> | |||
| <references> | ||||
| <references title="Informative References"> | <name>Informative References</name> | |||
| <?rfc include="reference.RFC.7950.xml"?> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.7950. | |||
| <?rfc include="reference.RFC.7749.xml"?> | xml"/> | |||
| <?rfc include="reference.RFC.7994.xml"?> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.7749. | |||
| <?rfc include="reference.RFC.8340.xml"?> | xml"/> | |||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.7994. | ||||
| xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8340. | ||||
| xml"/> | ||||
| <reference anchor="yang-doctors-thread" target="https://mailarchive.ietf .org/arch/msg/yang-doctors/DCfBqgfZPAD7afzeDFlQ1Xm2X3g"> | <reference anchor="yang-doctors-thread" target="https://mailarchive.ietf .org/arch/msg/yang-doctors/DCfBqgfZPAD7afzeDFlQ1Xm2X3g"> | |||
| <front> | <front> | |||
| <title>[yang-doctors] automating yang doctor reviews</title> | <title>[yang-doctors] automating yang doctor reviews</title> | |||
| <author/> | <author initials="K" surname="Watsen" /> | |||
| <date/> | <date day="18" month="April" year="2018" /> | |||
| </front> | </front> | |||
| <refcontent>message to the yang-doctors mailing list</refcontent> | ||||
| </reference> | </reference> | |||
| <reference anchor="bash" target="https://www.gnu.org/software/bash/manua l"> | <reference anchor="bash" target="https://www.gnu.org/software/bash/manua l"> | |||
| <front><title>GNU Bash Manual</title><author/><date/></front> | <front> | |||
| <title>GNU Bash Manual</title> | ||||
| <author/> | ||||
| </front> | ||||
| </reference> | </reference> | |||
| <reference anchor="xiax" target="https://pypi.org/project/xiax/"> | <reference anchor="xiax" target="https://pypi.org/project/xiax/"> | |||
| <front><title>The `xiax` Python Package</title><author/><date/></front | <front> | |||
| > | <title>The 'xiax' Python Package</title> | |||
| <author/> | ||||
| </front> | ||||
| </reference> | </reference> | |||
| <reference anchor="pyang" target="https://pypi.org/project/pyang/"> | <reference anchor="pyang" target="https://pypi.org/project/pyang/"> | |||
| <front><title>An extensible YANG (RFC 6020/7950) validator.</title><au | <front> | |||
| thor/><date/></front> | <title>pyang</title> | |||
| <author/> | ||||
| </front> | ||||
| </reference> | </reference> | |||
| <reference anchor="xml2rfc" target="https://pypi.org/project/xml2rfc/"> | <reference anchor="xml2rfc" target="https://pypi.org/project/xml2rfc/"> | |||
| <front><title>Xml2rfc generates RFCs and IETF drafts from document sou | <front> | |||
| rce in XML according to the IETF xml2rfc v2 and v3 vocabularies.</title><author/ | <title>xml2rfc</title> | |||
| ><date/></front> | <author/> | |||
| </front> | ||||
| </reference> | </reference> | |||
| <reference anchor="yanglint" target="https://github.com/CESNET/libyang#y anglint"> | <reference anchor="yanglint" target="https://github.com/CESNET/libyang#y anglint"> | |||
| <front><title>A feature-rich tool for validation and conversion of the | <front> | |||
| schemas and YANG modeled data.</title><author/><date/></front> | <title>yanglint</title> | |||
| <seriesInfo name="commit" value="1b7d73d"/> | ||||
| <author/> | ||||
| <date month="February" year="2020"/> | ||||
| </front> | ||||
| </reference> | </reference> | |||
| </references> | </references> | |||
| </references> | ||||
| <!-- APPENDICIES --> | <section anchor="script" numbered="true" toc="default"> | |||
| <section title="Bash Shell Script: rfcfold" anchor="script"> | <name>Bash Shell Script: rfcfold</name> | |||
| <t>This non-normative appendix section includes a Bash <xref target="bas | <t>This non-normative appendix includes a Bash shell script <xref target=" | |||
| h"/> shell script | bash" format="default"/> | |||
| that can both fold and unfold text content using both the | that can both fold and unfold text content using both the | |||
| single and double backslash strategies described in | single and double backslash strategies described in Sections <xre | |||
| <xref target="single-slash"/> and <xref target="double-slash"/> | f target="single-slash" format="counter"/> and <xref target="double-slash" forma | |||
| respectively.</t> | t="counter"/>, | |||
| <t>This script is intended to be applied to a single text content | respectively. This shell script, called 'rfcfold', is maintained at | |||
| <eref brackets="angle" target="https://github.com/ietf-tools/rfcfold"/>.</ | ||||
| t> | ||||
| <t>This script is intended to be applied to a single text content | ||||
| instance. If it is desired to fold or unfold text content instances | instance. If it is desired to fold or unfold text content instances | |||
| within a larger document (e.g., an Internet draft or RFC), then | within a larger document (e.g., an Internet-Draft or RFC), then | |||
| another tool must be used to extract the content from the larger | another tool must be used to extract the content from the larger | |||
| document before utilizing this script.</t> | document before utilizing this script.</t> | |||
| <t>For readability purposes, this script forces the minimally | <t>For readability purposes, this script forces the minimum | |||
| supported line length to be eight characters longer than the | supported line length to be eight characters longer than the | |||
| raw header text defined in <xref target="single-header"/> and | raw header text defined in Sections <xref target="single-header" | |||
| <xref target="double-header"/> so as to ensure that the header | format="counter"/> and | |||
| can be wrapped by a space (' ') character and three equal ('=') | <xref target="double-header" format="counter"/> so as to ensure that t | |||
| characters on each side of the raw header text.</t> | he header | |||
| <t>When a TAB character is detected in the input file, this script | can be wrapped by a space (' ') character and three 'equals' ('=' | |||
| exits with the error message:</t> | ) | |||
| <t> | characters on each side of the raw header text. | |||
| <figure> | </t> | |||
| <artwork><![CDATA[ | <t>When a tab character is detected in the input file, this script | |||
| Error: infile contains a TAB character, which is not allowed. | exits with the following error message:</t> | |||
| ]]></artwork> | <ul empty="true"> | |||
| </figure> | <li>Error: infile contains a tab character, which is not allowed.</li> | |||
| </t> | </ul> | |||
| <t>This script tests for the availability of GNU awk (gawk), in | <t>This script tests for the availability of GNU awk (gawk), in | |||
| order to test for ASCII-based control characters and non-ASCII | order to test for ASCII-based control characters and non-ASCII | |||
| characters in the input file (see below). Note that testing | characters in the input file (see below). Note that testing | |||
| revealed flaws in the default version of `awk` on some platforms. | revealed flaws in the default version of 'awk' on some platforms. | |||
| As the use of `gawk` is only used to issue warning messages, | As this script uses 'gawk' only to issue warning messages, | |||
| if `gawk` of not found, this script issues the debug message: | if 'gawk' is not found, this script issues the following debug | |||
| </t> | message: | |||
| <t> | </t> | |||
| <figure> | <ul empty="true"> | |||
| <artwork><![CDATA[ | <li>Debug: no GNU awk; skipping checks for special characters.</li> | |||
| Debug: no GNU Awk, skipping checks for special characters. | </ul> | |||
| ]]></artwork> | <t>When 'gawk' is available (see above) and ASCII-based control | |||
| </figure> | ||||
| </t> | ||||
| <t>When `gawk` is available (see above) and ASCII-based control | ||||
| characters are detected in the input file, this script issues | characters are detected in the input file, this script issues | |||
| the warning message:</t> | the following warning message:</t> | |||
| <t> | <ul empty="true"> | |||
| <figure> | <li>Warning: infile contains ASCII control characters (unsupported).</li> | |||
| <artwork><![CDATA[ | </ul> | |||
| Warning: infile contains ASCII control characters (unsupported). | <t>When 'gawk' is available (see above) and non-ASCII characters | |||
| ]]></artwork> | are detected in the input file, this script issues the following warni | |||
| </figure> | ng | |||
| </t> | ||||
| <t>When `gawk` is available (see above) and non-ASCII characters | ||||
| are detected in the input file, this script issues the warning | ||||
| message:</t> | message:</t> | |||
| <t> | <ul empty="true"> | |||
| <figure> | <li>Warning: infile contains non-ASCII characters (unsupported).</li> | |||
| <artwork><![CDATA[ | </ul> | |||
| Warning: infile contains non-ASCII characters (unsupported). | <t>This script does not implement the whitespace-avoidance logic | |||
| ]]></artwork> | described in <xref target="single-folding" format="default"/>. In | |||
| </figure> | such a case, | |||
| </t> | the script will exit with the following error message:</t> | |||
| <t>This script does not implement the whitespace-avoidance logic | ||||
| described in <xref target="single-folding"/>. In such case, | <ul empty="true"> | |||
| the script will exit with the following message:</t> | <li>Error: infile has a space character occurring on the | |||
| <t> | ||||
| <figure> | ||||
| <artwork><![CDATA[ | ||||
| Error: infile has a space character occurring on the | ||||
| folding column. This file cannot be folded using the | folding column. This file cannot be folded using the | |||
| '\' strategy. | '\' strategy.</li> | |||
| ]]></artwork> | </ul> | |||
| </figure> | <t>While this script can unfold input that contains forced foldings, | |||
| </t> | ||||
| <t>While this script can unfold input that contains forced foldings, | ||||
| it is unable to fold files that would require forced foldings. Forced | it is unable to fold files that would require forced foldings. Forced | |||
| folding is described in <xref target="single-folding"/> and | folding is described in Sections <xref target="single-folding" fo | |||
| <xref target="double-folding"/>. When being asked to fold a file | rmat="counter"/> and | |||
| <xref target="double-folding" format="counter"/>. When being asked to | ||||
| fold a file | ||||
| that would require forced folding, the script will instead exit | that would require forced folding, the script will instead exit | |||
| with the following message:</t> | with one of the following error messages:</t> | |||
| <t> | <t>For '\':</t> | |||
| <figure> | <ul empty="true"> | |||
| <preamble>For '\':</preamble> | <li>Error: infile has a line ending with a '\' character. | |||
| <artwork><![CDATA[ | ||||
| Error: infile has a line ending with a '\' character. | ||||
| This file cannot be folded using the '\' strategy without | This file cannot be folded using the '\' strategy without | |||
| there being false positives produced in the unfolding | there being false positives produced in the unfolding | |||
| (i.e., this script does not force-fold such lines, as | (i.e., this script does not force-fold such lines, as | |||
| described in BCP XXX, RFC XXXX). | described in RFC 8792).</li> | |||
| ]]></artwork> | </ul> | |||
| </figure> | <t>For '\\':</t> | |||
| </t> | <ul empty="true"> | |||
| <t> | <li>Error: infile has a line ending with a '\' character | |||
| <figure> | ||||
| <preamble>For '\\':</preamble> | ||||
| <artwork><![CDATA[ | ||||
| Error: infile has a line ending with a '\' character | ||||
| followed by a '\' character as the first non-space | followed by a '\' character as the first non-space | |||
| character on the next line. This script cannot fold | character on the next line. This script cannot fold | |||
| this file using '\\' strategy without there being | this file using the '\\' strategy without there being | |||
| false positives produced in the unfolding (i.e., this | false positives produced in the unfolding (i.e., this | |||
| script does not force-fold such lines, as described | script does not force-fold such lines, as described | |||
| in BCP XXX, RFC XXXX). | in RFC 8792). | |||
| ]]></artwork> | </li> | |||
| </figure> | </ul> | |||
| </t> | <t>Shell-level end-of-line backslash ('\') characters have been | |||
| <t>Shell-level end-of-line backslash ('\') characters have been | ||||
| purposely added to the script so as to ensure that the script is | purposely added to the script so as to ensure that the script is | |||
| itself not folded in this document, thus simplifying the ability to | itself not folded in this document, thus simplifying the ability to | |||
| copy/paste the script for local use. As should be evident by the | copy/paste the script for local use. As should be evident by the | |||
| lack of the mandatory header described in <xref target="single-header" | lack of the mandatory header described in <xref target="single-header" | |||
| />, | format="default"/>, | |||
| these backslashes do not designate a folded line, such as described | these backslashes do not designate a folded line (e.g., as described | |||
| in <xref target="single-slash"/>.</t> | in <xref target="single-slash" format="default"/>).</t> | |||
| <t> | <sourcecode name="rfcfold" type="bash" markers="true"><![CDATA[ | |||
| <figure> | ||||
| <preamble><CODE BEGINS></preamble> | ||||
| <artwork name="rfcfold"><![CDATA[ | ||||
| #!/bin/bash --posix | #!/bin/bash --posix | |||
| # This script may need some adjustments to work on a given system. | # This script may need some adjustments to work on a given system. | |||
| # For instance, the utility `gsed` may need to be installed. | # For instance, the utility 'gsed' may need to be installed. | |||
| # Also, please be advised that `bash` (not `sh`) must be used. | # Also, please be advised that 'bash' (not 'sh') must be used. | |||
| # Copyright (c) 2019 IETF Trust, Kent Watsen, and Erik Auerswald. | # Copyright (c) 2020 IETF Trust, Kent Watsen, and Erik Auerswald. | |||
| # All rights reserved. | # All rights reserved. | |||
| # | # | |||
| # Redistribution and use in source and binary forms, with or without | # Redistribution and use in source and binary forms, with or without | |||
| # modification, are permitted provided that the following conditions | # modification, are permitted provided that the following conditions | |||
| # are met: | # are met: | |||
| # | # | |||
| # * Redistributions of source code must retain the above copyright | # * Redistributions of source code must retain the above copyright | |||
| # notice, this list of conditions and the following disclaimer. | # notice, this list of conditions and the following disclaimer. | |||
| # | # | |||
| # * Redistributions in binary form must reproduce the above | # * Redistributions in binary form must reproduce the above | |||
| skipping to change at line 938 ¶ | skipping to change at line 887 ¶ | |||
| # provided with the distribution. | # provided with the distribution. | |||
| # | # | |||
| # * Neither the name of Internet Society, IETF or IETF Trust, nor | # * Neither the name of Internet Society, IETF or IETF Trust, nor | |||
| # the names of specific contributors, may be used to endorse or | # the names of specific contributors, may be used to endorse or | |||
| # promote products derived from this software without specific | # promote products derived from this software without specific | |||
| # prior written permission. | # prior written permission. | |||
| # | # | |||
| # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |||
| # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |||
| # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | |||
| # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | |||
| # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | |||
| # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | |||
| # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | |||
| # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | |||
| # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | |||
| # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | |||
| # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF | # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF | |||
| # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||
| print_usage() { | print_usage() { | |||
| printf "\n" | printf "\n" | |||
| printf "Folds or unfolds the input text file according to BCP XXX" | printf "Folds or unfolds the input text file according to" | |||
| printf " (RFC XXXX).\n" | printf " RFC 8792.\n" | |||
| printf "\n" | printf "\n" | |||
| printf "Usage: rfcfold [-h] [-d] [-q] [-s <strategy>] [-c <col>]" | printf "Usage: rfcfold [-h] [-d] [-q] [-s <strategy>] [-c <col>]" | |||
| printf " [-r] -i <infile> -o <outfile>\n" | printf " [-r] -i <infile> -o <outfile>\n" | |||
| printf "\n" | printf "\n" | |||
| printf " -s: strategy to use, '1' or '2' (default: try 1," | printf " -s: strategy to use, '1' or '2' (default: try 1," | |||
| printf " else 2)\n" | printf " else 2)\n" | |||
| printf " -c: column to fold on (default: 69)\n" | printf " -c: column to fold on (default: 69)\n" | |||
| printf " -r: reverses the operation\n" | printf " -r: reverses the operation\n" | |||
| printf " -i: the input filename\n" | printf " -i: the input filename\n" | |||
| printf " -o: the output filename\n" | printf " -o: the output filename\n" | |||
| skipping to change at line 979 ¶ | skipping to change at line 928 ¶ | |||
| # global vars, do not edit | # global vars, do not edit | |||
| strategy=0 # auto | strategy=0 # auto | |||
| debug=0 | debug=0 | |||
| quiet=0 | quiet=0 | |||
| reversed=0 | reversed=0 | |||
| infile="" | infile="" | |||
| outfile="" | outfile="" | |||
| maxcol=69 # default, may be overridden by param | maxcol=69 # default, may be overridden by param | |||
| col_gvn=0 # maxcol overridden? | col_gvn=0 # maxcol overridden? | |||
| hdr_txt_1="NOTE: '\\' line wrapping per BCP XXX (RFC XXXX)" | hdr_txt_1="NOTE: '\\' line wrapping per RFC 8792" | |||
| hdr_txt_2="NOTE: '\\\\' line wrapping per BCP XXX (RFC XXXX)" | hdr_txt_2="NOTE: '\\\\' line wrapping per RFC 8792" | |||
| equal_chars="=======================================================" | equal_chars="=======================================================" | |||
| space_chars=" " | space_chars=" " | |||
| temp_dir="" | temp_dir="" | |||
| prog_name='rfcfold' | prog_name='rfcfold' | |||
| # functions for diagnostic messages | # functions for diagnostic messages | |||
| prog_msg() { | prog_msg() { | |||
| if [[ "$quiet" -eq 0 ]]; then | if [[ "$quiet" -eq 0 ]]; then | |||
| format_string="${prog_name}: $1: %s\n" | format_string="${prog_name}: $1: %s\n" | |||
| shift | shift | |||
| skipping to change at line 1038 ¶ | skipping to change at line 987 ¶ | |||
| return 1 | return 1 | |||
| fi | fi | |||
| # where to fold | # where to fold | |||
| foldcol=$(expr "$maxcol" - 1) # for the inserted '\' char | foldcol=$(expr "$maxcol" - 1) # for the inserted '\' char | |||
| # ensure input file doesn't contain whitespace on the fold column | # ensure input file doesn't contain whitespace on the fold column | |||
| grep -q "^\(.\{$foldcol\}\)\{1,\} " "$infile" | grep -q "^\(.\{$foldcol\}\)\{1,\} " "$infile" | |||
| if [[ $? -eq 0 ]]; then | if [[ $? -eq 0 ]]; then | |||
| err "infile '$infile' has a space character occurring on the"\ | err "infile '$infile' has a space character occurring on the"\ | |||
| "folding column. This file cannot be folded using the"\ | "folding column. This file cannot be folded using the"\ | |||
| "'\\' strategy." | "'\\' strategy." | |||
| return 1 | return 1 | |||
| fi | fi | |||
| # center header text | # center header text | |||
| length=$(expr ${#hdr_txt_1} + 2) | length=$(expr ${#hdr_txt_1} + 2) | |||
| left_sp=$(expr \( "$maxcol" - "$length" \) / 2) | left_sp=$(expr \( "$maxcol" - "$length" \) / 2) | |||
| right_sp=$(expr "$maxcol" - "$length" - "$left_sp") | right_sp=$(expr "$maxcol" - "$length" - "$left_sp") | |||
| header=$(printf "%.*s %s %.*s" "$left_sp" "$equal_chars"\ | header=$(printf "%.*s %s %.*s" "$left_sp" "$equal_chars"\ | |||
| "$hdr_txt_1" "$right_sp" "$equal_chars") | "$hdr_txt_1" "$right_sp" "$equal_chars") | |||
| skipping to change at line 1071 ¶ | skipping to change at line 1020 ¶ | |||
| fold_it_2() { | fold_it_2() { | |||
| # where to fold | # where to fold | |||
| foldcol=$(expr "$maxcol" - 1) # for the inserted '\' char | foldcol=$(expr "$maxcol" - 1) # for the inserted '\' char | |||
| # ensure input file doesn't contain the fold-sequence already | # ensure input file doesn't contain the fold-sequence already | |||
| if [[ -n "$("$SED" -n '/\\$/{N;s/\\\n[ ]*\\/&/p;D}' "$infile")" ]] | if [[ -n "$("$SED" -n '/\\$/{N;s/\\\n[ ]*\\/&/p;D}' "$infile")" ]] | |||
| then | then | |||
| err "infile '$infile' has a line ending with a '\\' character"\ | err "infile '$infile' has a line ending with a '\\' character"\ | |||
| "followed by a '\\' character as the first non-space"\ | "followed by a '\\' character as the first non-space"\ | |||
| "character on the next line. This script cannot fold"\ | "character on the next line. This script cannot fold"\ | |||
| "this file using '\\\\' strategy without there being"\ | "this file using the '\\\\' strategy without there being"\ | |||
| "false positives produced in the unfolding." | "false positives produced in the unfolding." | |||
| return 1 | return 1 | |||
| fi | fi | |||
| # center header text | # center header text | |||
| length=$(expr ${#hdr_txt_2} + 2) | length=$(expr ${#hdr_txt_2} + 2) | |||
| left_sp=$(expr \( "$maxcol" - "$length" \) / 2) | left_sp=$(expr \( "$maxcol" - "$length" \) / 2) | |||
| right_sp=$(expr "$maxcol" - "$length" - "$left_sp") | right_sp=$(expr "$maxcol" - "$length" - "$left_sp") | |||
| header=$(printf "%.*s %s %.*s" "$left_sp" "$equal_chars"\ | header=$(printf "%.*s %s %.*s" "$left_sp" "$equal_chars"\ | |||
| "$hdr_txt_2" "$right_sp" "$equal_chars") | "$hdr_txt_2" "$right_sp" "$equal_chars") | |||
| skipping to change at line 1095 ¶ | skipping to change at line 1044 ¶ | |||
| echo "" >> "$outfile" | echo "" >> "$outfile" | |||
| "$SED" 's/\(.\{'"$foldcol"'\}\)\(..\)/\1\\\n\\\2/;t M;b;:M;P;D;'\ | "$SED" 's/\(.\{'"$foldcol"'\}\)\(..\)/\1\\\n\\\2/;t M;b;:M;P;D;'\ | |||
| < "$infile" >> "$outfile" 2> /dev/null | < "$infile" >> "$outfile" 2> /dev/null | |||
| if [[ $? -ne 0 ]]; then | if [[ $? -ne 0 ]]; then | |||
| return 1 | return 1 | |||
| fi | fi | |||
| return 0 | return 0 | |||
| } | } | |||
| fold_it() { | fold_it() { | |||
| # ensure input file doesn't contain a TAB | # ensure input file doesn't contain a tab | |||
| grep -q $'\t' "$infile" | grep -q $'\t' "$infile" | |||
| if [[ $? -eq 0 ]]; then | if [[ $? -eq 0 ]]; then | |||
| err "infile '$infile' contains a TAB character, which is not"\ | err "infile '$infile' contains a tab character, which is not"\ | |||
| "allowed." | "allowed." | |||
| return 1 | return 1 | |||
| fi | fi | |||
| # folding of input containing ASCII control or non-ASCII characters | # folding of input containing ASCII control or non-ASCII characters | |||
| # may result in a wrong folding column and is not supported | # may result in a wrong folding column and is not supported | |||
| if type gawk > /dev/null 2>&1; then | if type gawk > /dev/null 2>&1; then | |||
| env LC_ALL=C gawk '/[\000-\014\016-\037\177]/{exit 1}' "$infile"\ | env LC_ALL=C gawk '/[\000-\014\016-\037\177]/{exit 1}' "$infile"\ | |||
| || warn "infile '$infile' contains ASCII control characters"\ | || warn "infile '$infile' contains ASCII control characters"\ | |||
| "(unsupported)." | "(unsupported)." | |||
| env LC_ALL=C gawk '/[^\000-\177]/{exit 1}' "$infile"\ | env LC_ALL=C gawk '/[^\000-\177]/{exit 1}' "$infile"\ | |||
| || warn "infile '$infile' contains non-ASCII characters"\ | || warn "infile '$infile' contains non-ASCII characters"\ | |||
| "(unsupported)." | "(unsupported)." | |||
| else | else | |||
| dbg "no GNU Awk, skipping checks for special characters." | dbg "no GNU awk; skipping checks for special characters." | |||
| fi | fi | |||
| # check if file needs folding | # check if file needs folding | |||
| testcol=$(expr "$maxcol" + 1) | testcol=$(expr "$maxcol" + 1) | |||
| grep -q ".\{$testcol\}" "$infile" | grep -q ".\{$testcol\}" "$infile" | |||
| if [[ $? -ne 0 ]]; then | if [[ $? -ne 0 ]]; then | |||
| dbg "nothing to do; copying infile to outfile." | dbg "nothing to do; copying infile to outfile." | |||
| cp "$infile" "$outfile" | cp "$infile" "$outfile" | |||
| return 255 | return 255 | |||
| fi | fi | |||
| skipping to change at line 1139 ¶ | skipping to change at line 1088 ¶ | |||
| if [[ "$strategy" -eq 2 ]]; then | if [[ "$strategy" -eq 2 ]]; then | |||
| fold_it_2 | fold_it_2 | |||
| return $? | return $? | |||
| fi | fi | |||
| quiet_sav="$quiet" | quiet_sav="$quiet" | |||
| quiet=1 | quiet=1 | |||
| fold_it_1 | fold_it_1 | |||
| result=$? | result=$? | |||
| quiet="$quiet_sav" | quiet="$quiet_sav" | |||
| if [[ "$result" -ne 0 ]]; then | if [[ "$result" -ne 0 ]]; then | |||
| dbg "Folding strategy '1' didn't succeed, trying strategy '2'..." | dbg "Folding strategy '1' didn't succeed; trying strategy '2'..." | |||
| fold_it_2 | fold_it_2 | |||
| return $? | return $? | |||
| fi | fi | |||
| return 0 | return 0 | |||
| } | } | |||
| unfold_it_1() { | unfold_it_1() { | |||
| temp_dir=$(mktemp -d) | temp_dir=$(mktemp -d) | |||
| # output all but the first two lines (the header) to wip file | # output all but the first two lines (the header) to wip file | |||
| skipping to change at line 1300 ¶ | skipping to change at line 1249 ¶ | |||
| if [[ "$reversed" -eq 0 ]]; then | if [[ "$reversed" -eq 0 ]]; then | |||
| fold_it | fold_it | |||
| code=$? | code=$? | |||
| else | else | |||
| unfold_it | unfold_it | |||
| code=$? | code=$? | |||
| fi | fi | |||
| exit "$code" | exit "$code" | |||
| } | } | |||
| main "$@" | main "$@"]]></sourcecode> | |||
| ]]></artwork> | ||||
| <postamble><CODE ENDS></postamble> | ||||
| </figure> | ||||
| </t> | ||||
| </section> | ||||
| <section title="Acknowledgements" numbered="no"> | </section> | |||
| <t>The authors thank the RFC Editor for confirming that there was | <section numbered="false" toc="default"> | |||
| <name>Acknowledgements</name> | ||||
| <t>The authors thank the RFC Editor for confirming that there was | ||||
| previously no set convention, at the time of this document's publicati on, | previously no set convention, at the time of this document's publicati on, | |||
| for handling long lines in source code inclusions, thus instigating th is | for handling long lines in source code inclusions, thus instigating th is | |||
| work.</t> | work.</t> | |||
| <t>The authors thank the following folks for their various | ||||
| <t>The authors thank the following folks for their various | ||||
| contributions while producing this document (sorted by first name): | contributions while producing this document (sorted by first name): | |||
| BenoƮt Claise, | <contact fullname="Ben Kaduk"/>, | |||
| Ben Kaduk, | <contact fullname="Benoit Claise"/>, | |||
| Gianmarco Bruno, | <contact fullname="Gianmarco Bruno"/>, | |||
| Italo Busi, | <contact fullname="Italo Busi"/>, | |||
| Joel Jaeggli, | <contact fullname="Joel Jaeggli"/>, | |||
| Jonathan Hansford, | <contact fullname="Jonathan Hansford"/>, | |||
| Lou Berger, | <contact fullname="Lou Berger"/>, | |||
| Martin Bjorklund, | <contact fullname="Martin Bjorklund"/>, | |||
| and Rob Wilton.</t> | and <contact fullname="Rob Wilton"/>.</t> | |||
| </section> | ||||
| </section> | </back> | |||
| </back> | ||||
| </rfc> | </rfc> | |||
| End of changes. 156 change blocks. | ||||
| 713 lines changed or deleted | 667 lines changed or added | |||
This html diff was produced by rfcdiff 1.45. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ | ||||