SYMBOL INDEX (195 symbols across 15 files) FILE: cmd/cmd_test.go function TestParseURL (line 14) | func TestParseURL(t *testing.T) { function TestMakeDateFilterFunc (line 96) | func TestMakeDateFilterFunc(t *testing.T) { function TestMakePath (line 172) | func TestMakePath(t *testing.T) { function TestConvertDateTime (line 224) | func TestConvertDateTime(t *testing.T) { function TestExtractSlug (line 261) | func TestExtractSlug(t *testing.T) { function TestCookieName (line 313) | func TestCookieName(t *testing.T) { function TestFileHandling (line 348) | func TestFileHandling(t *testing.T) { function TestTimeFormatting (line 370) | func TestTimeFormatting(t *testing.T) { function TestDateFilteringIntegration (line 391) | func TestDateFilteringIntegration(t *testing.T) { function TestConstants (line 413) | func TestConstants(t *testing.T) { FILE: cmd/download.go function init (line 221) | func init() { function convertDateTime (line 237) | func convertDateTime(datetime string) string { function parseURL (line 253) | func parseURL(toTest string) (*url.URL, error) { function makePath (line 267) | func makePath(post lib.Post, outputFolder string, format string) string { function extractSlug (line 273) | func extractSlug(url string) string { function filterExistingPosts (line 280) | func filterExistingPosts(urls []string, outputFolder string, format stri... FILE: cmd/integration_test.go function TestCommandExecution (line 23) | func TestCommandExecution(t *testing.T) { function TestCommandFlags (line 186) | func TestCommandFlags(t *testing.T) { function TestCommandValidation (line 233) | func TestCommandValidation(t *testing.T) { function TestErrorHandling (line 255) | func TestErrorHandling(t *testing.T) { function TestConfigurations (line 286) | func TestConfigurations(t *testing.T) { function TestRealWorldScenarios (line 338) | func TestRealWorldScenarios(t *testing.T) { function TestArchiveWorkflow (line 404) | func TestArchiveWorkflow(t *testing.T) { FILE: cmd/list.go function init (line 42) | func init() { FILE: cmd/root.go type cookieName (line 17) | type cookieName method String (line 24) | func (c *cookieName) String() string { method Set (line 28) | func (c *cookieName) Set(val string) error { method Type (line 38) | func (c *cookieName) Type() string { constant substackSid (line 20) | substackSid cookieName = "substack.sid" constant connectSid (line 21) | connectSid cookieName = "connect.sid" function Execute (line 97) | func Execute() { function init (line 104) | func init() { function makeDateFilterFunc (line 119) | func makeDateFilterFunc(beforeDate string, afterDate string) lib.DateFil... FILE: cmd/version.go function init (line 19) | func init() { FILE: lib/extractor.go type RawPost (line 22) | type RawPost struct method ToPost (line 27) | func (r *RawPost) ToPost() (Post, error) { type Post (line 37) | type Post struct method ToMD (line 58) | func (p *Post) ToMD(withTitle bool) (string, error) { method ToText (line 71) | func (p *Post) ToText(withTitle bool) string { method ToHTML (line 79) | func (p *Post) ToHTML(withTitle bool) string { method ToJSON (line 87) | func (p *Post) ToJSON() (string, error) { method contentForFormat (line 96) | func (p *Post) contentForFormat(format string, withTitle bool) (string... method WriteToFile (line 110) | func (p *Post) WriteToFile(path string, format string, addSourceURL bo... method WriteToFileWithImages (line 134) | func (p *Post) WriteToFileWithImages(ctx context.Context, path string,... type PostWrapper (line 263) | type PostWrapper struct type Extractor (line 268) | type Extractor struct method ExtractPost (line 327) | func (e *Extractor) ExtractPost(ctx context.Context, pageUrl string) (... method GetAllPostsURLs (line 376) | func (e *Extractor) GetAllPostsURLs(ctx context.Context, pubUrl string... method ExtractAllPosts (line 440) | func (e *Extractor) ExtractAllPosts(ctx context.Context, urls []string... type ArchiveEntry (line 273) | type ArchiveEntry struct type Archive (line 280) | type Archive struct method AddEntry (line 498) | func (a *Archive) AddEntry(post Post, filePath string, downloadTime ti... method sortEntries (line 510) | func (a *Archive) sortEntries() { method GenerateHTML (line 526) | func (a *Archive) GenerateHTML(outputDir string) error { method GenerateMarkdown (line 598) | func (a *Archive) GenerateMarkdown(outputDir string) error { method GenerateText (line 640) | func (a *Archive) GenerateText(outputDir string) error { function NewExtractor (line 286) | func NewExtractor(f *Fetcher) *Extractor { function extractJSONString (line 295) | func extractJSONString(doc *goquery.Document) (string, error) { type DateFilterFunc (line 374) | type DateFilterFunc type ExtractResult (line 433) | type ExtractResult struct function NewArchive (line 491) | func NewArchive() *Archive { FILE: lib/extractor_test.go function createSamplePost (line 24) | func createSamplePost() Post { function createMockSubstackHTML (line 44) | func createMockSubstackHTML(post Post) string { function TestRawPostToPost (line 69) | func TestRawPostToPost(t *testing.T) { function TestPostFormatConversions (line 95) | func TestPostFormatConversions(t *testing.T) { function TestPostWriteToFile (line 183) | func TestPostWriteToFile(t *testing.T) { function TestExtractJSONString (line 291) | func TestExtractJSONString(t *testing.T) { function createSubstackTestServer (line 340) | func createSubstackTestServer() (*httptest.Server, map[string]Post) { function TestExtractorExtractPost (line 397) | func TestExtractorExtractPost(t *testing.T) { function TestExtractorGetAllPostsURLs (line 446) | func TestExtractorGetAllPostsURLs(t *testing.T) { function TestExtractorExtractAllPosts (line 515) | func TestExtractorExtractAllPosts(t *testing.T) { function TestExtractorErrorHandling (line 721) | func TestExtractorErrorHandling(t *testing.T) { function TestEnhancedPostExtraction (line 864) | func TestEnhancedPostExtraction(t *testing.T) { function escapeJSONForJS (line 1021) | func escapeJSONForJS(post Post) string { function TestArchive (line 1028) | func TestArchive(t *testing.T) { function TestArchivePageGeneration (line 1102) | func TestArchivePageGeneration(t *testing.T) { function BenchmarkExtractor (line 1309) | func BenchmarkExtractor(b *testing.B) { FILE: lib/fetcher.go constant DefaultRatePerSecond (line 18) | DefaultRatePerSecond = 2 constant DefaultBurst (line 21) | DefaultBurst = 5 constant defaultRetryAfter (line 24) | defaultRetryAfter = 60 constant defaultMaxRetryCount (line 27) | defaultMaxRetryCount = 10 constant defaultMaxElapsedTime (line 30) | defaultMaxElapsedTime = 10 * time.Minute constant defaultMaxInterval (line 33) | defaultMaxInterval = 2 * time.Minute constant defaultClientTimeout (line 36) | defaultClientTimeout = 30 * time.Second constant userAgent (line 39) | userAgent = "sbstck-dl/0.1" type Fetcher (line 42) | type Fetcher struct method FetchURLs (line 178) | func (f *Fetcher) FetchURLs(ctx context.Context, urls []string) <-chan... method FetchURL (line 222) | func (f *Fetcher) FetchURL(ctx context.Context, url string) (io.ReadCl... method fetch (line 264) | func (f *Fetcher) fetch(ctx context.Context, url string) (io.ReadClose... type FetcherOptions (line 51) | type FetcherOptions struct type FetcherOption (line 62) | type FetcherOption function WithRatePerSecond (line 65) | func WithRatePerSecond(rate int) FetcherOption { function WithBurst (line 72) | func WithBurst(burst int) FetcherOption { function WithProxyURL (line 79) | func WithProxyURL(proxyURL *url.URL) FetcherOption { function WithBackOffConfig (line 86) | func WithBackOffConfig(b backoff.BackOff) FetcherOption { function WithCookie (line 93) | func WithCookie(cookie *http.Cookie) FetcherOption { function WithTimeout (line 102) | func WithTimeout(timeout time.Duration) FetcherOption { function WithMaxWorkers (line 109) | func WithMaxWorkers(workers int) FetcherOption { type FetchResult (line 116) | type FetchResult struct type FetchError (line 123) | type FetchError struct method Error (line 130) | func (e *FetchError) Error() string { function NewFetcher (line 138) | func NewFetcher(opts ...FetcherOption) *Fetcher { function makeDefaultBackoff (line 310) | func makeDefaultBackoff() backoff.BackOff { function min (line 320) | func min(a, b int) int { FILE: lib/fetcher_test.go function TestNewFetcher (line 23) | func TestNewFetcher(t *testing.T) { function TestFetchURL (line 59) | func TestFetchURL(t *testing.T) { function TestFetchURLs (line 192) | func TestFetchURLs(t *testing.T) { function TestFetchErrors (line 507) | func TestFetchErrors(t *testing.T) { function TestIntegrationWithRandomErrors (line 526) | func TestIntegrationWithRandomErrors(t *testing.T) { function BenchmarkFetcher (line 613) | func BenchmarkFetcher(b *testing.B) { FILE: lib/files.go type FileInfo (line 18) | type FileInfo struct type FileDownloader (line 28) | type FileDownloader struct method DownloadFiles (line 65) | func (fd *FileDownloader) DownloadFiles(ctx context.Context, htmlConte... method extractFileElements (line 130) | func (fd *FileDownloader) extractFileElements(doc *goquery.Document) (... method extractFilenameFromURL (line 172) | func (fd *FileDownloader) extractFilenameFromURL(downloadURL string) s... method isAllowedExtension (line 201) | func (fd *FileDownloader) isAllowedExtension(filename string) bool { method downloadSingleFile (line 221) | func (fd *FileDownloader) downloadSingleFile(ctx context.Context, down... method generateSafeFilename (line 300) | func (fd *FileDownloader) generateSafeFilename(downloadURL string) str... method sanitizeFilename (line 308) | func (fd *FileDownloader) sanitizeFilename(filename string) string { method updateHTMLWithLocalPaths (line 330) | func (fd *FileDownloader) updateHTMLWithLocalPaths(htmlContent string,... method makeRelativePath (line 352) | func (fd *FileDownloader) makeRelativePath(localPath string) string { function NewFileDownloader (line 36) | func NewFileDownloader(fetcher *Fetcher, outputDir, filesDir string, ext... type FileDownloadResult (line 49) | type FileDownloadResult struct type FileElement (line 57) | type FileElement struct FILE: lib/files_test.go function createTestFileServer (line 23) | func createTestFileServer() *httptest.Server { function createTestHTMLWithFiles (line 69) | func createTestHTMLWithFiles(baseURL string) string { function TestNewFileDownloader (line 127) | func TestNewFileDownloader(t *testing.T) { function TestExtractFileElements (line 160) | func TestExtractFileElements(t *testing.T) { function TestExtractFilenameFromURL (line 248) | func TestExtractFilenameFromURL(t *testing.T) { function TestIsAllowedExtension (line 297) | func TestIsAllowedExtension(t *testing.T) { function TestSanitizeFilename (line 358) | func TestSanitizeFilename(t *testing.T) { function TestGenerateSafeFilenameForFiles (line 413) | func TestGenerateSafeFilenameForFiles(t *testing.T) { function TestDownloadSingleFile (line 435) | func TestDownloadSingleFile(t *testing.T) { function TestMakeRelativePath (line 587) | func TestMakeRelativePath(t *testing.T) { function TestUpdateHTMLWithLocalPathsForFiles (line 616) | func TestUpdateHTMLWithLocalPathsForFiles(t *testing.T) { function TestDownloadFiles (line 642) | func TestDownloadFiles(t *testing.T) { function TestFileDownloadErrorScenarios (line 759) | func TestFileDownloadErrorScenarios(t *testing.T) { function TestFileDownloadWithRealSubstackHTML (line 834) | func TestFileDownloadWithRealSubstackHTML(t *testing.T) { function TestExtractorIntegration (line 906) | func TestExtractorIntegration(t *testing.T) { function TestExtractorIntegrationWithFiltering (line 994) | func TestExtractorIntegrationWithFiltering(t *testing.T) { function BenchmarkExtractFileElements (line 1059) | func BenchmarkExtractFileElements(b *testing.B) { function BenchmarkSanitizeFilename (line 1074) | func BenchmarkSanitizeFilename(b *testing.B) { FILE: lib/images.go type ImageQuality (line 19) | type ImageQuality constant ImageQualityHigh (line 22) | ImageQualityHigh ImageQuality = "high" constant ImageQualityMedium (line 23) | ImageQualityMedium ImageQuality = "medium" constant ImageQualityLow (line 24) | ImageQualityLow ImageQuality = "low" type ImageInfo (line 28) | type ImageInfo struct type ImageDownloader (line 39) | type ImageDownloader struct method DownloadImages (line 76) | func (id *ImageDownloader) DownloadImages(ctx context.Context, htmlCon... method extractImageElements (line 144) | func (id *ImageDownloader) extractImageElements(doc *goquery.Document)... method extractImageURLs (line 228) | func (id *ImageDownloader) extractImageURLs(doc *goquery.Document) ([]... method getImageElementInfo (line 246) | func (id *ImageDownloader) getImageElementInfo(imgElement *goquery.Sel... method getBestImageURL (line 291) | func (id *ImageDownloader) getBestImageURL(imgElement *goquery.Selecti... method getTargetWidth (line 324) | func (id *ImageDownloader) getTargetWidth() int { method extractAllURLsFromSrcset (line 338) | func (id *ImageDownloader) extractAllURLsFromSrcset(srcset string) []s... method extractURLFromSrcset (line 373) | func (id *ImageDownloader) extractURLFromSrcset(srcset string, targetW... method downloadSingleImage (line 411) | func (id *ImageDownloader) downloadSingleImage(ctx context.Context, im... method generateSafeFilename (line 460) | func (id *ImageDownloader) generateSafeFilename(imageURL string) (stri... method getImageFormat (line 511) | func (id *ImageDownloader) getImageFormat(filename string) string { method extractDimensionsFromURL (line 528) | func (id *ImageDownloader) extractDimensionsFromURL(imageURL string) (... method updateHTMLWithLocalPaths (line 545) | func (id *ImageDownloader) updateHTMLWithLocalPaths(htmlContent string... method updateHTMLWithStringReplacement (line 616) | func (id *ImageDownloader) updateHTMLWithStringReplacement(htmlContent... method updateSrcsetAttribute (line 644) | func (id *ImageDownloader) updateSrcsetAttribute(srcset string, urlToR... method isImageURL (line 726) | func (id *ImageDownloader) isImageURL(url string) bool { method isSameImage (line 733) | func (id *ImageDownloader) isSameImage(url1, url2 string) bool { method parseSrcsetEntries (line 765) | func (id *ImageDownloader) parseSrcsetEntries(srcset string) []string { method updateDataAttrsJSON (line 801) | func (id *ImageDownloader) updateDataAttrsJSON(dataAttrs string, urlTo... function NewImageDownloader (line 47) | func NewImageDownloader(fetcher *Fetcher, outputDir, imagesDir string, q... type ImageDownloadResult (line 60) | type ImageDownloadResult struct type ImageElement (line 68) | type ImageElement struct function extractImageID (line 750) | func extractImageID(url string) string { FILE: lib/images_test.go function createTestImageServer (line 31) | func createTestImageServer() *httptest.Server { function createTestHTMLWithImages (line 59) | func createTestHTMLWithImages(baseURL string) string { function TestNewImageDownloader (line 101) | func TestNewImageDownloader(t *testing.T) { function TestGetTargetWidth (line 123) | func TestGetTargetWidth(t *testing.T) { function TestExtractURLFromSrcset (line 144) | func TestExtractURLFromSrcset(t *testing.T) { function TestGenerateSafeFilename (line 194) | func TestGenerateSafeFilename(t *testing.T) { function TestGetImageFormat (line 239) | func TestGetImageFormat(t *testing.T) { function TestExtractDimensionsFromURL (line 266) | func TestExtractDimensionsFromURL(t *testing.T) { function TestDownloadImages (line 311) | func TestDownloadImages(t *testing.T) { function TestDownloadSingleImage (line 378) | func TestDownloadSingleImage(t *testing.T) { function TestUpdateHTMLWithLocalPaths (line 429) | func TestUpdateHTMLWithLocalPaths(t *testing.T) { function BenchmarkExtractURLFromSrcset (line 453) | func BenchmarkExtractURLFromSrcset(b *testing.B) { function BenchmarkGenerateSafeFilename (line 463) | func BenchmarkGenerateSafeFilename(b *testing.B) { function TestWithRealSubstackHTML (line 474) | func TestWithRealSubstackHTML(t *testing.T) { function TestURLReplacementIssue (line 568) | func TestURLReplacementIssue(t *testing.T) { function TestCommaSeparatedURLRegressionBug (line 638) | func TestCommaSeparatedURLRegressionBug(t *testing.T) { function TestExtractImageElements (line 781) | func TestExtractImageElements(t *testing.T) { function TestExtractAllURLsFromSrcset (line 830) | func TestExtractAllURLsFromSrcset(t *testing.T) { function TestImageURLParsing (line 869) | func TestImageURLParsing(t *testing.T) { function TestImageURLHelperFunctions (line 900) | func TestImageURLHelperFunctions(t *testing.T) { function TestExtractImageElementsWithAnchorAndSourceTags (line 993) | func TestExtractImageElementsWithAnchorAndSourceTags(t *testing.T) { function TestHrefAndSourceURLReplacementRegression (line 1072) | func TestHrefAndSourceURLReplacementRegression(t *testing.T) { function TestComplexSubstackImageStructureRegression (line 1156) | func TestComplexSubstackImageStructureRegression(t *testing.T) { FILE: main.go function main (line 5) | func main() {