@@ -19,20 +19,23 @@ use crate::{
1919 world:: SystemWorld ,
2020} ;
2121
22- pub async fn check_readme (
23- world : & SystemWorld ,
24- diags : & mut Diagnostics ,
25- ) -> crate :: check:: Result < ( ) > {
22+ #[ derive( Default ) ]
23+ pub struct Readme {
24+ pub text : String ,
25+ pub linked_files : Vec < PackagePath > ,
26+ }
27+
28+ pub async fn check ( world : & SystemWorld , diags : & mut Diagnostics ) -> crate :: check:: Result < Readme > {
2629 // check syntax, versions and kebab-case
2730 // warn on unsupported gfm features
28- let readme = tokio:: fs:: read_to_string ( world. root ( ) . join ( "README.md" ) )
31+ let text = tokio:: fs:: read_to_string ( world. root ( ) . join ( "README.md" ) )
2932 . await
3033 . error ( "io/readme" , "Failed to read README.md" ) ?;
3134
3235 let arena = comrak:: Arena :: new ( ) ;
3336 let md_ast = comrak:: parse_document (
3437 & arena,
35- & readme ,
38+ & text ,
3639 & comrak:: Options {
3740 // Try to be faithful to the Universe parser
3841 extension : comrak:: options:: Extension {
@@ -52,6 +55,11 @@ pub async fn check_readme(
5255 } ,
5356 ) ;
5457
58+ let mut readme = Readme {
59+ text,
60+ linked_files : Vec :: new ( ) ,
61+ } ;
62+
5563 for node in md_ast. descendants ( ) {
5664 let md_node = & * node. data . borrow ( ) ;
5765 match & md_node. value {
@@ -87,7 +95,7 @@ pub async fn check_readme(
8795 }
8896 // Check if all links are valid.
8997 MdNode :: Link ( link) => {
90- check_readme_link_url ( world, diags, & readme, md_node. sourcepos , & link. url ) ;
98+ check_readme_link_url ( world, diags, & mut readme, md_node. sourcepos , & link. url ) ;
9199 }
92100 // Check all image URLs are valid and alt text is specified.
93101 MdNode :: Image ( link) => {
@@ -100,19 +108,19 @@ pub async fn check_readme(
100108 }
101109 check_image_alternative_description ( diags, & readme, md_node. sourcepos , & alt) ;
102110
103- check_readme_link_url ( world, diags, & readme, md_node. sourcepos , & link. url ) ;
111+ check_readme_link_url ( world, diags, & mut readme, md_node. sourcepos , & link. url ) ;
104112 }
105113 MdNode :: HtmlBlock ( html) => {
106- check_readme_html ( world, diags, & readme, md_node. sourcepos , & html. literal ) ;
114+ check_readme_html ( world, diags, & mut readme, md_node. sourcepos , & html. literal ) ;
107115 }
108116 MdNode :: HtmlInline ( html) => {
109- check_readme_html ( world, diags, & readme, md_node. sourcepos , html) ;
117+ check_readme_html ( world, diags, & mut readme, md_node. sourcepos , html) ;
110118 }
111119 _ => ( ) ,
112120 }
113121 }
114122
115- Ok ( ( ) )
123+ Ok ( readme )
116124}
117125
118126fn check_readme_code_block (
@@ -176,7 +184,7 @@ fn check_readme_code_block(
176184fn check_readme_html (
177185 world : & SystemWorld ,
178186 diags : & mut Diagnostics ,
179- readme : & str ,
187+ readme : & mut Readme ,
180188 sourcepos : Sourcepos ,
181189 html : & str ,
182190) {
@@ -203,7 +211,7 @@ fn check_readme_html(
203211fn check_html_elems (
204212 world : & SystemWorld ,
205213 diags : & mut Diagnostics ,
206- readme : & str ,
214+ readme : & mut Readme ,
207215 sourcepos : Sourcepos ,
208216 node : & markup5ever_rcdom:: Node ,
209217) {
@@ -243,7 +251,7 @@ fn check_html_elems(
243251fn check_readme_link_url (
244252 world : & SystemWorld ,
245253 diags : & mut Diagnostics ,
246- readme : & str ,
254+ readme : & mut Readme ,
247255 sourcepos : Sourcepos ,
248256 url_text : & str ,
249257) {
@@ -310,11 +318,13 @@ fn check_readme_link_url(
310318 ) ] ) ,
311319 ) ;
312320 }
321+
322+ readme. linked_files . push ( path) ;
313323}
314324
315325const DEFAULT_BRANCHES : [ & str ; 2 ] = [ "main" , "master" ] ;
316326
317- fn check_repo_file_url ( diags : & mut Diagnostics , readme : & str , sourcepos : Sourcepos , url : & str ) {
327+ fn check_repo_file_url ( diags : & mut Diagnostics , readme : & Readme , sourcepos : Sourcepos , url : & str ) {
318328 static GITHUB_URL : LazyLock < Regex > = LazyLock :: new ( || {
319329 Regex :: new ( r"https://github.com/([^/]+)/([^/]+)/(?:blob|tree)/([^/]+)/(.+)" ) . unwrap ( )
320330 } ) ;
@@ -390,7 +400,7 @@ fn check_repo_file_url(diags: &mut Diagnostics, readme: &str, sourcepos: Sourcep
390400
391401fn check_image_alternative_description (
392402 diags : & mut Diagnostics ,
393- readme : & str ,
403+ readme : & Readme ,
394404 sourcepos : Sourcepos ,
395405 alt : & str ,
396406) {
@@ -430,7 +440,7 @@ fn check_image_alternative_description(
430440 }
431441}
432442
433- fn sourcepos_to_range ( s : & str , pos : Sourcepos ) -> Range < usize > {
443+ fn sourcepos_to_range ( readme : & Readme , pos : Sourcepos ) -> Range < usize > {
434444 fn byte_offset ( s : & str , pos : LineColumn ) -> usize {
435445 // `LineColumn` uses 1-indexed line numbers.
436446 let line_offset = s
@@ -443,9 +453,9 @@ fn sourcepos_to_range(s: &str, pos: Sourcepos) -> Range<usize> {
443453 }
444454
445455 // `LineColumn::column` is 1-indexed.
446- let start = byte_offset ( s , pos. start ) - 1 ;
456+ let start = byte_offset ( & readme . text , pos. start ) - 1 ;
447457 // `Sourcepos::end` is end-inclusive (byte-wise), and thus `offset + 1 - 1`.
448- let end = byte_offset ( s , pos. end ) ;
458+ let end = byte_offset ( & readme . text , pos. end ) ;
449459
450460 start..end
451461}
0 commit comments