logseq2gemtext/run.php

68 lines
1.9 KiB
PHP

<?php
declare(strict_types=1);
require __DIR__ . '/vendor/autoload.php';
$opts = getopt('o:t:', rest_index: $rest_index);
$rest = array_slice($argv, $rest_index);
$gemlog_input_path = $rest[0] ?? null;
$gemlog_output_path = $opts['o'] ?? null;
$trim_prefix = $opts['t'] ?? null;
if (is_null($gemlog_input_path) || !file_exists($gemlog_input_path)) {
throw new \Exception('Please provide an input gemlog file listing some articles. Got: ' . $gemlog_input_path);
}
if (is_null($gemlog_output_path) || !is_dir($gemlog_output_path)) {
throw new \Exception('Please provide a destination directory using -o');
}
$dir = dirname($gemlog_input_path);
$gemlog = new LogseqGem\GemlogParser;
$article = new LogseqGem\ArticleParser;
$gemlog->load($gemlog_input_path);
$titles = $gemlog->getTitles();
foreach ($titles as $title) {
$encoded_title = str_replace('/', '%2F', $title);
$article_path = $dir . '/' . $encoded_title . '.md';
$article->load($article_path);
$gemtext = $article->convert();
if (!$article->isPublished() || empty($gemtext)) {
continue;
}
$sanitized_title = $title;
if ($trim_prefix && strpos($sanitized_title, $trim_prefix) === 0) {
$sanitized_title = substr($sanitized_title, strlen($trim_prefix));
}
$sanitized_title = strtolower($sanitized_title);
$sanitized_title = str_replace([' ', ','], ['-'], $sanitized_title);
$sanitized_title .= '.gmi';
$output_path = $gemlog_output_path . '/' . $sanitized_title;
echo "Writing to ", $sanitized_title, "...\n";
$date = strtotime($article->getProperties()['date'] ?? null);
if (empty($date)) {
throw new Exception('Article ' . $title . ' has no date property');
}
$output = sprintf(
"# %s\n\n%s\n\n%s\n\n=> /gemlog.gmi gemlog\n=> / home\n",
$title,
date('j F Y', $date),
$gemtext
);
file_put_contents($output_path, $output);
}