Action
Post Jekyll blog entry to Github repository
UPDATES
7 months ago
Construct frontmatter for posts
Drafts to GitHub Action
This repository contains a Drafts app action script that automates the process of posting content directly to a GitHub repository, specifically designed for Jekyll or other static site generators that use Markdown files in a _posts
directory.
Features
- Automatically formats Draft content into a Markdown file.
- Configures file naming based on the title and date.
- Posts content to your specified GitHub repository.
- Uses Drafts’ Credentials for secure handling of GitHub authentication details.
Prerequisites
Before using this action, ensure you have:
- The Drafts app installed on your device.
- A GitHub account and a repository where you want to post your drafts.
- A Personal Access Token (PAT) from GitHub with
repo
scope permissions.
Setup
Generate a Personal Access Token (PAT) on GitHub:
- Go to your GitHub account settings.
- Navigate to Developer settings > Personal access tokens.
- Generate a new token with
repo
scope. - Copy the generated token for later use.
Add the Action to Drafts:
- Create a new action in Drafts.
- Paste the provided script into the action’s script step.
Configure the Credential:
- The first time you run the action, Drafts will prompt you to enter your GitHub details:
- Username: Your GitHub username.
- Personal Access Token: The PAT you generated.
- Repository Name: The name of the GitHub repository where you want to post.
- Email Address: The email associated with your GitHub account (used for commit info).
- The first time you run the action, Drafts will prompt you to enter your GitHub details:
Usage
- Write your draft in Markdown format. The first line should be the title, prefixed with
#
(Markdown syntax for a heading). - Run the action you created.
- If successful, the content will be posted to your GitHub repository in the
_posts
directory, named according to the draft’s title and date.
Troubleshooting
- Authentication Errors: Ensure your PAT is correct and has the necessary permissions.
- HTTP Errors: Check the console log in Drafts for detailed error messages. Common issues include incorrect repository names or network issues.
Contributing
Contributions to this script are welcome! Please submit pull requests or issues on GitHub to suggest improvements or report bugs.
License
This script is released under MIT License.
Acknowledgements
- Thanks to all contributors and users for feedback and suggestions.
- Drafts app for providing a powerful scripting environment.
Steps
-
script
// Create a GitHub credential let githubCredential = Credential.create("GitHub", "Enter your GitHub details for posting to your repository."); githubCredential.addTextField("username", "Username"); githubCredential.addPasswordField("token", "Personal Access Token"); githubCredential.addTextField("repoName", "Repository Name"); githubCredential.addTextField("email", "Email Address"); // Prompt the user for credentials if not already saved if (!githubCredential.authorize()) { console.log("Authorization failed or was cancelled by the user."); context.fail(); } // Extract details from the credentials const username = githubCredential.getValue("username"); const token = githubCredential.getValue("token"); const repoName = githubCredential.getValue("repoName"); const email = githubCredential.getValue("email"); // Prepare your post content with front matter const title = draft.title.replace('# ', ''); const date = new Date().toISOString().split('T')[0]; const slug = title.toLowerCase().replace(/\s+/g, '-').replace(/[^\w\-]+/g, '').replace(/\-\-+/g, '-').trim('-'); const fileName = `${date}-${slug}.md`; // Dynamically generate categories from Drafts tags const categories = draft.tags.join(', '); // Construct front matter const frontMatter = `--- layout: post title: "${title}" date: ${date} categories: [${categories}] --- `; const fullContent = frontMatter + draft.content.split("\n").slice(1).join("\n"); // Append the rest of the draft content excluding the title const encodedContent = Base64.encode(fullContent); // Setup for the GitHub API request const path = `_posts/${fileName}`; const apiUrl = `https://api.github.com/repos/${username}/${repoName}/contents/${path}`; // Construct data payload const data = { owner: `${username}`, repo: `${repoName}`, path: `${path}`, message: 'Sent from Drafts', committer: { name: `${username}`, email: `${email}` }, content: encodedContent }; // Create the HTTP request let http = HTTP.create(); let response = http.request({ "url": apiUrl, "method": "PUT", "headers": { "Authorization": `Bearer ${token}`, "User-Agent": "DraftsApp", "Content-Type": "application/json", 'X-GitHub-Api-Version': '2022-11-28' }, "data": data }); // Process the response if (response.statusCode === 200 || response.statusCode === 201) { console.log("Successfully created/updated the file on GitHub."); } else { console.log(`Failed to post to GitHub. Status code: ${response.statusCode} Response: ${response.responseText}`); }
Options
-
After Success Default Notification Info Log Level Info
Items available in the Drafts Directory are uploaded by community members. Use appropriate caution reviewing downloaded items before use.