diff --git a/plugin.php b/plugin.php index c43df59..3895d27 100644 --- a/plugin.php +++ b/plugin.php @@ -9,7 +9,7 @@ class pluginBluditGithub extends Plugin 'owner' => '', 'repo' => '', 'branch' => 'main', - 'path' => 'posts', + 'path' => '', 'exportDrafts' => false, ]; } @@ -46,9 +46,9 @@ class pluginBluditGithub extends Plugin $html .= ''; $html .= '
'; - $html .= ''; - $html .= ''; - $html .= 'Directory in the repo where articles are written (e.g. posts). Leave empty for root.'; + $html .= ''; + $html .= ''; + $html .= 'Each article is exported as {key}/index.md. Set a prefix (e.g. articles) to nest under a subfolder.'; $html .= '
'; $html .= '
'; @@ -117,27 +117,30 @@ class pluginBluditGithub extends Plugin return; } - $currentKeys = $this->getAllPageKeys(); - $exportPath = trim($this->getValue('path'), '/'); - $endpoint = '/contents/' . ($exportPath ?: ''); + $currentKeys = $this->getAllPageKeys(); + $exportPath = trim($this->getValue('path'), '/'); + $listEndpoint = '/contents/' . ($exportPath ?: ''); - $files = $this->githubRequest('GET', $endpoint); - if (!is_array($files)) { + $items = $this->githubRequest('GET', $listEndpoint); + if (!is_array($items)) { return; } - foreach ($files as $file) { - if (!isset($file['type']) || $file['type'] !== 'file') { + foreach ($items as $item) { + if (!isset($item['type']) || $item['type'] !== 'dir') { continue; } - if (substr($file['name'], -3) !== '.md') { + $key = $item['name']; + if (in_array($key, $currentKeys, true)) { continue; } - $key = substr($file['name'], 0, -3); - if (!in_array($key, $currentKeys, true)) { - $this->githubRequest('DELETE', '/contents/' . $file['path'], [ + // Directory is no longer a Bludit page — delete its index.md + $indexPath = $item['path'] . '/index.md'; + $sha = $this->getFileSha($indexPath); + if ($sha) { + $this->githubRequest('DELETE', '/contents/' . $indexPath, [ 'message' => 'Delete: ' . $key, - 'sha' => $file['sha'], + 'sha' => $sha, 'branch' => $this->getValue('branch'), ]); } @@ -153,8 +156,9 @@ class pluginBluditGithub extends Plugin private function exportPage($page, $saveStatus = true) { - $content = $this->buildMarkdown($page); - $filePath = $this->getFilePath($page->key()); + $key = $page->getValue('key'); + $content = $this->buildMarkdown($page, $key); + $filePath = $this->getFilePath($key); $sha = $this->getFileSha($filePath); $data = [ @@ -201,42 +205,38 @@ class pluginBluditGithub extends Plugin $this->setStatus(date('Y-m-d H:i:s') . " — Bulk export: {$count} articles pushed."); } - private function buildMarkdown($page) + private function buildMarkdown($page, $key) { - // Prefer raw content (Markdown as typed); fall back to rendered HTML - $content = $page->getValue('content'); - if (empty($content)) { - $content = $page->content(); - } + // TinyMCE stores HTML — content() returns the full rendered content + $content = $page->content(); - // Tags - $tags = $page->tags(); + // Tags: getValue returns comma-separated string in Bludit + $rawTags = $page->getValue('tags'); $tagLines = ''; - if (!empty($tags)) { - foreach ($tags as $tag) { - $tagName = is_object($tag) ? $tag->name() : (string)$tag; - $tagLines .= "\n - " . $tagName; + if (!empty($rawTags)) { + $tagArray = array_map('trim', explode(',', $rawTags)); + foreach ($tagArray as $tag) { + if ($tag !== '') { + $tagLines .= "\n - " . $tag; + } } } $fm = "---\n"; - $fm .= 'title: "' . addslashes($page->title()) . "\"\n"; + $fm .= 'title: "' . str_replace('"', '\"', $page->title()) . "\"\n"; $fm .= 'date: ' . date('Y-m-d', strtotime($page->getValue('dateRaw'))) . "\n"; - $fm .= 'slug: ' . $page->key() . "\n"; + $fm .= 'slug: ' . $key . "\n"; $fm .= 'status: ' . $page->getValue('status') . "\n"; $fm .= 'tags:' . ($tagLines ?: ' []') . "\n"; - $description = $page->description(); + $description = $page->getValue('description'); if (!empty($description)) { - $fm .= 'description: "' . addslashes($description) . "\"\n"; + $fm .= 'description: "' . str_replace('"', '\"', $description) . "\"\n"; } - $category = $page->category(); - if (!empty($category)) { - $catKey = is_object($category) ? $category->key() : (string)$category; - if ($catKey && $catKey !== 'uncategorized') { - $fm .= 'category: ' . $catKey . "\n"; - } + $category = $page->getValue('category'); + if (!empty($category) && $category !== 'uncategorized') { + $fm .= 'category: ' . $category . "\n"; } $cover = $page->coverImage(); @@ -251,8 +251,8 @@ class pluginBluditGithub extends Plugin private function getFilePath($key) { - $exportPath = trim($this->getValue('path'), '/'); - return ($exportPath ? $exportPath . '/' : '') . $key . '.md'; + $prefix = trim($this->getValue('path'), '/'); + return ($prefix ? $prefix . '/' : '') . $key . '/index.md'; } private function getFileSha($filePath) @@ -305,7 +305,7 @@ class pluginBluditGithub extends Plugin return false; } - // 404 on GET means the file doesn't exist yet — not an error + // 404 on GET = file/dir doesn't exist yet, not an error if ($httpCode === 404) { return null; } @@ -330,7 +330,7 @@ class pluginBluditGithub extends Plugin } } - // Fallback: most recently modified page directory + // Fallback: most recently modified page directory (Bludit stores pages as index.txt) if (!defined('PATH_PAGES') || !is_dir(PATH_PAGES)) { return null; } @@ -339,7 +339,7 @@ class pluginBluditGithub extends Plugin $newestTime = 0; foreach (glob(PATH_PAGES . '*', GLOB_ONLYDIR) as $dir) { - $indexFile = $dir . DS . 'index.php'; + $indexFile = $dir . DS . 'index.txt'; if (file_exists($indexFile)) { $mtime = filemtime($indexFile); if ($mtime > $newestTime) {