Action

send to GitHub Obsidian

Posted by hahaSweat, Last update about 1 year ago

将当前 draft 发送到 GitHub Obsidian 仓库
文件名格式为:第一行内容.md

第一次使用需输入 token 和 repo 地址
repo 地址格式为:owner/repo

Steps

  • script

    // See online documentation for examples
    // https://docs.getdrafts.com/docs/actions/scripting
    
    // 创建一个新的凭据
    // Github 是这个凭据的标识符,在以后的脚本中通过标识符来使用
    let credential = Credential.create("Github", "输入 Github Token 和 Repo");
    
    // 为 Github 凭据添加一个 token 字段
    // token 是脚本中用于检索的名字
    // Token 是提示用户输入凭据时显示的标签
    credential.addTextField("token", "Token");
    // 为 Github 凭据添加一个 repo 字段
    credential.addTextField("repo", "Repo");
    
    // 显示一个对话框,要求用户输入前面定义的字段
    credential.authorize();
    
    // 从当前 Drafts 文档中获取全部文本内容
    // draft 是一个全局变量,代表当前的文档
    // content 是 draft 的一个属性,代表文档的全部文本内容
    let content = draft.content;
    // 查找 content 中第一个换行符("\n")的位置
    // .indexOf() 用于查找字符串中的文本,参数是要查找的文本。
    let firstNewline = content.indexOf("\n");
    // 提取 content 中从开头到第一个换行符之前的文本。
    // .substring() 用于提取字符串中的一部分,参数是起始位置和结束位置。
    let titleLine = content.substring(0, firstNewline);
    // 将 titleLine 作为文件名,并添加.md作为文件后缀。
    // 也就是,将标题行作为文件名
    // `${titleLine}.md` 是一种字符串模板语法,可以将变量的值插入到字符串中。
    let filename = `${titleLine}.md`;
    
    // 提取 content 中从第一个换行符后面的文本。
    // .substring() 如果省略结束位置,则提取到字符串的末尾。
    content = content.substring(firstNewline + 1);
    
    // 构建请求头
    // 从凭证中获取名为"token"的字段的值
    token = credential.getValue("token");
    let headers = {
      // 用于验证和授权的token
      Authorization: `Bearer ${token}`,
    };
    
    // 构建请求 URL
    // 从凭证中获取名为"repo"的字段的值
    repo = credential.getValue("repo");
    // 使用 encodeURI 对文件名进行编码,以便在URL中使用
    let path = encodeURI(filename);
    // 使用前文提到的模板字符串构建完整 URL
    // repo、path 的值会被插入到字符串中
    let url = `https://api.github.com/repos/${repo}/contents/${path}`;
    
    // 要发送给GitHub API的数据
    let data = {
      // 描述这次提交的信息
      message: `Added ${filename} via Drafts app`,
      // 要上传的文件的内容,这个内容被转换为Base64编码
      content: Base64.encode(content),
    };
    
    // 使用 Drafts 的HTTP.create()方法创建并发起请求
    let http = HTTP.create();
    let response = http.request({
      // 要请求的 API 的URL
      url: url,
      // HTTP请求的方法,"PUT"方法是为了添加文件
      method: "PUT",
      // 前面定义的请求头
      headers: headers,
      // 前面定义的要发送的数据
      data: data,
    });
    
    // 如果响应码是 201
    if (response.statusCode == 201) {
      // 将当前 draft 的 isArchived 属性设置为true
      draft.isArchived = true;
      // 调用当前 draft 的 update 方法以保存更改
      draft.update();
      // 创建新的空白 draft
      editor.new();
      // 显示一个信息提示,内容为 success ...
      app.displayInfoMessage("Success to GitHub and archived.");
    } else {
      // 否则,显示一个错误提示,内容为 Failed ...
      app.displayErrorMessage("Failed to GitHub");
    }
    

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.