draft-ietf-netmod-artwork-folding-07.txt   draft-ietf-netmod-artwork-folding-08.txt
NETMOD Working Group K. Watsen NETMOD Working Group K. Watsen
Internet-Draft Watsen Networks Internet-Draft Watsen Networks
Intended status: Best Current Practice A. Farrel Intended status: Best Current Practice A. Farrel
Expires: , 2020 Old Dog Consulting Expires: February 3, 2020 Old Dog Consulting
Q. Wu Q. Wu
Huawei Technologies Huawei Technologies
, 2019 August 2, 2019
Handling Long Lines in Inclusions in Internet-Drafts and RFCs Handling Long Lines in Inclusions in Internet-Drafts and RFCs
draft-ietf-netmod-artwork-folding-0 draft-ietf-netmod-artwork-folding-08
Abstract Abstract
This document defines two strategies for handling long lines in This document defines two strategies for handling long lines in
width-bounded text content. One strategy is based on the historic width-bounded text content. One strategy is based on the historic
use of a single backslash ('\') character to indicate where line- use of a single backslash ('\') character to indicate where line-
folding has occurred, with the continuation occurring with the first folding has occurred, with the continuation occurring with the first
non-space (' ') character on the next line. The second strategy non-space (' ') character on the next line. The second strategy
extends the first strategy by adding a second backslash character to extends the first strategy by adding a second backslash character to
identify where the continuation begins and thereby able to handle identify where the continuation begins and thereby able to handle
skipping to change at page 1, line 42 skipping to change at page 1, line 42
Internet-Drafts are working documents of the Internet Engineering Internet-Drafts are working documents of the Internet Engineering
Task Force (IETF). Note that other groups may also distribute Task Force (IETF). Note that other groups may also distribute
working documents as Internet-Drafts. The list of current Internet- working documents as Internet-Drafts. The list of current Internet-
Drafts is at https://datatracker.ietf.org/drafts/current/. Drafts is at https://datatracker.ietf.org/drafts/current/.
Internet-Drafts are draft documents valid for a maximum of six months Internet-Drafts are draft documents valid for a maximum of six months
and may be updated, replaced, or obsoleted by other documents at any and may be updated, replaced, or obsoleted by other documents at any
time. It is inappropriate to use Internet-Drafts as reference time. It is inappropriate to use Internet-Drafts as reference
material or to cite them other than as "work in progress." material or to cite them other than as "work in progress."
This Internet-Draft will expire on , 2020. This Internet-Draft will expire on February 3, 2020.
Copyright (c) 2019 IETF Trust and the persons identified as the Copyright (c) 2019 IETF Trust and the persons identified as the
This document is subject to BCP 78 and the IETF Trust's Legal This document is subject to BCP 78 and the IETF Trust's Legal
Provisions Relating to IETF Documents Provisions Relating to IETF Documents
(https://trustee.ietf.org/license-info) in effect on the date of (https://trustee.ietf.org/license-info) in effect on the date of
publication of this document. Please review these documents publication of this document. Please review these documents
skipping to change at page 2, line 42 skipping to change at page 2, line 42
7.1.2. Body . . . . . . . . . . . . . . . . . . . . . . . . 7 7.1.2. Body . . . . . . . . . . . . . . . . . . . . . . . . 7
7.2. Algorithm . . . . . . . . . . . . . . . . . . . . . . . . 7 7.2. Algorithm . . . . . . . . . . . . . . . . . . . . . . . . 7
7.2.1. Folding . . . . . . . . . . . . . . . . . . . . . . . 7 7.2.1. Folding . . . . . . . . . . . . . . . . . . . . . . . 7
7.2.2. Unfolding . . . . . . . . . . . . . . . . . . . . . . 9 7.2.2. Unfolding . . . . . . . . . . . . . . . . . . . . . . 9
8. The Double Backslash Strategy ('\\') . . . . . . . . . . . . 9 8. The Double Backslash Strategy ('\\') . . . . . . . . . . . . 9
8.1. Folded Structure . . . . . . . . . . . . . . . . . . . . 9 8.1. Folded Structure . . . . . . . . . . . . . . . . . . . . 9
8.1.1. Header . . . . . . . . . . . . . . . . . . . . . . . 9 8.1.1. Header . . . . . . . . . . . . . . . . . . . . . . . 9
8.1.2. Body . . . . . . . . . . . . . . . . . . . . . . . . 10 8.1.2. Body . . . . . . . . . . . . . . . . . . . . . . . . 10
8.2. Algorithm . . . . . . . . . . . . . . . . . . . . . . . . 10 8.2. Algorithm . . . . . . . . . . . . . . . . . . . . . . . . 10
8.2.1. Folding . . . . . . . . . . . . . . . . . . . . . . . 10 8.2.1. Folding . . . . . . . . . . . . . . . . . . . . . . . 10
8.2.2. Unfolding . . . . . . . . . . . . . . . . . . . . . . 1 8.2.2. Unfolding . . . . . . . . . . . . . . . . . . . . . . 12
9. Examples . . . . . . . . . . . . . . . . . . . . . . . . . . 12 9. Examples . . . . . . . . . . . . . . . . . . . . . . . . . . 12
9.1. Example Showing Boundary Conditions . . . . . . . . . . . 12 9.1. Example Showing Boundary Conditions . . . . . . . . . . . 12
9.1.1. Using '\' . . . . . . . . . . . . . . . . . . . . . . 12 9.1.1. Using '\' . . . . . . . . . . . . . . . . . . . . . . 12
9.1.2. Using '\\' . . . . . . . . . . . . . . . . . . . . . 13 9.1.2. Using '\\' . . . . . . . . . . . . . . . . . . . . . 13
9.2. Example Showing Multiple Wraps of a Single Line . . . . . 13 9.2. Example Showing Multiple Wraps of a Single Line . . . . . 13
9.2.1. Using '\' . . . . . . . . . . . . . . . . . . . . . . 13 9.2.1. Using '\' . . . . . . . . . . . . . . . . . . . . . . 13
9.2.2. Using '\\' . . . . . . . . . . . . . . . . . . . . . 9.2.2. Using '\\' . . . . . . . . . . . . . . . . . . . . . 14
9.3. Example Showing "Smart" Folding . . . . . . . . . . . . . 9.3. Example Showing "Smart" Folding . . . . . . . . . . . . . 14
9.3.1. Using '\' . . . . . . . . . . . . . . . . . . . . . . 14 9.3.1. Using '\' . . . . . . . . . . . . . . . . . . . . . . 14
9.3.2. Using '\\' . . . . . . . . . . . . . . . . . . . . . 15 9.3.2. Using '\\' . . . . . . . . . . . . . . . . . . . . . 15
10. Security Considerations . . . . . . . . . . . . . . . . . . . 9.4. Example Showing "Forced" Folding . . . . . . . . . . . . 16
11. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 9.4.1. Using '\' . . . . . . . . . . . . . . . . . . . . . . 17
12. References . . . . . . . . . . . . . . . . . . . . . . . . . 9.4.2. Using '\\' . . . . . . . . . . . . . . . . . . . . . 17
12.1. Normative References . . . . . . . . . . . . . . . . . . 10. Security Considerations . . . . . . . . . . . . . . . . . . . 17
12.2. Informative References . . . . . . . . . . . . . . . . . 11. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 18
Appendix A. POSIX Shell Script: rfcfold . . . . . . . . . . . . 12. References . . . . . . . . . . . . . . . . . . . . . . . . . 18
Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . . 12.1. Normative References . . . . . . . . . . . . . . . . . . 18
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 12.2. Informative References . . . . . . . . . . . . . . . . . 18
Appendix A. POSIX Shell Script: rfcfold . . . . . . . . . . . . 19
Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . . 28
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 28
1. Introduction 1. Introduction
[RFC7994] sets out the requirements for plain-text RFCs and states [RFC7994] sets out the requirements for plain-text RFCs and states
that each line of an RFC (and hence of an Internet-Draft) must be that each line of an RFC (and hence of an Internet-Draft) must be
limited to 72 characters followed by the character sequence that limited to 72 characters followed by the character sequence that
denotes an end-of-line (EOL). denotes an end-of-line (EOL).
Internet-Drafts and RFCs often include example text or code Internet-Drafts and RFCs often include example text or code
fragments. Many times the example text or code exceeds the 72 fragments. Many times the example text or code exceeds the 72
skipping to change at page 8, line 21 skipping to change at page 8, line 21
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 to characters or exit, forcing the input provider to convert them to
space characters themselves first. space characters themselves first.
Scan the text content to ensure at least one line exceeds the desired Scan the text content to ensure at least one line exceeds the desired
maximum. If no line exceeds the desired maximum, exit (this text maximum. If no line exceeds the desired maximum, exit (this text
content does not need to be folded). content does not need to be folded).
Scan the text content to ensure no existing lines already end with a Scan the text content to ensure no existing lines already end with a
backslash ('\') character, as this would lead to an ambiguous result. backslash ('\') character, as this would lead to an ambiguous result.
If such a line is found, be If such a line is found, and its width is less than the desired
maximum, then it SHOULD be flagged for forced folding (folding even
though unnecessary). If the folding implementation doesn't support
forced foldings, it MUST exit.
If this text content needs to and can be folded, insert the header If this text content needs to and can be folded, insert the header
described in Section 7.1.1, ensuring that any additional printable described in Section 7.1.1, ensuring that any additional printable
characters surrounding the header does not result in a line exceeding characters surrounding the header does not result in a line exceeding
the desired maximum. the desired maximum.
For each line in the text content, from top-to-bottom, if the line For each line in the text content, from top-to-bottom, if the line
exceeds the desired maximum, then fold the line by: exceeds the desired maximum, or requires a forced folding, then fold
the line by:
1. Determine where the fold will occur. This location MUST be 1. Determine where the fold will occur. This location MUST be
before or at the desired maximum column, and MUST NOT be chosen before or at the desired maximum column, and MUST NOT be chosen
such that the character immediately after the fold is a space (' such that the character immediately after the fold is a space ('
') character. If no such location can be found, then exit (this ') character. If no such location can be found, then exit (this
text content cannot be folded) text content cannot be folded).
2. At the location where the fold is to occur, insert a backslash 2. At the location where the fold is to occur, insert a backslash
('\') character followed by the end of line character sequence. ('\') character followed by the end of line character sequence.
3. On the following line, insert any number of space (' ') 3. On the following line, insert any number of space (' ')
characters. characters.
The result of the previous operation is that the next line starts The result of the previous operation is that the next line starts
with an arbitrary number of space (' ') characters, followed by the 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
skipping to change at page 14, line 8 skipping to change at page 14, line 24
9.3. Example Showing "Smart" Folding 9.3. Example Showing "Smart" Folding
This example illustrates how readability can be improved via "smart" 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. format-specific indentations are used.
The text content was manually folded, since the script in the The text content was manually folded, since the script in the
appendix does not implement smart folding. appendix does not implement smart folding.
Note that the surrounded by different printable characters Note that the headers are surrounded by different printable
shown in the script-generated examples. characters than shown in the script-generated examples.
9.3.1. Using '\' 9.3.1. Using '\'
[NOTE: '\' line wrapping per BCP XX (RFC XXXX)] [NOTE: '\' line wrapping per BCP XX (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>
skipping to change at page 16, line 24 skipping to change at page 16, line 24
<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>
9.4. Example Showing "Forced" Folding
This example illustrates how invalid sequences in lines that do not
have to be folded can be handled via forced folding, whereby the
folding occurs even though unnecessary.
The following line exceeds a 68-char max, thus demands folding
123456789012345678901234567890123456789012345678901234567890123456789
This line ends with a backslash \
This line ends with a backslash \
\ This line begins with a backslash
Following is an indented 3x3 block of backslashes:
\\\
\\\
\\\
The samples below were manually folded, since the script in the
appendix does not implement forced folding.
Note that the headers are prefixed by a pound ('#') character, rather
than surrounded by equal ('=') characters as shown in the script-
generated examples.
9.4.1. Using '\'
# NOTE: '\' line wrapping per BCP XX (RFC XXXX)
The following line exceeds a 68-char max, thus demands folding
1234567890123456789012345678901234567890123456789012345678901234567\
89
This line ends with a backslash \\
This line ends with a backslash \\
\ This line begins with a backslash
Following is an indented 3x3 block of backslashes:
\\\\
\\\\
\\\
9.4.2. Using '\\'
# NOTE: '\\' line wrapping per BCP XX (RFC XXXX)
The following line exceeds a 68-char max, thus demands folding
1234567890123456789012345678901234567890123456789012345678901234567\
\89
This line ends with a backslash \
This line ends with a backslash \\
\
\ This line begins with a backslash
Following is an indented 3x3 block of backslashes:
\\\\
\
\\\\
\
\\\
10. Security Considerations 10. Security Considerations
This BCP has no Security Considerations. This BCP has no Security Considerations.
11. IANA Considerations 11. IANA Considerations
This BCP has no IANA Considerations. This BCP has no IANA Considerations.
12. References 12. References
skipping to change at page 18, line 24 skipping to change at page 19, line 24
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. document before utilizing this script.
For readability purposes, this script forces the minimally supported For readability purposes, this script forces the minimally supported
line length to be eight characters longer than the raw header text line length to be eight characters longer than the raw header text
defined in Section 7.1.1 and Section 8.1.1 so as to ensure that the defined in Section 7.1.1 and Section 8.1.1 so as to ensure that the
header can be wrapped by a space (' ') character and three equal header can be wrapped by a space (' ') character and three equal
('=') characters on each side of the raw header text. ('=') characters on each side of the raw header text.
This script does not implement the whitespace-avoidance logic
described in Section 7.2.1. In such case, the script will exit with
one of the following message:
Error: infile has a space character occuring on the
folding column. This file cannot be folded using the
'\' strategy.
This script does not implement the "forced folding" logic described This script does not implement the "forced folding" logic described
in Section 8.2.1. In such cases the script will exit with the in Section 7.2.1 or Section 8.2.1. In such cases the script will
message: exit with one of the following message:
Error: infile has a line ending with a '\' character
This file cannot be folded using the '\' strategy.
Error: infile has a line ending with a '\' character 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 '\\' 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 attempt to proactively force-fold such script does not attempt to proactively force-fold such
lines, as described in RFC XXXX). lines, as described in RFC XXXX).
Shell-level end-of-line backslash ('\') characters have been Shell-level end-of-line backslash ('\') characters have been
skipping to change at page 23, line 40 skipping to change at page 25, line 4
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
awk "NR>2" \$infile > \$temp_dir/wip awk "NR>2" \$infile > \$temp_dir/wip
# unfold wip file # unfold wip file
"\$SED" '' \$temp_dir/wip > \$outfile "\$SED" '{H;\$!d};x;s/^\n//;s/\\\n *//g' \$temp_dir/wip > \$outfile
return 0 return 0
} }
unfold_it_2() { unfold_it_2() {
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
awk "NR>2" \$infile > \$temp_dir/wip awk "NR>2" \$infile > \$temp_dir/wip
# unfold wip file # unfold wip file
"\$SED" '' \$temp_dir/wip > \$outfile "\$SED" '{H;\$!d};x;s/^\n//;s/\\\n *\\//g' \$temp_dir/wip > \$outfile
return 0 return 0
} }
unfold_it() { unfold_it() {
# check if file needs unfolding # check if file needs unfolding