Code Monkey home page Code Monkey logo

markdown-it-emoji's Introduction

markdown-it

CI NPM version Coverage Status Gitter

Markdown parser done right. Fast and easy to extend.

Live demo

  • Follows the CommonMark spec + adds syntax extensions & sugar (URL autolinking, typographer).
  • Configurable syntax! You can add new rules and even replace existing ones.
  • High speed.
  • Safe by default.
  • Community-written plugins and other packages on npm.

Table of content

Install

node.js:

npm install markdown-it

browser (CDN):

Usage examples

See also:

Simple

// node.js
// can use `require('markdown-it')` for CJS
import markdownit from 'markdown-it'
const md = markdownit()
const result = md.render('# markdown-it rulezz!');

// browser with UMD build, added to "window" on script load
// Note, there is no dash in "markdownit".
const md = window.markdownit();
const result = md.render('# markdown-it rulezz!');

Single line rendering, without paragraph wrap:

import markdownit from 'markdown-it'
const md = markdownit()
const result = md.renderInline('__markdown-it__ rulezz!');

Init with presets and options

(*) presets define combinations of active rules and options. Can be "commonmark", "zero" or "default" (if skipped). See API docs for more details.

import markdownit from 'markdown-it'

// commonmark mode
const md = markdownit('commonmark')

// default mode
const md = markdownit()

// enable everything
const md = markdownit({
  html: true,
  linkify: true,
  typographer: true
})

// full options list (defaults)
const md = markdownit({
  // Enable HTML tags in source
  html:         false,

  // Use '/' to close single tags (<br />).
  // This is only for full CommonMark compatibility.
  xhtmlOut:     false,

  // Convert '\n' in paragraphs into <br>
  breaks:       false,

  // CSS language prefix for fenced blocks. Can be
  // useful for external highlighters.
  langPrefix:   'language-',

  // Autoconvert URL-like text to links
  linkify:      false,

  // Enable some language-neutral replacement + quotes beautification
  // For the full list of replacements, see https://github.com/markdown-it/markdown-it/blob/master/lib/rules_core/replacements.mjs
  typographer:  false,

  // Double + single quotes replacement pairs, when typographer enabled,
  // and smartquotes on. Could be either a String or an Array.
  //
  // For example, you can use '«»„“' for Russian, '„“‚‘' for German,
  // and ['«\xA0', '\xA0»', '‹\xA0', '\xA0›'] for French (including nbsp).
  quotes: '“”‘’',

  // Highlighter function. Should return escaped HTML,
  // or '' if the source string is not changed and should be escaped externally.
  // If result starts with <pre... internal wrapper is skipped.
  highlight: function (/*str, lang*/) { return ''; }
});

Plugins load

import markdownit from 'markdown-it'

const md = markdownit
  .use(plugin1)
  .use(plugin2, opts, ...)
  .use(plugin3);

Syntax highlighting

Apply syntax highlighting to fenced code blocks with the highlight option:

import markdownit from 'markdown-it'
import hljs from 'highlight.js' // https://highlightjs.org

// Actual default values
const md = markdownit({
  highlight: function (str, lang) {
    if (lang && hljs.getLanguage(lang)) {
      try {
        return hljs.highlight(str, { language: lang }).value;
      } catch (__) {}
    }

    return ''; // use external default escaping
  }
});

Or with full wrapper override (if you need assign class to <pre> or <code>):

import markdownit from 'markdown-it'
import hljs from 'highlight.js' // https://highlightjs.org

// Actual default values
const md = markdownit({
  highlight: function (str, lang) {
    if (lang && hljs.getLanguage(lang)) {
      try {
        return '<pre><code class="hljs">' +
               hljs.highlight(str, { language: lang, ignoreIllegals: true }).value +
               '</code></pre>';
      } catch (__) {}
    }

    return '<pre><code class="hljs">' + md.utils.escapeHtml(str) + '</code></pre>';
  }
});

Linkify

linkify: true uses linkify-it. To configure linkify-it, access the linkify instance through md.linkify:

md.linkify.set({ fuzzyEmail: false });  // disables converting email to link

API

API documentation

If you are going to write plugins, please take a look at Development info.

Syntax extensions

Embedded (enabled by default):

Via plugins:

Manage rules

By default all rules are enabled, but can be restricted by options. On plugin load all its rules are enabled automatically.

import markdownit from 'markdown-it'

// Activate/deactivate rules, with currying
const md = markdownit()
  .disable(['link', 'image'])
  .enable(['link'])
  .enable('image');

// Enable everything
const md = markdownit({
  html: true,
  linkify: true,
  typographer: true,
});

You can find all rules in sources:

Benchmark

Here is the result of readme parse at MB Pro Retina 2013 (2.4 GHz):

npm run benchmark-deps
benchmark/benchmark.mjs readme

Selected samples: (1 of 28)
 > README

Sample: README.md (7774 bytes)
 > commonmark-reference x 1,222 ops/sec ±0.96% (97 runs sampled)
 > current x 743 ops/sec ±0.84% (97 runs sampled)
 > current-commonmark x 1,568 ops/sec ±0.84% (98 runs sampled)
 > marked x 1,587 ops/sec ±4.31% (93 runs sampled)

Note. CommonMark version runs with simplified link normalizers for more "honest" compare. Difference is ≈1.5×.

As you can see, markdown-it doesn't pay with speed for its flexibility. Slowdown of "full" version caused by additional features not available in other implementations.

markdown-it for enterprise

Available as part of the Tidelift Subscription.

The maintainers of markdown-it and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. Learn more.

Authors

markdown-it is the result of the decision of the authors who contributed to 99% of the Remarkable code to move to a project with the same authorship but new leadership (Vitaly and Alex). It's not a fork.

References / Thanks

Big thanks to John MacFarlane for his work on the CommonMark spec and reference implementations. His work saved us a lot of time during this project's development.

Related Links:

Ports

markdown-it-emoji's People

Contributors

eric-burel avatar erikmichelson avatar kmonsoor avatar leonya avatar puzrin avatar rlidwka avatar samsaffron 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

markdown-it-emoji's Issues

Some emoji do not render

Thanks for this invaluable project 😁

The following emoji codes (supported by GitHub) are not replaced with emoji

🈷️ | u6708
🈶 | u6709
🈯 | u6307
🈹 | u5272
🈚 | u7121
🈲 | u7981
🈸 | u7533
🈴 | u5408
🈳 | u7a7a
🈺 | u55b6

Missing some Github emojis

Says in the README that the full set has all Github supported emojis, but I'm finding that some of then aren't included.

Missing emojis I encountered so far:
:monocle_face: -> 🧐
:ringed_planet: -> 🪐

Planing

Ideas:

  • replacements should be compatible with unicode chars,
  • don't use any embedded images impackage.
  • rendering:
    • unicodes by default
    • twitter emojis from maxcdn (type?, size?)
  • supported formats:
    • :emoji_name:
    • skype
    • (?) common aliases like :), :( and so on.
  • full emojis list is huge! what to suport by default?

References:

Typings / typescript support?

I'm unable to use this in typescript, while I am able to use 'markdown-it'. Is there any chance we'll get some typings for this, or at least a way to use this from the already typed markdown-it?

Version 3 overwrote the existing version 2.0.2?

I see there were recent changes in this repo that claim to bump it to version 3, which changes it's imports.

However, the most recent version on npmjs is 2.0.2

2.0.2 is also the version I've had installed on a project for awhile now. Recently I was installing from scratch and found the imports no longer worked. This would make sense if I had updated to v3, but I saw no change in the version that I had installed vs the version I've used in the past. (Both were 2.0.2)

I also see web archive has 2.0.2 as existing for awhile now. https://web.archive.org/web/20230321190606/https://www.npmjs.com/package/markdown-it-emoji

Anyways, for now I have rolled back to 2.0.1 to avoid this issue. (Alternatively another fix might be to fork the repo from prior to the recent changes)

How to add additional shortcuts?

Hi,

I'm trying to add additional shortcuts like so:

import markdownIt from 'markdown-it'
import { full as emoji } from 'markdown-it-emoji'
const md = markdownIt()
  .use(emoji, {
    shortcuts: {
        "fa-eye": [":fa-eye:"]
    }
  })

I'm trying to support font-awesome (now fork-awesome) support. Typing :fa-eye: should render the fork-awesome emoji for that. I know how to do that part (emoji rule overwrite to handle the fa-* emoji's) but i'm stuck at even defining additional shortcuts.

When debugging that shortcut that i'm adding is present in this code (full.mjs in this project):

export default function emoji_plugin (md, options) {
  const defaults = {
    defs: emojies_defs,
    shortcuts: emojies_shortcuts,
    enabled: []
  }

  const opts = md.utils.assign({}, defaults, options || {})

  bare_emoji_plugin(md, opts)
};

However, after the line:

const opts = md.utils.assign({}, defaults, options || {})

It's already reduced to just my shortcut. The default ones emojies_shortcuts get lost here.
Next, it's passed into the bare_emoji_plugin via bare_emoji_plugin(md, opts).

In the bare handling this line:

const opts = normalize_opts(md.utils.assign({}, defaults, options || {}))

Removes anything that was there, the resulting opts.shortcuts is now empty {}...

Am i doing something wrong here?

linkify + emoji fails

test case:

'use strict';

var assert = require('assert');

var md = require('markdown-it')({
  linkify: true
});

md.use(require('markdown-it-emoji'));

describe('Linkify', function () {
  it('should linkify URLs', function () {
    var html = md.render('https://github.com');
    assert.equal(html.trim(), '<p><a href="https://github.com">https://github.com</a></p>');
  });
});

result:

<p><a href=\"https://github.com\">https❓/github.com</a></p>

Extending list of emoji mappings instead of replacing

Is there an easy way to extend the list of emojies without having to feed in an entire new list? I'd like to supplement the light version with a small number of new items, but couldn't find an obvious way of doing that in the current API. Is there something I'm missing, and if not , would it be possible to add an 'extras' param to the available options?

Support glyphs icons

Hello,

How can I add some feature to your plugin to be able to use Fontawesome or Glyphicon Glyphs in the mardown syntax?

I've seen mardown-it-icon plugin which provide this ability (with some rewrite) but it's a fork of your plugin based on an old version, and the logic seems different...

Thanks in advance

npm install i markdown-it-emoji

Hey everyone

I would like to express my sincere gratitude for the extraordinary work you have done with this package. As a new user of this package, I really appreciate the feature it offers and the way it has simplified my development process.

I just have a question.

Is this the real command to install

npm install i markdown-it-emoji

or

npm install markdown-it-emoji

Do we need to install "i"?

Thank you.

Linkify + :x: in URL fails

Hello there,

First of al, thanks you very much for taking care of this library, it's very useful 😃

When rendering a Sharepoint URL such as: https://morningtrans.sharepoint.com/:x:/r/quality/Shared%20Documents/...?d=w119ebfd3d2ee4dea8d7f047b6db59315&csf=1&e=GZRLy

Mardown-it outputs:
https://morningtrans.sharepoint.com/ ❌/r/quality/Shared%20Documents/...?d=w119ebfd3d2ee4dea8d7f047b6db59315&csf=1&e=GZRLy

Therefore the URL is broken.

Window object

Differences in browser. If you load the script directly into the page without using a package system, the module will add itself globally with the name markdownitEmoji. Init code will look a bit different in this case:

var md = window.markdownit().use(window.markdownitEmoji);

Is it really necessary to specify window object here? Works fine without it:

var md = markdownit().use(window.markdownitEmoji);

Delete me: Emoji picker shows after list ends with colon

Please delete this issue. I have unfortunately created this bug ticket in the wrong repository.

Version:

  • Joplin: 3.0.14
  • Emoji: 1.0.4

Write the follwong text

1. Test:

i.e., a list. With the cusor at the end of the line, press Enter. Now the date picker is shown, even though it was never intended to write an emoji but continue writing the next list item.

Note that this does not happen outside a list, i.e., with the text

Test:

Doesn't convert unicode emoji chars

Hi

Does the library supports for converting Unicode emojis into custom emojis?

In here, we can see literal wink emoji has transformed but not the Unicode one. It would be very nice if both emojis would look like the same.
image

## 😉
## :wink:

can not parse properly with full chars enabled.

People

:bowtie:
😄
:simple_smile:
😆
😊
😃
☺️
😏
😍
😘
😚
😳
😌
😆
😁
😉
😜
😝
😀
😗
😙
😛
😴
😟
😦
😧
😮
😬
😕
😯
😑
😒
😅
😓
😥
😩
😔
😞
😖
😨
😰
😣
😢
😭
😂
😲
😱
:neckbeard:
😫
😠
😡
😤
😪
😋
😷
😎
😵
👿
😈
😐
😶
😇
👽
💛
💙
💜
❤️
💚
💔
💓
💗
💕
💞
💘
💖


🌟
💫
💥
💥
💢




💤
💨
💦
🎶
🎵
🔥
💩
💩
💩
👍
👍
👎
👎
👌
👊
👊

✌️
👋


👐
☝️
👇
👈
👉
🙌
🙏
👆
👏
💪
🤘
🖕
🏃
🏃
👫
👪
👬
👭
💃
👯
🙆‍♀️
🙅
💁
🙋
👰‍♀️
:person_with_pouting_face:
:person_frowning:
🙇
💏
💑
💆
💇
💅
👦
👧
👩
👨
👶
👵
👴
:person_with_blond_hair:
👲
👳‍♂️
👷
👮
👼
👸
😺
😸
😻
😽
😼
🙀
😿
😹
😾
👹
👺
🙈
🙉
🙊
💂‍♂️
💀
🐾
👄
💋
💧
👂
👀
👃
👅
💌
👤
👥
💬
💭
:feelsgood:
:finnadie:
:goberserk:
:godmode:
:hurtrealbad:
:rage1:
:rage2:
:rage3:
:rage4:
:suspect:
:trollface:
Nature

☀️

☁️
❄️


🌀
🌁
🌊
🐱
🐶
🐭
🐹
🐰
🐺
🐸
🐯
🐨
🐻
🐷
🐽
🐮
🐗
🐵
🐒
🐴
🐎
🐫
🐑
🐘
🐼
🐍
🐦
🐤
🐥
🐣
🐔
🐧
🐢
🐛
🐝
🐜
🪲
🐌
🐙
🐠
🐟
🐳
🐋
🐬
🐄
🐏
🐀
🐃
🐅
🐇
🐉
🐐
🐓
🐕
🐖
🐁
🐂
🐲
🐡
🐊
🐪
🐆
🐈
🐩
🐾
💐
🌸
🌷
🍀
🌹
🌻
🌺
🍁
🍃
🍂
🌿
🍄
🌵
🌴
🌲
🌳
🌰
🌱
🌼
🌾
🐚
🌐
🌞
🌝
🌚
🌑
🌒
🌓
🌔
🌕
🌖
🌗
🌘
🌜
🌛
🌙
🌍
🌎
🌏
🌋
🌌

:octocat:
:squirrel:
Objects

🎍
💝
🎎
🎒
🎓
🎏
🎆
🎇
🎐
🎑
🎃
👻
🎅
🎄
🎁
🔔
🔕
🎋
🎉
🎊
🎈
🔮
💿
📀
💾
📷
📹
🎥
💻
📺
📱
☎️
☎️
📞
📟
📠
💽
📼
🔉
🔈
🔇
📢
📣




📻
📡

🔍
🔎
🔓
🔒
🔏
🔐
🔑
💡
🔦
🔆
🔅
🔌
🔋
📲
📧
📫
📮
🛀
🛁
🚿
🚽
🔧
🔩
🔨
💺
💰
💴
💵
💷
💶
💳
💸
📧
📥
📤
✉️
📨
📯
📪
📬
📭
📦
🚪
🚬
💣
🔫
🔪
💊
💉
📄
📃
📑
📊
📈
📉
📜
📋
📆
📅
📇
📁
📂
✂️
📌
📎
✒️
✏️
📏
📐
📕
📗
📘
📙
📓
📔
📒
📚
🔖
📛
🔬
🔭
📰
🏈
🏀


🎾
🎱
🏉
🎳

🚵
🚴
🏇
🏂
🏊
🏄
🎿
♠️
♥️
♣️
♦️
💎
💍
🏆
🎼
🎹
🎻
👾
🎮
🃏
🎴
🎲
🎯
🀄
🎬
📝
📝
📖
🎨
🎤
🎧
🎺
🎷
🎸
👞
👡
👠
💄
👢
👕
👕
👔
👚
👗
🎽
👖
👘
👙
🎀
🎩
👑
👒
👞
🌂
💼
👜
👝
👛
👓
🎣

🍵
🍶
🍼
🍺
🍻
🍸
🍹
🍷
🍴
🍕
🍔
🍟
🍗
🍖
🍝
🍛
🍤
🍱
🍣
🍥
🍙
🍘
🍚
🍜
🍲
🍢
🍡
🥚
🍞
🍩
🍮
🍦
🍨
🍧
🎂
🍰
🍪
🍫
🍬
🍭
🍯
🍎
🍏
🍊
🍋
🍒
🍇
🍉
🍓
🍑
🍈
🍌
🍐
🍍
🍠
🍆
🍅
🌽
Places

🏠
🏡
🏫
🏢
🏣
🏥
🏦
🏪
🏩
🏨
💒

🏬
🏤
🌇
🌆
🏯
🏰

🏭
🗼
🗾
🗻
🌄
🌅
🌠
🗽
🌉
🎠
🌈
🎡

🎢
🚢
🚤


🚣

🚀
✈️
🚁
🚂
🚊
🚞
🚲
🚡
🚟
🚠
🚜
🚙
🚘
🚗
🚗
🚕
🚖
🚛
🚌
🚍
🚨
🚓
🚔
🚒
🚑
🚐
🚚
🚋
🚉
🚆
🚅
🚄
🚈
🚝
🚃
🚎
🎫

🚦
🚥
⚠️
🚧
🔰
🏧
🎰
🚏
💈
♨️
🏁
🎌
🏮
🗿
🎪
🎭
📍
🚩
🇯🇵
🇰🇷
🇨🇳
🇺🇸
🇫🇷
🇪🇸
🇮🇹
🇷🇺
🇬🇧
🇬🇧
🇩🇪
Symbols

1️⃣
2️⃣
3️⃣
4️⃣
5️⃣
6️⃣
7️⃣
8️⃣
9️⃣
🔟
🔢
0️⃣
#️⃣
🔣
◀️
⬇️
▶️
⬅️
🔠
🔡
🔤
↙️
↘️
➡️
⬆️
↖️
↗️


🔽
⤵️
⤴️
↩️
↪️
↔️
↕️
🔼
🔃
🔄


ℹ️
🆗
🔀
🔁
🔂
🆕
🔝
🆙
🆒
🆓
🆖
🎦
🈁
📶
🈹
🈴
🈺
🈯
🈷️
🈶
🈵
🈚
🈸
🈳
🈲
🈂️
🚻
🚹
🚺
🚼
🚭
🅿️

🚇
🛄
🉑
🚾
🚰
🚮
㊙️
㊗️
Ⓜ️
🛂
🛅
🛃
🉐
🆑
🆘
🆔
🚫
🔞
📵
🚯
🚱
🚳
🚷
🚸

✳️
❇️
✴️
💟
🆚
📳
📴
💹
💱













🔯

🅰️
🅱️
🆎
🅾️
💠
♻️
🔚
🔙
🔛
🔜
🕐
🕜
🕙
🕥
🕚
🕦
🕛
🕧
🕑
🕝
🕒
🕞
🕓
🕟
🕔
🕠
🕕
🕡
🕖
🕢
🕗
🕣
🕘
🕤
💲
©️
®️
™️


‼️
⁉️

✖️



💮
💯
✔️
☑️
🔘
🔗

〰️
〽️
🔱
▪️
▫️


◼️
◻️



🔲
🔳


🔴
🔵
🔷
🔶
🔹
🔸
🔺
🔻
:shipit:

Links Converted to Emoji

I'm having an issue with the following:

[https://api.sailthru.com](https://api.sailthru.com)

This gets converted to:

<a href="https://api.sailthru.com">https:😕/api.sailthru.com</a>

Disable shortcuts

Is there a way to get rid of all of the shortcuts in the browser build without having to edit the source code?

Gemoji lacks behind

Gemoji is rarely updated and still does not support Unicode 10.0, released in June 2017. github/gemoji#139
Consider to switch to Emojione or Emojidata instead. Twemoji and Noto Emoji do not provide an emoji.json with short codes, but there may be others that are kept up to date.

Support Skin Tone

Some emojis have skin tone variants. Slack, for instance, supports them like this:

:+1::skin-tone-2: 

Add variant without bundled definitions

Currently, one can choose between the "full" emoji-set by using index.js and the light emoji-set by using light.js.
In case of providing custom definitions, you might want to keep the bundle-size low by not importing the unused light.json or full.json data-sets.

I therefore propose the following:
Add a new file "bare.js" (or another name) that is similar to index.js or light.js but does not import the json data-sets.

No effect

code:

  <script type="text/javascript" src="./node_modules/markdown-it/dist/markdown-it.js"></script>
  <script type="text/javascript" src="./node_modules/markdown-it-emoji/dist/markdown-it-emoji.min.js"></script>


<script>
var md = window.markdownit({
			  html:         true,        // Enable HTML tags in source
			  xhtmlOut:     false,        // Use '/' to close single tags (<br />).
			                              // This is only for full CommonMark compatibility.
			  breaks:       false,        // Convert '\n' in paragraphs into <br>
			  langPrefix:   'language-',  // CSS language prefix for fenced blocks. Can be
			                              // useful for external highlighters.
			  linkify:      false,        // Autoconvert URL-like text to links
			
			  // Enable some language-neutral replacement + quotes beautification
			  typographer:  false,
			
			  // Double + single quotes replacement pairs, when typographer enabled,
			  // and smartquotes on. Could be either a String or an Array.
			  //
			  // For example, you can use '«»„“' for Russian, '„“‚‘' for German,
			  // and ['«\xA0', '\xA0»', '‹\xA0', '\xA0›'] for French (including nbsp).
			  quotes: '“”‘’',
			
			  // Highlighter function. Should return escaped HTML,
			  // or '' if the source string is not changed and should be escaped externaly.
			  // If result starts with <pre... internal wrapper is skipped.
			  highlight: function (/*str, lang*/) { return ''; }
			}).use(window.markdownitEmoji);

      md.renderer.rules.emoji = function(token, idx) {
        return '<span class="emoji emoji_' + token[idx].markup + '"></span>';
      };
</script>

The above code has no effect, why?

Need better isolation for shortcuts

Need netter algorythm to avoid conflicts between shortcuts and text

  • :/ conflicts with http://
  • should we completely disable emojies in links?
  • \w will not work with unicode

Ideas? Discuss.

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.