@@ -266,34 +266,51 @@ for (let l in lines) {
266
266
if ( ! inCodeBlock ) {
267
267
268
268
// minor fixups to get RFC links to work properly
269
- if ( line . indexOf ( 'RFC [' ) >= 0 ) {
270
- line = line . replace ( 'RFC [' , '[RFC' ) ;
271
- }
269
+ line = line . replace ( 'RFC [' , '[RFC' ) ;
272
270
line = line . replace ( '[Authorization header as defined in ' , 'Authorization header as defined in [' ) ;
271
+ line = line . replace ( '[JSON Pointer]' , 'JSON Pointer [RFC6901]' ) ; // only in 2.0.md
272
+
273
+ //TODO: more "hidden" RFC references in older specs, for example
274
+ // [media type range](https://tools.ietf.org/html/rfc7231#appendix-D)
275
+ // [ABNF](https://tools.ietf.org/html/rfc5234)
276
+
277
+ //TODO: unconventional references to RFCs in 3.0.4 and 3.1.1, for example
278
+ // [RFC3986 §5.1.2 – 5.1.4](https://tools.ietf.org/html/rfc3986#section-5.1.2)
279
+ // RFC6570 [mentions](https://www.rfc-editor.org/rfc/rfc6570.html#section-2.4.2)
280
+ // [are not](https://datatracker.ietf.org/doc/html/rfc3986#appendix-A)
281
+ // [special behavior](https://www.rfc-editor.org/rfc/rfc1866#section-8.2.1)
282
+ // [RFC6570 considers to be _undefined_](https://datatracker.ietf.org/doc/html/rfc6570#section-2.3)
273
283
274
284
if ( line . indexOf ( '[RFC' ) >= 0 ) {
275
- line = line . replace ( / \[ R F C ? ( [ 0 - 9 ] { 1 , 5 } ) \] / g, function ( match , group1 ) {
276
- console . warn ( 'Fixing RFC reference' , match , group1 ) ;
285
+ // also detect [RFC4648 §3.2] etc. in 3.0.4.md and 3.1.1.md
286
+ line = line . replace ( / \[ R F C ? ( [ 0 - 9 ] { 1 , 5 } ) ( § [ 0 - 9 . - ] + ) ? \] / g, function ( match , group1 ) {
287
+ // console.warn('Fixing RFC reference',match,group1);
277
288
return '[[RFC' + group1 + ']]' ;
278
289
} ) ;
279
290
}
280
291
281
- line = line . replace ( 'http://tools.ietf.org' , 'https://tools.ietf.org' ) ;
282
- if ( line . indexOf ( 'xml2rfc.ietf.org' ) > 0 ) {
283
- line = line . replace ( 'https://xml2rfc.ietf.org/public/rfc/html/rfc' , 'https://tools.ietf.org/html/rfc' ) ;
284
- line = line . replace ( '.html' , '' ) ;
285
- }
286
- line = line . replace ( / \] \] \( h t t p s : \/ \/ t o o l s .i e t f .o r g \/ h t m l \/ r f c [ 0 - 9 ] { 1 , 5 } \/ ? ( \# .* ?) ? \) / g, function ( match , group1 ) {
287
- //return (group1 ? group1 : '')+']]';
288
- return ']]' ;
292
+ //TODO: non-link mentions of RFCs in 3.0.4 and 3.1.1, for example
293
+ // RFC3986's definition of [reserved](https://datatracker.ietf.org/doc/html/rfc3986#section-2.2)
294
+
295
+ // harmonize RFC URLs
296
+ line = line . replace ( 'http://www.ietf.org/rfc/rfc2119.txt' , 'https://tools.ietf.org/html/rfc2119' ) ; // only in 2.0.md
297
+ line = line . replace ( / h t t p s : \/ \/ w w w .r f c - e d i t o r .o r g \/ r f c \/ r f c ( [ 0 - 9 ] { 1 , 5 } ) ( \. h t m l ) ? / g, 'https://tools.ietf.org/html/rfc$1' ) ;
298
+ line = line . replaceAll ( 'https://datatracker.ietf.org/doc/html/rfc' , 'https://tools.ietf.org/html/rfc' ) ;
299
+ line = line . replaceAll ( 'http://tools.ietf.org' , 'https://tools.ietf.org' ) ;
300
+
301
+ // handle url fragments in RFC links and construct section titles links as well as RFC links
302
+ line = line . replace ( / \] \] \( h t t p s : \/ \/ t o o l s .i e t f .o r g \/ h t m l \/ r f c ( [ 0 - 9 ] { 1 , 5 } ) \/ ? ( \# [ ^ ) ] * ) ? \) / g, function ( match , rfcNumber , fragment ) {
303
+ if ( fragment ) {
304
+ // Extract section title from the fragment
305
+ let sectionTitle = fragment . replace ( '#' , '' ) . replace ( / - / g, ' ' ) ;
306
+ sectionTitle = sectionTitle . charAt ( 0 ) . toUpperCase ( ) + sectionTitle . slice ( 1 ) ; // Capitalize the first letter
307
+ return `]] [${ sectionTitle } ](https://datatracker.ietf.org/doc/html/rfc${ rfcNumber } ${ fragment } )` ;
308
+ } else {
309
+ return ']]' ;
310
+ }
289
311
} ) ;
290
312
}
291
313
292
- // minor fixup to get bibliography link to work
293
- //if (line.indexOf('[ABNF]')>=0) {
294
- // line = line.replace('[ABNF]','[Augmented Backus-Naur Form]');
295
- //}
296
-
297
314
if ( ! inCodeBlock && line . indexOf ( '](../' ) >= 0 ) {
298
315
const regExp = / \( ( \. \. [ ^ ) ] + ) \) / g;
299
316
line = line . replace ( regExp , function ( match , group1 ) {
@@ -306,9 +323,10 @@ for (let l in lines) {
306
323
let heading = 0 ;
307
324
while ( line [ heading ] === '#' ) heading ++ ;
308
325
let delta = heading - prevHeading ;
326
+ if ( delta > 1 ) console . warn ( delta , line ) ;
309
327
if ( delta > 0 ) delta = 1 ;
310
328
//if (delta<0) delta = -1;
311
- if ( Math . abs ( delta ) > 1 ) console . warn ( delta , line ) ;
329
+ // if (Math.abs(delta)>1) console.warn(delta,line);
312
330
let prefix = '' ;
313
331
let newSection = '<section>' ;
314
332
if ( line . includes ( '## Version ' ) ) {
0 commit comments