|
| 1 | +#!/usr/bin/env -S scala-cli -S 3 |
| 2 | + |
| 3 | +//> using scala "3.2.1" |
| 4 | +//> using dep "com.mchange::audiofluidity-rss:0.0.6" |
| 5 | +//> using dep "com.lihaoyi::os-lib::0.9.3" |
| 6 | +// |
| 7 | + |
| 8 | +val blogTitle = "Random notes about programming" |
| 9 | +val author = "Ruslan Shevchenko <[email protected]>" |
| 10 | +val baseUrl = "https://github.com/rssh/notes" |
| 11 | +val feedUrl = "https://rssh.github.io/notes/feed.xml" |
| 12 | +val wd = os.pwd |
| 13 | +val path = if wd.toString.endsWith("scripts") && os.exists(wd / "generate-feed.sc") then |
| 14 | + os.Path(wd.wrapped.getParent) |
| 15 | + else if os.exists(wd/"scripts"/"generate-feed.sc") then |
| 16 | + wd |
| 17 | + else |
| 18 | + println(s"Can't determinate directory: should be scripts or current dirrectory, not in ${wd}, exiting") |
| 19 | + System.exit(1) |
| 20 | + ??? |
| 21 | + |
| 22 | +import audiofluidity.rss.* |
| 23 | +import java.time.* |
| 24 | + |
| 25 | +def extractTitle(lines:IndexedSeq[String]): Option[String] = { |
| 26 | + val titleLine = "^title: (.*)$".r |
| 27 | + val head1Line = """^\# (.*)$""".r |
| 28 | + val head2Line = """^\#\# (.*)$""".r |
| 29 | + lines.collectFirst{ |
| 30 | + case titleLine(title) => title |
| 31 | + case head1Line(title) => title |
| 32 | + case head2Line(title) => title |
| 33 | + } |
| 34 | + |
| 35 | +} |
| 36 | + |
| 37 | +println(s"path=$path") |
| 38 | +val items = os.list(path).filter(file => |
| 39 | + os.isFile(file) && file.ext == "md" && |
| 40 | + file.baseName != "README" |
| 41 | + ).flatMap{ file => |
| 42 | + val dateRegExpr = """([0-9]+)_([0-9]+)_([0-9]+)_(.*)$""".r |
| 43 | + file.baseName.toString match |
| 44 | + case dateRegExpr(sYear,sMonth,sDay, rest) => |
| 45 | + val (month, day) = if (sMonth.toInt > 12) { |
| 46 | + (sDay.toInt, sMonth.toInt) |
| 47 | + } else (sMonth.toInt, sDay.toInt) |
| 48 | + val year = sYear.toInt |
| 49 | + val date = LocalDate.of(year,month,day) |
| 50 | + println(s"file=$file, date=$date") |
| 51 | + Some((file, date)) |
| 52 | + case _ => |
| 53 | + println(s"file $file without date prefix, skipping") |
| 54 | + None |
| 55 | + }.sortBy(_._2).reverse.map{ (file, ctime) => |
| 56 | + val mdContent = os.read.lines(file) |
| 57 | + val title = extractTitle(mdContent).getOrElse(file.toString) |
| 58 | + val pubDate = ZonedDateTime.of(ctime, LocalTime.MIN, ZoneId.systemDefault) |
| 59 | + Element.Item.create(title, s"${baseUrl}/file", "at {}", author, pubDate=Some(pubDate)) |
| 60 | + } |
| 61 | + |
| 62 | +val channel = Element.Channel.create(blogTitle,feedUrl,"random unsorted notes",items) |
| 63 | +println(Element.Rss(channel).asXmlText) |
| 64 | +val rss = Element.Rss(channel).asXmlText |
| 65 | +val targetDir = path/"_site" |
| 66 | +if (!os.exists(targetDir)) { |
| 67 | + os.makeDir(targetDir) |
| 68 | +} |
| 69 | +os.write.over(targetDir/"feed.xml",rss) |
| 70 | + |
0 commit comments