GithubHelp home page GithubHelp logo

remarkjs / remark-github Goto Github PK

View Code? Open in Web Editor NEW
164.0 9.0 21.0 344 KB

remark plugin to link references to commits, issues, pull-requests, and users, like on GitHub

Home Page: https://remark.js.org

License: MIT License

JavaScript 100.00%
remark remark-plugin github gfm markdown

remark-github's Introduction

remark-github

Build Coverage Downloads Size Sponsors Backers Chat

remark plugin to link references to commits, issues, and users, in the same way that GitHub does in comments, issues, PRs, and releases (see Writing on GitHub).

Contents

What is this?

This package is a unified (remark) plugin to link references to commits, issues, and users: @wooorm -> [**@wooorm**](https://github.com/wooorm).

When should I use this?

This project is useful if you want to emulate how markdown would work in GitHub comments, issues, PRs, or releases, but it’s actually displayed somewhere else (on a website, or in other places on GitHub which don’t link references, such as markdown in a repo or Gist). This plugin does not support other platforms such as GitLab or Bitbucket and their custom features.

A different plugin, remark-gfm, adds support for GFM (GitHub Flavored Markdown). GFM is a set of extensions (autolink literals, footnotes, strikethrough, tables, and tasklists) to markdown that are supported everywhere on GitHub.

Another plugin, remark-breaks, turns soft line endings (enters) into hard breaks (<br>s). GitHub does this in a few places (comments, issues, PRs, and releases), but it’s not semantic according to HTML and not compliant to markdown.

Yet another plugin, remark-frontmatter, adds support for YAML frontmatter. GitHub supports frontmatter for files in Gists and repos.

Install

This package is ESM only. In Node.js (version 16+), install with npm:

npm install remark-github

In Deno with esm.sh:

import remarkGithub, {defaultBuildUrl} from 'https://esm.sh/remark-github@12'

In browsers with esm.sh:

<script type="module">
  import remarkGithub, {defaultBuildUrl} from 'https://esm.sh/remark-github@12?bundle'
</script>

Use

Say we have the following file example.md:

Some references:

*   Commit: f8083175fe890cbf14f41d0a06e7aa35d4989587
*   Commit (fork): foo@f8083175fe890cbf14f41d0a06e7aa35d4989587
*   Commit (repo): remarkjs/remark@e1aa9f6c02de18b9459b7d269712bcb50183ce89
*   Issue or PR (`#`): #1
*   Issue or PR (`GH-`): GH-1
*   Issue or PR (fork): foo#1
*   Issue or PR (project): remarkjs/remark#1
*   Mention: @wooorm

Some links:

*   Commit: <https://github.com/remarkjs/remark/commit/e1aa9f6c02de18b9459b7d269712bcb50183ce89>
*   Commit comment: <https://github.com/remarkjs/remark/commit/ac63bc3abacf14cf08ca5e2d8f1f8e88a7b9015c#commitcomment-16372693>
*   Issue or PR: <https://github.com/remarkjs/remark/issues/182>
*   Issue or PR comment: <https://github.com/remarkjs/remark-github/issues/3#issue-151160339>
*   Mention: <https://github.com/ben-eb>

…and a module example.js:

import {remark} from 'remark'
import remarkGfm from 'remark-gfm'
import remarkGithub from 'remark-github'
import {read} from 'to-vfile'

const file = await remark()
  .use(remarkGfm)
  .use(remarkGithub)
  .process(await read('example.md'))

console.log(String(file))

…then running node example.js yields:

Some references:

* Commit: [`f808317`](https://github.com/remarkjs/remark-github/commit/f8083175fe890cbf14f41d0a06e7aa35d4989587)
* Commit (fork): [foo@`f808317`](https://github.com/foo/remark-github/commit/f8083175fe890cbf14f41d0a06e7aa35d4989587)
* Commit (repo): [remarkjs/remark@`e1aa9f6`](https://github.com/remarkjs/remark/commit/e1aa9f6c02de18b9459b7d269712bcb50183ce89)
* Issue or PR (`#`): [#1](https://github.com/remarkjs/remark-github/issues/1)
* Issue or PR (`GH-`): [GH-1](https://github.com/remarkjs/remark-github/issues/1)
* Issue or PR (fork): [foo#1](https://github.com/foo/remark-github/issues/1)
* Issue or PR (project): [remarkjs/remark#1](https://github.com/remarkjs/remark/issues/1)
* Mention: [**@wooorm**](https://github.com/wooorm)

Some links:

* Commit: [remarkjs/remark@`e1aa9f6`](https://github.com/remarkjs/remark/commit/e1aa9f6c02de18b9459b7d269712bcb50183ce89)
* Commit comment: [remarkjs/remark@`ac63bc3` (comment)](https://github.com/remarkjs/remark/commit/ac63bc3abacf14cf08ca5e2d8f1f8e88a7b9015c#commitcomment-16372693)
* Issue or PR: [remarkjs/remark#182](https://github.com/remarkjs/remark/issues/182)
* Issue or PR comment: [#3 (comment)](https://github.com/remarkjs/remark-github/issues/3#issue-151160339)
* Mention: <https://github.com/ben-eb>

API

This package exports the identifier defaultBuildUrl. The default export is remarkGithub.

defaultBuildUrl(values)

Create a URL to GH.

Parameters
Returns

URL to use (string).

unified().use(remarkGithub[, options])

Link references to users, commits, and issues, in the same way that GitHub does in comments, issues, PRs, and releases.

Parameters
  • options (Options, optional) — configuration
Returns

Transform (Transformer).

BuildUrl

Create a URL (TypeScript type).

Parameters
Returns

URL to use or false to not link (string | false).

BuildUrlCommitValues

Info for commit hash (TypeScript type).

Fields
  • hash (string) — commit hash value
  • project (string) — project name
  • type ('commit') — kind
  • user (string) — owner of repo

BuildUrlCompareValues

Info for commit hash ranges (TypeScript type).

Fields
  • base (string) — SHA of the range start
  • compare (string) — SHA of the range end
  • project (string) — project name
  • type ('compare') — kind
  • user (string) — owner of repo

BuildUrlIssueValues

Info for issues (TypeScript type).

Fields
  • no (string) — issue number
  • project (string) — project name
  • type ('issue') — kind
  • user (string) — owner of repo

BuildUrlMentionValues

Info for mentions (TypeScript type).

Fields
  • type ('mention') — kind
  • user (string) — user name

BuildUrlValues

Info (TypeScript type).

Type
type BuildUrlValues =
  | BuildUrlCommitValues
  | BuildUrlCompareValues
  | BuildUrlIssueValues
  | BuildUrlMentionValues

Options

Configuration (TypeScript type).

Fields
  • buildUrl (BuildUrl, default: defaultBuildUrl) — change how things are linked
  • mentionStrong (boolean, default: true) — wrap mentions in strong; this makes them render more like how GitHub styles them, but GH itself uses CSS instead of strong
  • repository (string, default: repository from packag.json in CWD in Node, otherwise required) — repository to link against; should point to a GitHub repository (such as 'user/project')

Examples

Example: buildUrl

A buildUrl can be passed to not link mentions. For example, by changing example.js from before like so:

@@ -1,11 +1,15 @@
 import {remark} from 'remark'
 import remarkGfm from 'remark-gfm'
-import remarkGithub from 'remark-github'
+import remarkGithub, {defaultBuildUrl} from 'remark-github'
 import {read} from 'to-vfile'

 const file = await remark()
   .use(remarkGfm)
-  .use(remarkGithub)
+  .use(remarkGithub, {
+    buildUrl(values) {
+      return values.type === 'mention' ? false : defaultBuildUrl(values)
+    }
+  })
   .process(await read('example.md'))

 console.log(String(file))

To instead point mentions to a different place, change example.js like so:

@@ -1,11 +1,17 @@
 import {remark} from 'remark'
 import remarkGfm from 'remark-gfm'
-import remarkGithub from 'remark-github'
+import remarkGithub, {defaultBuildUrl} from 'remark-github'
 import {read} from 'to-vfile'

 const file = await remark()
   .use(remarkGfm)
-  .use(remarkGithub)
+  .use(remarkGithub, {
+    buildUrl(values) {
+      return values.type === 'mention'
+        ? `https://yourwebsite.com/${values.user}/`
+        : defaultBuildUrl(values)
+    }
+  })
   .process(await read('example.md'))

 console.log(String(file))

Syntax

The following references are supported:

Autolinks to these references are also transformed: https://github.com/wooorm -> [**@wooorm**](https://github.com/wooorm)

Types

This package is fully typed with TypeScript. It exports the additional types BuildUrl, BuildUrlCommitValues, BuildUrlCompareValues, BuildUrlIssueValues, BuildUrlMentionValues, BuildUrlValues, DefaultBuildUrl, Options.

Compatibility

Projects maintained by the unified collective are compatible with maintained versions of Node.js.

When we cut a new major release, we drop support for unmaintained versions of Node. This means we try to keep the current release line, remark-github@^12, compatible with Node.js 16.

This plugin works with unified version 6+ and remark version 7+.

Security

Use of remark-github does not involve rehype (hast). It does inject links based on user content, but those links only go to GitHub. There are no openings for cross-site scripting (XSS) attacks.

Related

  • remark-gfm — support GFM (autolink literals, footnotes, strikethrough, tables, tasklists)
  • remark-breaks — support breaks without needing spaces or escapes (enters to <br>)
  • remark-frontmatter — support frontmatter (YAML, TOML, and more)

Contribute

See contributing.md in remarkjs/.github for ways to get started. See support.md for ways to get help.

This project has a code of conduct. By interacting with this repository, organization, or community you agree to abide by its terms.

License

MIT © Titus Wormer

remark-github's People

Contributors

4cm4k1 avatar brumm avatar evhaus avatar greenkeeperio-bot avatar paescuj avatar remcohaszing avatar viceice avatar vweevers avatar wooorm avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

remark-github's Issues

Support repositories including dots

What

It seems that remark-github ignores repositories including dots in their name such as wooorm/wooorm.github.io.

Example

When input is (markdown):

https://github.com/wooorm/wooorm.github.io/commit/c01f

expected output is (html):

<a href="https://github.com/wooorm/wooorm.github.io/commit/c01f">
  wooorm/wooorm.github.io@<code>c01f</code>
</a>

but actual output is (html):

<a href="https://github.com/wooorm/wooorm.github.io/commit/c01f">
  https://github.com/wooorm/wooorm.github.io/commit/c01f
</a>

Why

Because GitHub do so: wooorm/wooorm.github.io@c01f

Regex is incorrect (does not accurately parse GitHub usernames)

I get the following error with the following package.json "repository" field:

CHANGELOG.md
  1:1  error  Error: Missing `repository` field in `options`
    at Function.github (/Users/user/Projects/color-convert/node_modules/remark-github/lib/index.js:76:11)

Repository value: https://github.com/Qix-/color-convert

I believe the trailing - on the username is causing it to fail.

Add option to customize generated <a> tags

Subject of the feature

The ability to customize the generated tags w/ options such as...

{target: '_blank', ref: 'external'}

Problem

The primary use case is to define target="_blank" to open links in a new tab.

Expected behavior

Whatever valid options are defined are added to the generated anchor tags.

Alternatives

There is remark-external-links but unfortunately that only gets applied against the source markdown. These links exist only in their generated html and so it cannot be applied to them.

Resolving `package.json` should rely on the vfile cwd, not process

Initial checklist

Affected packages and versions

11.2.3

Link to runnable example

No response

Steps to reproduce

It is kind of annoying to reproduce, but this is what causes remarkjs/vscode-remark#65 builds to fail on Windows. When VSCode is opened in Windows, it doesn’t send the desired cwd to the language server process, meaning process.cwd() doesn’t match file.cwd. The language server makes sure file.cwd is correct, and plugins are typically supposed to use that.

Expected behavior

remark-github uses file.cwd to lookup package.json, so an implementation can set a custom cwd when runningt the unified pipeline.

Actual behavior

remark-github uses process.cwd(), which is often the same as file.cwd but not always. This leads to unexpected behaviour.

Runtime

Node v16

Package manager

npm 8

OS

Linux

Build and bundle tools

Other (please specify in steps to reproduce)

[Feature Request] Support repo url.

Initial checklist

Problem

In README, plugin currently only support issues, commits, comments, users...

It looks like https://github.com/remarkjs/remark-github will not render to remarkjs/remark-github. Would like support it in the future? thx

Solution

https://github.com/remarkjs/remark-github -> remarkjs/remark-github

Alternatives

Write a custom remark plugin

Changes indentation within lists

I have this script:

#!/usr/bin/env node

const fs = require('fs');
const remark = require('remark');
const github = require('remark-github');

remark()
  .use(github, {
    repository: 'my/repo'
  })
  .process(fs.readFileSync('my-file.md', { encoding: 'utf8' }), function (err, file) {
    if (err) throw err;
    process.stdout.write(String(file));
  });

function throwError(message) {
  throw new Error(message);
}

This is the input:

- #123
- #456

This is the output:

-    [#123](https://github.com/my/repo/issues/123)
-    [#456](https://github.com/my/repo/issues/456)

It added spaces between the - and the issue reference. Is that a misconfiguration on my part or a bug?

remark-github treats '.YYYYMMDD' as a commit ID.

Subject of the issue

For example, 2.10.2.20200130 (a version number) is rendered as:

2.10.2.[2020013](https://github.com/remarkjs/remark-github/commit/20200130)

when it's expected to be rendered in verbatim. Also, note the omission of the trailing 0.

Your environment

  • OS: Linux
  • Packages: remark-github 9.0.0 (via gatsby-plugin-mdx)
  • Env: node 12.16.2, yarn 1.22.4, gatsby 2.20.29, gatsby-plugin-mdx 1.1.10

Steps to reproduce

Try to render 2.10.2.20200130 in an MDX file.

Expected behaviour

  • 2.10.2.20200130 should be rendered as it is.
  • The digits without a leading whitespace should not be treated as a commit ID.

Actual behaviour

2.10.2.20200130 is rendered incorrectly:

2.10.2.[2020013](https://github.com/remarkjs/remark-github/commit/20200130)

Noop if earlier plugin adds new nodes to tree

Subject of the issue

Because remark-github extends the remark Parser to do its work, it doesn't process nodes that were added by an earlier plugin (after parsing). For example:

remark()
  .use(require('remark-changelog'), { fix: true })
  .use(require('remark-github'))

Is there something that other plugins can do to get their new (text) nodes processed by the parser and thus remark-github?

Your environment

Do not add a `strong` node in mentions

Firstly, thanks for the module! 👍

I wonder if it would be possible to provide an option to turn off the bold formatting for things like @mentions? I think it's better to have this in CSS instead; just because GitHub make these bold it doesn't mean we have to! 😄

Mistakes email address for git commit and author

Subject of the issue

remark-github adds links to an email address that looks like a git commit and author.

Your environment

Steps to reproduce

test.md:

const vfile = require('to-vfile')
const remark = require('remark')
const github = require('remark-github')

remark()
  .use(github, { repository: 'https://github.com/test/test' })
  .process(vfile.readSync('test.md'), function (err, file) {
    if (err) throw err
    console.log(String(file))
  })

Expected output

example1 ([email protected])
example2 ([email protected])

Actual output

example1 ([`1234567`](https://github.com/test/test/commit/1234567)[**@example**](https://github.com/example).com)
example2 ([`abcdef0`](https://github.com/test/test/commit/abcdef0)[**@example**](https://github.com/example).com)

Note: doesn't happen when the email address is enclosed in <>. Is that the preferred solution, or should it be fixed in remark-github?

Add option to use disable @mentions linking

Initial checklist

Problem

In our content, people often use @mentions to mean Slack handles, not GitHub handles. Since the GitHub usernames are not verified by this plugin, it would result in a lot of false or invalid links. I would really like to use the plugin for the other functionality though.

Solution

Would love an option to disable @mention highlighting.

Alternatives

None that I can think of.

Change request: Make commit hash regex more strict

Initial checklist

Problem

When using remark-github, it will attempt to detect commit hashes and convert them to links as per this regex. The Regex basically states that any 7-40 character long hash-looking string on a new line is converted. This poses some problems for our users who paste lists of other numbers.

Consider the following markdown content:

Hey Steve. Can you please review these customer invoices?

1600100999
1600100960

At the moment, remark-github will truncate and convert those numbers to hash links like this:
Screen Shot 2022-02-01 at 2 21 45 PM

This is not desired behaviour as the numbers aren't actually commit hash links in GitHub in this context.

Solution

My idea was to make a small tweak to the Regex to require at least 1 alpha character to be in the string before considering it a hash (add [a-z]+ to the rule). This does mean that the library will sometimes have a false negative for cases where a hash actually only has numbers but I think it's much more likely that a typical Git hash will have at least 1 letter in it.

I recognize this is a messy/unsound solution, but I think the tradeoff between UX and soundness might be worth it here.

What do you think? Would you consider such a change?

Alternatives

The proper solution here would be to not rely on Regex alone, and instead do some kind of actual query to your GitHub repo to check the validity of hash strings before converting them to links, but that's well outside the scope of this library.

Tests are broken due to changes in `mdast-util-find-and-replace`

Initial checklist

Affected packages and versions

remark-github, [email protected]

Link to runnable example

No response

Steps to reproduce

The following will show tests are broken:

git clone [email protected]:remarkjs/remark-github.git
cd remark-github
npm install
npm test

This will fix them:

npm install [email protected]
npm test

Expected behavior

Tests work, just like they did before [email protected] was released

Actual behavior

Two fixture tests fail.

--- a/test/fixtures/reference-advanced/output.md
+++ b/test/fixtures/reference-advanced/output.md
@@ -1,4 +1,4 @@
-# User\@SHA
+# User\\@SHA
 
 Multiple slashes: foo/bar/baz@[`0000000`](https://github.com/wooorm/remark/commit/0000000), foo/bar/baz#1, @foo/bar/baz.
 
@@ -6,8 +6,8 @@ Dashes around slashes: [foobar-/baz@`0000000`](https://github.com/foobar-/baz/co
 
 Upper-case projects: [foobar/bAz@`0000000`](https://github.com/foobar/bAz/commit/0000000), [foobar/Baz#1](https://github.com/foobar/Baz/issues/1).
 
-[**@foo-/bar**](https://github.com/foo-/bar), @foo/-bar.
+@foo-/bar, @foo/-bar.
 
 [f/b#1](https://github.com/f/b/issues/1). f/b#0. [f/b@`0000000`](https://github.com/f/b/commit/0000000).
 
-.[#1](https://github.com/wooorm/remark/issues/1). .[**@0000000**](https://github.com/0000000). foo#. bar\@.
+.[#1](https://github.com/wooorm/remark/issues/1). .[**@0000000**](https://github.com/0000000). foo#. bar\\@.
diff --git a/test/fixtures/sha-range/output.md b/test/fixtures/sha-range/output.md
--- a/test/fixtures/sha-range/output.md
+++ b/test/fixtures/sha-range/output.md
@@ -1,6 +1,6 @@
 range comparison: [`e2acebc...2aa9311`](https://github.com/wooorm/remark/compare/e2acebc...2aa9311)
 
-actual unicode ellipsis: [`e2acebc`](https://github.com/wooorm/remark/commit/e2acebc)…2aa9311
+actual unicode ellipsis: e2acebc…2aa9311
 
 punctuation before: -e2acebc...[`2aa9311`](https://github.com/wooorm/remark/commit/2aa9311)
 
@@ -8,7 +8,7 @@ punctuation before: -e2acebc...[`2aa9311`](https://github.com/wooorm/remark/comm
 
 two: [`e2acebc`](https://github.com/wooorm/remark/commit/e2acebc)..[`2aa9311`](https://github.com/wooorm/remark/commit/2aa9311)
 
-one: [`e2acebc`](https://github.com/wooorm/remark/commit/e2acebc).2aa9311
+one: e2acebc.2aa9311
 
 fork? [other@`e2acebc`](https://github.com/other/remark/commit/e2acebc)...[`2aa9311`](https://github.com/wooorm/remark/commit/2aa9311)

Runtime

Node v16

Package manager

npm 8

OS

Linux

Build and bundle tools

No response

Support custom GitHub url

Subject of the feature

Hello! It would be nice to add a support for an Enterprise GitHub, by providing custom base URL.
If not provided, it could be read from package.json and default to https://github.com

The logic would be

  • if provided in options.baseUrl explicitly, use it
  • if provided full URL in options.repository, extract and use it
  • if provided full URL in package.json, extract and use it
  • if not provided default to https://github.com

Expected behaviour

var vfile = require('to-vfile')
var remark = require('remark')
var github = require('remark-github')

remark()
  .use(github, { baseUrl: 'https://whatever-entreprise-github.company' } )
  .process(vfile.readSync('example.md'), function(err, file) {
    if (err) throw err
    console.log(String(file))
  })

Alternatives

I see none.

Bug: If link # changes then the link does not update

For example, if you start off with:

#123

It becomes

[#123](https://github.com/wooorm/remark-github/issues/123)

However if you change the issue number it still has the same inaccurate link:

[#456](https://github.com/wooorm/remark-github/issues/123)

Missing or invalid `repository` field in `options`

Initial checklist

Affected packages and versions

latest

Link to runnable example

https://codesandbox.io/s/cool-swirles-vbp4nr?file=/src/index.js

Steps to reproduce

as above in codesandbox

Expected behavior

either the repository field is optional, in which case it should not error, or the docs and code samples should show that it is required

Actual behavior

image

Runtime

No response

Package manager

No response

OS

No response

Build and bundle tools

No response

Webpack support

env: with npm and webpack
I don't know what to do to solve the problem

WARNING in .//mdast-github/index.js
Critical dependencies:
368:19-370:14 the request of a dependency is an expression
@ ./
/mdast-github/index.js 368:19-370:14

WARNING in .//mdast-github/LICENSE
Module parse failed: /Users/user-mac/Desktop/workspace/test/www/node_modules/mdast-github/LICENSE Line 1: Unexpected identifier
You may need an appropriate loader to handle this file type.
| (The MIT License)
|
| Copyright (c) 2015 Titus Wormer [email protected]
@ ./
/mdast-github ^./.*$

WARNING in .//mdast-github/history.md
Module parse failed: /Users/user-mac/Desktop/workspace/test/www/node_modules/mdast-github/history.md Line 7: Unexpected number
You may need an appropriate loader to handle this file type.
|
|
| 1.0.0 / 2015-08-19
| ==================
|
@ ./
/mdast-github ^./.*$

WARNING in .//mdast-github/package.json
Module parse failed: /Users/user-mac/Desktop/workspace/test/www/node_modules/mdast-github/package.json Line 2: Unexpected token :
You may need an appropriate loader to handle this file type.
| {
| "_args": [
| [
| "mdast-github",
@ ./
/mdast-github ^./.*$

WARNING in .//mdast-github/readme.md
Module parse failed: /Users/user-mac/Desktop/workspace/test/www/node_modules/mdast-github/readme.md Line 1: Unexpected token ILLEGAL
You may need an appropriate loader to handle this file type.
| # mdast-github Build Status Coverage Status
|
| Auto-link references to commits, issues, pull-requests, and users like GitHub: Writing on GitHub.
@ ./
/mdast-github ^./.*$
webpack: bundle is now VALID.
webpack: bundle is now INVALID.
Hash: e08bf16a6fc25d471f1f
Version: webpack 1.12.9
Time: 346ms

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.