11"use strict" ;
22
3- const {
4- splitLinkPathAndSuffix,
5- sanitizeLinkPath,
6- } = require ( "../utils/path-utils" ) ;
7- const { resolveAssetPublicPath } = require ( "../utils/asset-registry" ) ;
3+ const { AssetRewriter } = require ( "../services/asset-rewriter" ) ;
84
95function normalizeMarkdownBody ( content , options = { } ) {
106 if ( ! content ) {
117 return content ;
128 }
139
14- return rewriteLocalLinks ( convertAngleBracketLinks ( content ) , options ) ;
10+ const assetRewriter = new AssetRewriter ( options ) ;
11+ const convertedLinks = convertAngleBracketLinks ( content ) ;
12+ const rewrittenMarkdownLinks = rewriteLocalLinks (
13+ convertedLinks ,
14+ assetRewriter
15+ ) ;
16+ return rewriteHtmlAttributes ( rewrittenMarkdownLinks , assetRewriter ) ;
1517}
1618
1719function convertAngleBracketLinks ( text ) {
@@ -25,11 +27,11 @@ function convertAngleBracketLinks(text) {
2527 const isEmail = raw . includes ( "@" ) ;
2628 const href = isEmail ? `mailto:${ raw } ` : raw ;
2729 return `[${ raw } ](${ href } )` ;
28- } ,
30+ }
2931 ) ;
3032}
3133
32- function rewriteLocalLinks ( text , options = { } ) {
34+ function rewriteLocalLinks ( text , assetRewriter ) {
3335 if ( ! text ) {
3436 return text ;
3537 }
@@ -109,7 +111,7 @@ function rewriteLocalLinks(text, options = {}) {
109111 }
110112
111113 const target = text . slice ( afterBracket + 1 , parenEnd ) ;
112- const rewrittenTarget = rewriteLinkTarget ( target , options ) ;
114+ const rewrittenTarget = rewriteLinkTarget ( target , assetRewriter ) ;
113115
114116 result += text . slice ( bracketIndex , afterBracket + 1 ) ;
115117 result += rewrittenTarget ;
@@ -118,22 +120,22 @@ function rewriteLocalLinks(text, options = {}) {
118120 index = parenEnd + 1 ;
119121 }
120122
121- return rewriteReferenceLinks ( result , options ) ;
123+ return rewriteReferenceLinks ( result , assetRewriter ) ;
122124}
123125
124- function rewriteReferenceLinks ( text , options = { } ) {
126+ function rewriteReferenceLinks ( text , assetRewriter ) {
125127 const referencePattern = / ^ ( \s * \[ [ ^ \] ] + \] : \s * ) ( .+ ) $ / gm;
126128
127129 return text . replace ( referencePattern , ( match , prefix , target ) => {
128- const rewritten = rewriteLinkTarget ( target , options ) ;
130+ const rewritten = rewriteLinkTarget ( target , assetRewriter ) ;
129131 if ( rewritten === target ) {
130132 return match ;
131133 }
132134 return `${ prefix } ${ rewritten } ` ;
133135 } ) ;
134136}
135137
136- function rewriteLinkTarget ( rawTarget , options = { } ) {
138+ function rewriteLinkTarget ( rawTarget , assetRewriter ) {
137139 if ( ! rawTarget ) {
138140 return rawTarget ;
139141 }
@@ -167,48 +169,55 @@ function rewriteLinkTarget(rawTarget, options = {}) {
167169 }
168170 }
169171
170- if ( ! urlPart || isExternalLink ( urlPart ) ) {
171- return rawTarget ;
172- }
172+ const { value, changed } = assetRewriter . rewrite ( urlPart ) ;
173173
174- const { path : targetPath , suffix } = splitLinkPathAndSuffix ( urlPart ) ;
175- if ( ! targetPath ) {
174+ if ( ! changed ) {
176175 return rawTarget ;
177176 }
178177
179- const sanitizedPath = sanitizeLinkPath ( targetPath ) ;
180- const assetPublicPath = resolveAssetPublicPath ( {
181- assetMap : options . assetMap ,
182- docRelativePath : options . docRelativePath ,
183- targetPath : sanitizedPath ,
184- docsPath : options . docsPath ,
185- staticPath : options . staticPath ,
186- } ) ;
187- const rewrittenPath = assetPublicPath || sanitizedPath ;
188- const rebuiltTarget = `${ rewrittenPath } ${ suffix } ` ;
178+ return `${ leadingWhitespace } ${ value } ${ trailingTitle } ` ;
179+ }
189180
190- if ( rebuiltTarget === urlPart ) {
191- return rawTarget ;
181+ function rewriteHtmlAttributes ( text , assetRewriter ) {
182+ if ( ! text ) {
183+ return text ;
192184 }
193185
194- return `${ leadingWhitespace } ${ rebuiltTarget } ${ trailingTitle } ` ;
186+ const attributePattern = / ( < [ ^ > ] + ?\s ) ( s r c | h r e f ) ( \s * = \s * ) ( [ " ' ] ) ( [ ^ " ' ] + ?) \4/ gi;
187+
188+ return text . replace (
189+ attributePattern ,
190+ ( match , prefix , attribute , equalsPart , quote , value ) => {
191+ const rewrittenValue = rewriteHtmlAttributeValue ( value , assetRewriter ) ;
192+ if ( rewrittenValue === value ) {
193+ return match ;
194+ }
195+
196+ return `${ prefix } ${ attribute } ${ equalsPart } ${ quote } ${ rewrittenValue } ${ quote } ` ;
197+ }
198+ ) ;
195199}
196200
197- function isExternalLink ( target ) {
198- const trimmed = target . trim ( ) ;
199- if ( ! trimmed ) {
200- return true ;
201+ function rewriteHtmlAttributeValue ( rawValue , assetRewriter ) {
202+ if ( ! rawValue ) {
203+ return rawValue ;
201204 }
202205
203- if ( trimmed . startsWith ( "#" ) ) {
204- return true ;
206+ const leadingWhitespace = rawValue . match ( / ^ \s + / ) ?. [ 0 ] || "" ;
207+ const trailingWhitespace = rawValue . match ( / \s + $ / ) ?. [ 0 ] || "" ;
208+ const coreValue = rawValue . trim ( ) ;
209+
210+ if ( ! coreValue ) {
211+ return rawValue ;
205212 }
206213
207- if ( trimmed . startsWith ( "//" ) ) {
208- return true ;
214+ const { value, changed } = assetRewriter . rewrite ( coreValue ) ;
215+
216+ if ( ! changed ) {
217+ return rawValue ;
209218 }
210219
211- return / ^ [ a - z A - Z ] [ a - z A - Z 0 - 9 + . - ] * : / . test ( trimmed ) ;
220+ return ` ${ leadingWhitespace } ${ value } ${ trailingWhitespace } ` ;
212221}
213222
214223module . exports = {
0 commit comments