@@ -46,7 +46,7 @@ public PagesCommand()
4646 } ;
4747
4848 var templateFileNameOption = new Option < string ? > (
49- name : "--template-file" ,
49+ name : "--template-file-name " ,
5050 description : "Template file name when --template is folder (optional, defaults to 'template.html')" ,
5151 getDefaultValue : ( ) => null ) ;
5252
@@ -75,87 +75,46 @@ private async Task<int> ExecuteAsync(
7575 string outputPath ,
7676 string ? templateFileName )
7777 {
78- // Resolve markdown source folder (SystemFolder throws if doesn't exist)
79- var markdownSourceFolder = new SystemFolder ( markdownFolderPath ) ;
80-
8178 // Resolve template source (file or folder)
82- IStorable templateSource ;
83- if ( Directory . Exists ( templatePath ) )
84- {
85- templateSource = new SystemFolder ( templatePath ) ;
86- }
87- else
88- {
89- // SystemFile throws if doesn't exist
90- templateSource = new SystemFile ( templatePath ) ;
91- }
79+ IStorable templateSource = Directory . Exists ( templatePath )
80+ ? new SystemFolder ( templatePath )
81+ : new SystemFile ( templatePath ) ;
9282
93- // Resolve output folder (SystemFolder throws if doesn't exist)
94- IModifiableFolder outputFolder = new SystemFolder ( outputPath ) ;
83+ // Resolve markdown source and output folders (SystemFolder throws if doesn't exist)
84+ var outputFolder = new SystemFolder ( outputPath ) ;
85+ var markdownSourceFolder = new SystemFolder ( markdownFolderPath ) ;
9586
96- // Create virtual AssetAwareHtmlTemplatedMarkdownPagesFolder (lazy generation - no I/O during construction)
87+ // Create recursive markdown-to-webpage folder (lazy generation - no I/O during construction)
88+ // Turns `.md` files into folders with an `index.html` holding asset metadata for output copy
9789 var pagesFolder = new AssetAwareHtmlTemplatedMarkdownPagesFolder ( markdownSourceFolder , templateSource , templateFileName )
9890 {
9991 LinkDetector = new RegexAssetLinkDetector ( ) ,
100- Resolver = new RelativePathAssetResolver
101- {
102- // MarkdownSource passed per-call in ResolveAsync (varies per page)
103- SourceFolder = markdownSourceFolder
104- } ,
92+ Resolver = new RelativePathAssetResolver ( ) ,
10593 InclusionStrategy = new ReferenceOnlyInclusionStrategy ( )
10694 } ;
10795
108- // Materialize virtual structure by iterating page folders, then files within each
109- // Pattern from PostPageCommand: Create output folder per page, copy files relative to it
110- await foreach ( var item in pagesFolder . GetItemsAsync ( StorableType . Folder ) )
96+ // Materialize virtual folderized markdown pages, then files within each markdown page folder.
97+ await foreach ( IChildFolder pageFolder in new DepthFirstRecursiveFolder ( pagesFolder ) . GetItemsAsync ( StorableType . Folder ) )
11198 {
112- if ( item is not IChildFolder pageFolder )
113- continue ;
114-
115- Logger . LogInformation ( $ "Processing page folder: { pageFolder . Name } ") ;
116-
117- // Create output folder for this page
118- var pageOutputFolder = await outputFolder . CreateFolderAsync ( pageFolder . Name , overwrite : true ) ;
119-
120- // Iterate files within this page folder recursively
121- var recursiveFolder = new DepthFirstRecursiveFolder ( pageFolder ) ;
122- await foreach ( var fileItem in recursiveFolder . GetItemsAsync ( StorableType . File ) )
99+ // Get path to markdown page folder (mirrors original source file without extension)
100+ var relativePathToPagesPageFolder = await pagesFolder . GetRelativePathToAsync ( pageFolder ) ;
101+ var pageOutputFolder = await outputFolder . CreateFoldersAlongRelativePathAsync ( relativePathToPagesPageFolder , overwrite : true ) . LastAsync ( ) ;
102+
103+ // Iterate/copy files within markdown page folder
104+ await foreach ( AssetAwareHtmlTemplatedMarkdownFile indexFile in pageFolder . GetItemsAsync ( StorableType . File ) )
123105 {
124- if ( fileItem is not IChildFile file )
125- continue ;
126-
127- Logger . LogInformation ( $ " Yielded file: { file . Name } (Type: { file . GetType ( ) . Name } )") ;
128-
129106 // Get relative path from page folder (not pagesFolder root)
130- string relativePath = await pageFolder . GetRelativePathToAsync ( file ) ;
131- Logger . LogInformation ( $ " Relative path: { relativePath } ") ;
132-
133- // Create folders relative to THIS page's output folder
134- var containingFolder = ( IModifiableFolder ) await pageOutputFolder . CreateFoldersAlongRelativePathAsync ( relativePath , overwrite : false ) . LastAsync ( ) ;
135- Logger . LogInformation ( $ " Containing folder: { containingFolder . Id } ") ;
136-
137- // Copy file
138- Logger . LogInformation ( $ " About to copy - file.Id: { file . Id } , file.GetType(): { file . GetType ( ) . Name } ") ;
139- Logger . LogInformation ( $ " Target folder: { containingFolder . Id } ") ;
140- var copiedFile = await containingFolder . CreateCopyOfAsync ( file , overwrite : true ) ;
141- Logger . LogInformation ( $ " Copied to: { copiedFile . Id } ") ;
142-
143- // Check what else got created
144- Logger . LogInformation ( $ " Checking folder contents after copy:") ;
145- await foreach ( var folderItem in containingFolder . GetItemsAsync ( ) )
146- {
147- Logger . LogInformation ( $ " Found: { folderItem . Name } (Type: { folderItem . GetType ( ) . Name } )") ;
148- }
149-
150- // Copy all assets referenced in content using RewrittenPath
151- if ( file is AssetAwareHtmlTemplatedMarkdownFile htmlFile )
107+ string pageFolderFileRelativePath = await pageFolder . GetRelativePathToAsync ( indexFile ) ;
108+
109+ // Create folders relative to THIS page's output folder, then copy
110+ var containingFolder = ( IModifiableFolder ) await pageOutputFolder . CreateFoldersAlongRelativePathAsync ( pageFolderFileRelativePath , overwrite : false ) . LastAsync ( ) ;
111+ var copiedIndexFile = await containingFolder . CreateCopyOfAsync ( indexFile , overwrite : true ) ;
112+
113+ // Copy all assets referenced in index.html to the rewritten asset path
114+ foreach ( var asset in indexFile . IncludedAssets )
152115 {
153- foreach ( var asset in htmlFile . IncludedAssets )
154- {
155- // Navigate FROM htmlFile using RewrittenPath (relative to HTML file)
156- var assetOutputFolder = ( IModifiableFolder ) await copiedFile . CreateFoldersAlongRelativePathAsync ( asset . RewrittenPath , overwrite : false ) . LastAsync ( ) ;
157- await assetOutputFolder . CreateCopyOfAsync ( asset . ResolvedFile , overwrite : true ) ;
158- }
116+ var assetOutputFolder = ( IModifiableFolder ) await copiedIndexFile . CreateFoldersAlongRelativePathAsync ( asset . RewrittenPath , overwrite : false ) . LastAsync ( ) ;
117+ await assetOutputFolder . CreateCopyOfAsync ( asset . ResolvedFile , overwrite : true ) ;
159118 }
160119 }
161120 }
0 commit comments