Coder Social home page Coder Social logo

letttgaco / elog Goto Github PK

View Code? Open in Web Editor NEW
1.1K 7.0 53.0 3.49 MB

Markdown 批量导出工具、开放式跨平台博客解决方案,随意组合写作平台(语雀/Notion/FlowUs/飞书/我来Wolai)和博客平台(Hexo/Vitepress/Halo/Confluence/WordPress等)

Home Page: https://elog.1874.cool

License: MIT License

JavaScript 3.36% Shell 0.21% TypeScript 96.43%
blog hexo hugo notion vitepress yuque confluence docusaurus docz flowus

elog's Issues

github图床问题

你当前使用的Elog版本

0.13.1

Elog配置文件

上传失败:a4e6d6bb79f6f4f5af7e31d115f6144b.jpeg 请检查图床配置
请求失败  unable to verify the first certificate, PUT https://api.github.com/repos/xinkeji/hexo/contents/71c3ca0f6d6211c
          b427f50ae354471a0.jpeg -1 (connected: true, keepalive socket: false, socketHandledRequests: 1, socketHandledRe
          sponses: 0)
          headers: {}

发生了什么?

已经配置好github变量之后还是上传不了,怎么办呀

Elog错误日志

module.exports = {
  write: {
    platform: 'yuque-pwd',
    "yuque-pwd": {
      username: process.env.YUQUE_USERNAME,
      password: process.env.YUQUE_PWD,
      host: '',
      login: process.env.YUQUE_LOGIN,
      repo: process.env.YUQUE_REPO,
      linebreak: false
    }
  },
  deploy: {
    platform: "local",
    local: {
      outputDir: "./source/_posts/语雀/",
      filename: "title",
      format: "matter-markdown",
      catalog: true,
      formatExt: "",
    }
  },
  image: {
  enable: true,
  platform: 'github',
  github: {
    user: process.env.LGH_USER,
    token: process.env.GITHUB_TOKEN,
    repo: process.env.LGH_REPO,
    prefixKey: '',
    host: 'cdn.jsdelivr.net'
  
    }
  },
}

附加信息

1

你好,当notion作为write时,导出文件至本地时,notion内的Callout模块内容,存在异常情况

你当前使用的Elog版本

0.14.0

Elog配置文件

notion: {
      token: process.env.NOTION_TOKEN,
      databaseId: process.env.NOTION_DATABASE_ID,
      filter: { property: 'status', select: { equals: 'Published' }},
      catalog: {
        enable: true,
        property: "categories"
      }
    },

发生了什么?

你好,当notion作为write时,导出文件至本地时,notion内的Callout模块内容,存在异常情况。

Elog错误日志

附加信息

notion文档内容
CleanShot 2024-05-14 at 01 52 33@2x

导出文件,生成hexo博客后的展示效果
CleanShot 2024-05-14 at 01 53 10@2x

Error: Client network socket disconnected before secure TLS connection was established

C:\WorkSpace\elog>elog sync -e .elog.env
环境变量 已指定读取env文件为:C:\WorkSpace\elog.elog.env
全量更新 未获取到缓存,将全量更新文档
正在获取文档列表,请稍等...

node:internal/process/promises:288
            triggerUncaughtException(err, true /* fromPromise */);
            ^

Error: Client network socket disconnected before secure TLS connection was established
    at connResetException (node:internal/errors:720:14)
    at TLSSocket.onConnectEnd (node:_tls_wrap:1655:19)
    at TLSSocket.emit (node:events:529:35)
    at endReadableNT (node:internal/streams/readable:1368:12)
    at process.processTicksAndRejections (node:internal/process/task_queues:82:21) {
  code: 'ECONNRESET',
  path: '/api/v2/repos/z*n/ot/toc',
  host: 'www.yuque.com',
  port: 443,
  localAddress: undefined,
  name: 'ResponseError',
  data: undefined,
  status: -1,
  headers: {},
  res: {
    status: -1,
    statusCode: -1,
    statusMessage: null,
    headers: {},
    size: 0,
    aborted: false,
    rt: 244,
    keepAliveSocket: false,
    data: undefined,
    requestUrls: [ 'https://www.yuque.com/api/v2/repos/z*n/ot/toc' ],
    timing: null,
    remoteAddress: '139.224.214.226',
    remotePort: 443,
    socketHandledRequests: 1,
    socketHandledResponses: 0
  }
}

Node.js v18.18.0

我能否使用nextjs结合这个项目呢?

你当前使用的Elog版本

0.14

描述一下此特性

我能否使用nextjs结合这个项目呢?
我想有更强的自定义界面。
仅仅只是将elog当作一个【数据库】

附加信息

No response

Support for Typecho blogging platform

你当前使用的Elog版本

v0.13.3

描述一下此特性

Hello Elog developers, I am very happy to find such an excellent project that makes it easier for everyone to write blogs. However, I found that this project currently does not support publishing articles to typecho, a popular blogging platform.

Typecho is a lightweight blogging platform similar to wordpress. It has a complete documentation and plug-in mechanism and should be well connected with the elog project.

I hope to add new features in elog to output markdown documents to the typecho blog. Thanks in advance!

附加信息

No response

Notion + Elog + github 图床,更新文章后封面图上传图片失败后变成空

你当前使用的Elog版本

0.14.0

Elog配置文件

module.exports = {
  write: {
    platform: 'notion',
    notion: {
      token: process.env.NOTION_TOKEN,
      databaseId: process.env.NOTION_DATABASE_ID,
      filter: true, // {property: 'status', select: {equals: '已发布'}}
    },
  },
  deploy: {
    platform: 'local',
    local: {
      outputDir: './source/_posts',
      filename: 'title',
      format: 'markdown',
      frontMatter: {
        enable: true,
        // include:["status","tags","cover","category","excerpt","index_img","banner_img","archive"],
        exclude:[],
        timeFormat: true,
      },
      formatExt: './format-image.js',
    }
  },
  image: {
    enable: true,
    platform: 'github',
    local: {
      outputDir: './source/images',
      prefixKey: '/image',
      pathFollowDoc: false,
    },
    github: {
      token: process.env.GITHUB_TOKEN,
      user: process.env.ELOG_GITHUB_USER,
      repo: process.env.ELOG_GITHUB_REPO,
      branch: 'cdn',
      prefixKey: 'image',
      host: 'cdn.jsdelivr.net'
    },
  }
}

发生了什么?

新文章图片可能都是新上传github,所以没问题,但是一但修改了文章,同时自定义了 format-image.js, 会导致封面图丢失

format-image.js

const { matterMarkdownAdapter } = require('@elog/cli')
const path = require("path");

/**
 * 自定义文档处理器
 * @param {DocDetail} doc doc的类型定义为 DocDetail
 * @param {any} imageClient 图床下载器
 * @return {Promise<DocDetail>} 返回处理后的文档对象
 */
const format = async (doc, imageClient) => {
  const cover = doc.properties.cover
  // 将 cover 字段中的 notion 图片下载到本地
  if (imageClient)  {
    // 只有启用图床平台image.enable=true时,imageClient才能用,否则请自行实现图片上传
    const url = await imageClient.uploadImageFromUrl(cover, doc)
    // cover链接替换为本地图片
    doc.properties.cover = url ? url.split('danni-cool/my-blog/').join('danni-cool/my-blog@cdn/'): ''
    doc.properties.index_img = doc.properties.cover
    doc.properties.banner_img = doc.properties.cover
  }
  doc.properties.date = doc.properties.publishDate || doc.properties.Created
  doc.properties.update = doc.properties['Last Updated']
  delete doc.properties['Last Updated']
  delete doc.properties.Created
  delete doc.properties.publishDate
  delete doc.properties.Name
  delete doc.properties.urlname
  doc.body = matterMarkdownAdapter(doc);
  return doc;
};


module.exports = {
  format
};

Elog错误日志

下载成功  https://images.unsplash.com/photo-1683114010575-3ead4403180e?ixlib=rb-4.0.3&q=85&fm=jpg&crop=e
          ntropy&cs=srgb
请求失败  {"message":"Invalid request.\n\n\"sha\" wasn't supplied.","documentation_url":"https://docs.gi
          thub.com/rest/repos/contents#create-or-update-file-contents"}
上传失败:00a39c743f39d5bb828f0f7bd5e20a1e.jpg 请检查图床配置

附加信息

语雀账号密码模式手写frontMatter同步异常

你当前使用的Elog版本

0.12.4

Elog配置文件

module.exports = {
  write: {
    platform: 'yuque-pwd',
    // Token 模式(需要语雀超级会员)
    yuque: {
      token: process.env.YUQUE_TOKEN,
      login: process.env.YUQUE_LOGIN,
      repo: process.env.YUQUE_REPO,
      onlyPublic: true,
      onlyPublished: true,
    },
    // 账号密码模式
    "yuque-pwd": {
      username: process.env.YUQUE_USERNAME,
      password: process.env.YUQUE_PASSWORD,
      login: process.env.YUQUE_LOGIN,
      repo: process.env.YUQUE_REPO,
    }
  },
  deploy: {
    platform: 'local',
    local: {
      outputDir: './docs/',
      filename: 'title',
      format: 'markdown',
      catalog: true,
      formatExt: './elog.format.js',
      frontMatter: {
        enable: true,
        include: [], // 只输出include包含的属性
        exclude: [], // 不输出exclude包含的属性
      }
    }
  },
  image: {
    enable: true,
    platform: 'local',
    local: {
      outputDir: './docs/images',
      pathFollowDoc: true,
    }
  }
}

发生了什么?

使用语雀账号密码模式同步frontMatter出现问题,

Elog错误日志

front-matter解析失败,将返回预定义属性incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line at line 1, column 40:
                                            ... Blogging with Elog<br />classify: 关于Elog<br />description:xxx ...
预定义属性:https://elog.1874.cool/notion/raqyleng501h23p1#预定义属性

附加信息

No response

是否考虑一下发布文章撤销的功能

你当前使用的Elog版本

0.13.2

描述一下此特性

目前使用FlowUs+Hexo+Vercel进行部署,在FlowUs中我将文章状态从已发布改成进行中之后,重新sync,发现文章并没有被删除。
write部分配置如下:

  write: {
    platform: 'flowus',
    flowus: {
      tablePageId: process.env.FLOWUS_TABLE_PAGE_ID,
      filter: { property: 'status', value: '已发布' }
    }
  },

附加信息

No response

图床功能和hexo及windows平台的兼容性

你当前使用的Elog版本

0.13.2

Elog配置文件

module.exports = {
  write: {
    platform: 'yuque-pwd',
    yuque: {
      token: process.env.YUQUE_TOKEN,
      login: process.env.YUQUE_LOGIN,
      repo: process.env.YUQUE_REPO,
      onlyPublic: false,
      onlyPublished: true,
    },
    'yuque-pwd': {
      username: process.env.YUQUE_USERNAME,
      password: process.env.YUQUE_PASSWORD,
      login: process.env.YUQUE_LOGIN,
      repo: process.env.YUQUE_REPO,
      onlyPublic: false,
      onlyPublished: true,
    },
    notion: {
      token: process.env.NOTION_TOKEN,
      databaseId: process.env.NOTION_DATABASE_ID,
      filter: false, // {property: 'status', select: {equals: '已发布'}}
    },
    feishu: {
      type: 'space',
      wikiId: process.env.FEISHU_WIKI_ID,
      folderToken: process.env.FEISHU_FOLDER_TOKEN,
      appId: process.env.FEISHU_APP_ID,
      appSecret: process.env.FEISHU_APP_SECRET,
    },
    flowus: {
      tablePageId: process.env.FLOWUS_TABLE_PAGE_ID,
      filter: false, // {property: 'status',value: '已发布'}
    }
  },
  deploy: {
    platform: 'local',
    local: {
      outputDir: './source/_posts/elogs',
      filename: 'title',
      format: 'markdown',
      frontMatter: {
        enable: true,
        include: [], // 只输出include包含的属性
        exclude: [], // 不输出exclude包含的属性
      },
      catalog: true,
    },
    halo: {
      endpoint: process.env.HALO_ENDPOINT,
      token: process.env.HALO_TOKEN,
      policyName: process.env.HALO_POLICY_NAME,
      rowType: 'html',
      needUploadImage: true,
    },
    confluence: {
      user: process.env.CONFLUENCE_USER,
      password: process.env.WORDPRESS_PASSWORD,
      endpoint: process.env.WORDPRESS_ENDPOINT,
      spaceKey: process.env.CONFLUENCE_SPACE_KEY,
      rootPageId: process.env.CONFLUENCE_ROOT_PAGE_ID, // 可选
    },
    wordpress: {
      username: process.env.WORDPRESS_USERNAME,
      password: process.env.WORDPRESS_PASSWORD,
      endpoint: process.env.WORDPRESS_ENDPOINT,
    }
  },
  image: {
    enable: true,
    platform: 'local',
    local: {
      outputDir: './source/images/elogs',
      prefixKey: '/source/images/elogs',
      pathFollowDoc: true,
    },
    oss: {
      secretId: process.env.OSS_SECRET_ID,
      secretKey: process.env.OSS_SECRET_KEY,
      bucket: process.env.OSS_BUCKET,
      region: process.env.OSS_REGION,
      host: process.env.OSS_HOST,
      prefixKey: '',
    },
    cos: {
      secretId: process.env.COS_SECRET_ID,
      secretKey: process.env.COS_SECRET_KEY,
      bucket: process.env.COS_BUCKET,
      region: process.env.COS_REGION,
      host: process.env.COS_HOST,
      prefixKey: '',
    },
    qiniu: {
      secretId: process.env.QINIU_SECRET_ID,
      secretKey: process.env.QINIU_SECRET_KEY,
      bucket: process.env.QINIU_BUCKET,
      region: process.env.QINIU_REGION,
      host: process.env.QINIU_HOST,
      prefixKey: '',
    },
    upyun: {
      user: process.env.UPYUN_USER,
      password: process.env.UPYUN_PASSWORD,
      bucket: process.env.UPYUN_BUCKET,
      host: process.env.UPYUN_HOST,
      prefixKey: '',
    },
    github: {
      token: process.env.GITHUB_TOKEN,
      user: process.env.ELOG_GITHUB_USER,
      repo: process.env.ELOG_GITHUB_REPO,
      prefixKey: '',
    }
  }
}

发生了什么?

在windows下使用本地图床(其他target没有测试过)的时候,发现blog的content中图片的格式如下:
image
这会导致hexo在解析的时候使用urlencode转换图片的uri,导致图片无法正确访问
image
而将图片地址改为unix格式以后,hexo可以正常渲染

Elog错误日志

No response

附加信息

No response

点赞

通过阮一峰博客看到作者的项目,我在使用语雀的时候也有类似的想法,借助一个成熟的软件实现跨平台数据同步,不过目前只做了语雀的导出。语雀的token权限从一开始的普通用户到专业会员用户再到现在的超级会员才有,虽然我也是深度使用者但觉得他格局越来越小了。
所以我自己开发了一个无需token的导出工具,看作者要不要考虑一下我的思路,同时采用语雀自己的导出操作可以很好的解决#6 这个问题。

https://github.com/vannvan/yuque-tools

点赞

文档写得真好,加油加油

捐赠渠道

你当前使用的Elog版本

描述一下此特性

附加信息

感谢作者更新,请问有捐赠渠道吗,想请一杯奶茶。虽然还没开始使用,但真觉得是宝藏项目。

删除文章

你当前使用的Elog版本

最新

描述一下此特性

在notion中删除文章,下一次构建时也能删除网站里的文章。

附加信息

No response

[特性]求支持同步源文件检查

目前我的博客部署环境在K8s中,容器启动时会自动从git下载hexo博客源码,然后使用elog同步语雀文档,然后执行hexo生成内容并部署网站。由于语雀webhook的缺失,导致整个流程的触发是缺失的。因此有以下一个想法:
启动一个后台进程,定时的去使用类似elog check的功能,对比缓存文件检查文档是否有更新,如果有,则重新部署容器完成博客的重新部署。这样,整个环境的搭建和运行就只有K8s和语雀服务,架构上更简洁。

求评估下这个elog check的特性是否可以支持?

同步flowus报错

你当前使用的Elog版本

0.13.0

Elog配置文件

module.exports = {
    write: {
        platform: 'flowus',
        yuque: {
            token: process.env.YUQUE_TOKEN,
            login: process.env.YUQUE_LOGIN,
            repo: process.env.YUQUE_REPO,
            onlyPublic: false,
            onlyPublished: true,
        },
        'yuque-pwd': {
            username: process.env.YUQUE_USERNAME,
            password: process.env.YUQUE_PASSWORD,
            login: process.env.YUQUE_LOGIN,
            repo: process.env.YUQUE_REPO,
            onlyPublic: false,
            onlyPublished: true,
        },
        notion: {
            token: process.env.NOTION_TOKEN,
            databaseId: process.env.NOTION_DATABASE_ID,
            filter: false, // {property: 'status', select: {equals: '已发布'}}
            catalog: true,
        },
        feishu: {
            type: 'space',
            wikiId: process.env.FEISHU_WIKI_ID,
            folderToken: process.env.FEISHU_FOLDER_TOKEN,
            appId: process.env.FEISHU_APP_ID,
            appSecret: process.env.FEISHU_APP_SECRET,
        },
        flowus: {
            // tablePageId: process.env.FLOWUS_TABLE_PAGE_ID,
            // 用此id报错,用其他账号的tablePageId是可以的
            tablePageId: '43928f20-296b-4db9-b7bb-af11fbb27e85',
            filter: {property: 'status', value: '已发布'},
            catalog: true,
        }
    },
    deploy: {
        platform: 'local',
        local: {
            outputDir: './docs/mds',
            // filename: 'urlname',
            filename: 'title',
            format: 'markdown',
            catalog: true,
            frontMatter: {
                enable: true,
                exclude: ['cover'] // 文档属性排除 cover 字段
            }
        },
        halo: {
            endpoint: process.env.HALO_ENDPOINT,
            token: process.env.HALO_TOKEN,
            policyName: process.env.HALO_POLICY_NAME,
            rowType: 'html',
            needUploadImage: true,
        },
        confluence: {
            user: process.env.CONFLUENCE_USER,
            password: process.env.WORDPRESS_PASSWORD,
            endpoint: process.env.WORDPRESS_ENDPOINT,
            spaceKey: process.env.CONFLUENCE_SPACE_KEY,
            rootPageId: process.env.CONFLUENCE_ROOT_PAGE_ID, // 可选
        },
        wordpress: {
            username: process.env.WORDPRESS_USERNAME,
            password: process.env.WORDPRESS_PASSWORD,
            endpoint: process.env.WORDPRESS_ENDPOINT,
        }
    },
    image: {
        enable: true,
        platform: 'local',
        local: {
            outputDir: './docs/public/images',
            prefixKey: '/images',
            pathFollowDoc: false,
        },
        oss: {
            secretId: process.env.OSS_SECRET_ID,
            secretKey: process.env.OSS_SECRET_KEY,
            bucket: process.env.OSS_BUCKET,
            region: process.env.OSS_REGION,
            host: process.env.OSS_HOST,
            prefixKey: '',
        },
        cos: {
            secretId: process.env.COS_SECRET_ID,
            secretKey: process.env.COS_SECRET_KEY,
            bucket: process.env.COS_BUCKET,
            region: process.env.COS_REGION,
            host: process.env.COS_HOST,
            prefixKey: '',
        },
        qiniu: {
            secretId: process.env.QINIU_SECRET_ID,
            secretKey: process.env.QINIU_SECRET_KEY,
            bucket: process.env.QINIU_BUCKET,
            region: process.env.QINIU_REGION,
            host: process.env.QINIU_HOST,
            prefixKey: '',
        },
        upyun: {
            user: process.env.UPYUN_USER,
            password: process.env.UPYUN_PASSWORD,
            bucket: process.env.UPYUN_BUCKET,
            host: process.env.UPYUN_HOST,
            prefixKey: '',
        },
        github: {
            user: process.env.GITHUB_USER,
            token: process.env.GITHUB_TOKEN,
            repo: process.env.GITHUB_REPO,
            prefixKey: '',
        }
    }
}

发生了什么?

image

Elog错误日志

No response

附加信息

No response

语雀导出文档数量统计错误

你当前使用的Elog版本

0.12.4

Elog配置文件

No response

发生了什么?

image 如图所示,elog统计出来的文档数量和语雀知识库中的实际数量不一致。 我起初怀疑是yuque的设定的文档导出上限,但是在语雀找了一圈确实没有上限设置。麻烦作者看下这个问题吧 image

Elog错误日志

No response

附加信息

No response

建议:提供开箱即用的部署支持,将会吸引更多新用户尝试【已提供开箱配置,详情见 readme 开箱配置示例】

虽然通过一些配置可做到 Notion编辑->自动拉取->自动更新,但是这个配置的过程依然会耗费一些时间,以及有一定的学习门槛。这阻止了很多想先浅尝一下的用户。

可以参考NotionNext的配置方式:直接 github fork 模版仓库->连接到一个新的 Vercel,配置一下id到环境变量即可直接使用。只需点两三下按钮,非常快速且方便。

期待更多的template

你当前使用的Elog版本

0.14.0

描述一下此特性

RT,期待更多模板。
本人期望的工作流是 语雀 + hexo,模板是语雀 +vitepress。
本来仿照一个已经成熟的配置:https://github.com/lidelong-0201/next-yuque-elog ,但是无奈尝试后也没有成功。

感觉配置还是稍显复杂和绕
模板丰富后可能有利于后续推广。

附加信息

此外,本人不是前端工作者,有可能是知识欠缺导致。
如果作者没有兴趣开发 语雀 + hexo 的模板,请随意关闭此issue

测试 Issues

你当前使用的Elog版本

0.13.0-beta.4

Elog配置文件

module.exports = {
  write: {
    platform: 'notion',
    notion: {
      token: process.env.NOTION_TOKEN,
      databaseId: process.env.NOTION_DATABASE_ID,
      filter: { property: 'status', select: { equals: '已发布' }}
    }
  },
  deploy: {
    platform: 'local',
    local: {
      outputDir: './source/_posts',
      filename: 'title',
      format: 'markdown',
      catalog: false,
      frontMatter: {
        enable: true,
        include: ['categories', 'tags', 'title', 'date', 'updated', 'permalink', 'cover', 'description'],
      },
      formatExt: './format-image.js',
    }
  },
  image: {
    enable: true,
    platform: 'local',
    local: {
      outputDir: './source/images',
      prefixKey: '/images'
    }
  },
}

发生了什么?

测试

Elog错误日志

测试

附加信息

测试

【bug】飞书导出内容不完整

之前就一直催飞书的产品尽快出导出md的功能,没想到看见这个项目。但似乎有一些小问题。
我的飞书内容是:
image
导出是:
image
这里只是简单说了一个地方好些导出内容都不太完整。
image
像这个就完全没导出来
image
不知道是不是自己操作的问题

建议: 增加快速列出文章发布状态的命令

我并不想发布草稿, 但语雀又没有明确的提示哪些文章已发布或未发布, 所以需要一个方式来快速查看文章状态

也许可以通过一个命令将文章状态输出; 也许可以在语雀文章标题上加一个前缀表示文章状态;

Elog最佳实践征集

最佳实践征集,以下条件 3 选 2 即可,正常的我会手动添加到 README,你也可以手动 PR 来添加

  • 公开的配置 Elog 的 Github 仓库地址
  • 个人网站地址
  • 使用/配置 Elog的实践文章

关于语雀与halo同步时封面图片链接未被替换的问题

你当前使用的Elog版本

0.14.0

Elog配置文件

发生了什么?

语雀的文档可以设置封面图片
image
image
在同步到halo平台的时候,封面图片仍然是语雀的连接
image
这导致图片不显示。

Elog错误日志

No response

附加信息

No response

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.