Code Monkey home page Code Monkey logo

tree-sitter-css's Introduction

tree-sitter

DOI discord matrix

Tree-sitter is a parser generator tool and an incremental parsing library. It can build a concrete syntax tree for a source file and efficiently update the syntax tree as the source file is edited. Tree-sitter aims to be:

  • General enough to parse any programming language
  • Fast enough to parse on every keystroke in a text editor
  • Robust enough to provide useful results even in the presence of syntax errors
  • Dependency-free so that the runtime library (which is written in pure C) can be embedded in any application

Links

tree-sitter-css's People

Contributors

amaanq avatar bennypowers avatar jcs090218 avatar maxbrunsfeld avatar msftenhanceprovenance avatar rtsao avatar shraymonks 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

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

tree-sitter-css's Issues

bug: Some selectors in `:has` are treated as plain values

Did you check existing issues?

  • I have read all the tree-sitter docs if it relates to using the parser
  • I have searched the existing issues of tree-sitter-css

Tree-Sitter CLI Version, if relevant (output of tree-sitter --version)

No response

Describe the bug

Only certain kinds of selectors fail to be parsed within a :hasclass_selector and id_selector when they have tag names.

Steps To Reproduce/Bad Parse Tree

This parses correctly:

div.myclass:has(li) {}
(stylesheet [0, 0] - [1, 0]
  (rule_set [0, 0] - [0, 22]
    (selectors [0, 0] - [0, 19]
      (pseudo_class_selector [0, 0] - [0, 19]
        (class_selector [0, 0] - [0, 11]
          (tag_name [0, 0] - [0, 3])
          (class_name [0, 4] - [0, 11]))
        (class_name [0, 12] - [0, 15])
        (arguments [0, 15] - [0, 19]
          (tag_name [0, 16] - [0, 18]))))
    (block [0, 20] - [0, 22])))

This does not:

div.myclass:has(li.foo) {}
(stylesheet [0, 0] - [0, 30]
  (rule_set [0, 0] - [0, 30]
    (selectors [0, 0] - [0, 27]
      (pseudo_class_selector [0, 0] - [0, 27]
        (class_selector [0, 0] - [0, 11]
          (tag_name [0, 0] - [0, 3])
          (class_name [0, 4] - [0, 11]))
        (class_name [0, 12] - [0, 15])
        (arguments [0, 15] - [0, 27]
          (plain_value [0, 16] - [0, 26]))))
    (block [0, 28] - [0, 30])))

Here are some other examples that parse exactly as expected:

div.myclass:has(#foo) {}
div.myclass:has(.bar) {}
div.myclass:has(foo[bar]) {}
div.myclass:has(li ~ p) {}
div.myclass:has(li p) {}
div.myclass:has(p li.foo) {} /* (weirdly enough) */

And here are some which are interpreted as plain_value:

div.myclass:has(li#foo) {}
div.myclass:has(li.foo) {}
div.myclass:has(li.foo p) {}
div.myclass:has(p.bar li.foo) {}

Expected Behavior/Parse Tree

In each of these cases, the plain_value should instead be a selectors node. :has can accept selectors of arbitrary complexity, much like :not.

Repro

No response

Spacing between property name & colon is considered an error.

Tree sitter considers below code error, due to spacing between property name & colon.

* {
    margin      : 0;
    padding     : 0;
    box-sizing  : border-box;
}

This isn't cosidered as error.

* {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}

This makes whole file have red error line, which is annoying.


Neovim 0.5. Latest tree sitter.

`a:hover` breaks syntax highlighting when nested inside a media query

Here's the piece of the code that exhibits the issue

@media screen {
  a:visited {
    color: var(--fg-link-visited);
  }

  a:hover {
    text-decoration: underline;
    text-underline-offset: var(--space-5xs);
  }

  a:active {
    color: var(--fg-link-visited);
  }
}

code,
pre,
kbd,
samp,
var {
  font-family: var(--mono-font);
}

Here's the video that showcases the issue

recording_new.mp4

::slotted pseudo-element not recognized

The ::slotted(element) selector does not parse up properly.

::slotted(button) {}

actual:

(stylesheet
  (rule_set
    (selectors
      (pseudo_element_selector
        (tag_name)))
    (ERROR
      (UNEXPECTED 'u')
      (to)
      (UNEXPECTED '))
    (block)))

expected (initial draft)

(stylesheet
  (rule_set
    (selectors
      (pseudo_element_selector
        (tag_name)
        (arguments (tag_name)))

compare with csstree:
Screen Shot 2022-07-11 at 20 24 48

derived csstree json
{
  "type": "StyleSheet",
  "loc": {
    "source": "<unknown>",
    "start": {
      "offset": 0,
      "line": 1,
      "column": 1
    },
    "end": {
      "offset": 20,
      "line": 1,
      "column": 21
    }
  },
  "children": [
    {
      "type": "Rule",
      "loc": {
        "source": "<unknown>",
        "start": {
          "offset": 0,
          "line": 1,
          "column": 1
        },
        "end": {
          "offset": 20,
          "line": 1,
          "column": 21
        }
      },
      "prelude": {
        "type": "SelectorList",
        "loc": {
          "source": "<unknown>",
          "start": {
            "offset": 0,
            "line": 1,
            "column": 1
          },
          "end": {
            "offset": 17,
            "line": 1,
            "column": 18
          }
        },
        "children": [
          {
            "type": "Selector",
            "loc": {
              "source": "<unknown>",
              "start": {
                "offset": 0,
                "line": 1,
                "column": 1
              },
              "end": {
                "offset": 17,
                "line": 1,
                "column": 18
              }
            },
            "children": [
              {
                "type": "PseudoElementSelector",
                "loc": {
                  "source": "<unknown>",
                  "start": {
                    "offset": 0,
                    "line": 1,
                    "column": 1
                  },
                  "end": {
                    "offset": 17,
                    "line": 1,
                    "column": 18
                  }
                },
                "name": "slotted",
                "children": [
                  {
                    "type": "Selector",
                    "loc": {
                      "source": "<unknown>",
                      "start": {
                        "offset": 10,
                        "line": 1,
                        "column": 11
                      },
                      "end": {
                        "offset": 16,
                        "line": 1,
                        "column": 17
                      }
                    },
                    "children": [
                      {
                        "type": "TypeSelector",
                        "loc": {
                          "source": "<unknown>",
                          "start": {
                            "offset": 10,
                            "line": 1,
                            "column": 11
                          },
                          "end": {
                            "offset": 16,
                            "line": 1,
                            "column": 17
                          }
                        },
                        "name": "button"
                      }
                    ]
                  }
                ]
              }
            ]
          }
        ]
      },
      "block": {
        "type": "Block",
        "loc": {
          "source": "<unknown>",
          "start": {
            "offset": 18,
            "line": 1,
            "column": 19
          },
          "end": {
            "offset": 20,
            "line": 1,
            "column": 21
          }
        },
        "children": []
      }
    }
  ]
}

Windows detected possible trojan for css.so

This may be the incorrect place to post this so I might cross post on the nvim-treesitter repository as well. I was messing around with neovim but received an notification from windows defender about a possible trojan (Trojan:Win64/Cobaltstrike.RDA!MTB). The file specifically was located here: "nvim-treesitter\parser\css.so".

I can only assume that this file was created after I installed css language support with nvim-treesitter.

I uploaded it to virus total (https://www.virustotal.com/gui/file/6898b45039bfd4bcb56fa9a82a359d07b8fcd688ba68ce06913c224d04c60aea/behavior) and while it didn't suggest that it was malicious it did mention some odd behavior.

I'm hoping this is a false positive but you never know. My apologies if this is something more specific to my setup.

release for 0.15 API

master seems to work with last API changes. Any chance for an stable release for this grammar? ;)

Support namespace selectors

The namespace declarations work as expected but the namespace selectors do not:

@namespace svg url(http://www.w3.org/2000/svg);
@namespace xl "http://www.w3.org/1999/xlink";

svg|a {}

[xl|href] {}
namespace_statement [0, 0] - [0, 47]
  namespace_name [0, 11] - [0, 14]
  call_expression [0, 15] - [0, 46]
    function_name [0, 15] - [0, 18]
    arguments [0, 18] - [0, 46]
      plain_value [0, 19] - [0, 45]
namespace_statement [1, 0] - [1, 45]
  namespace_name [1, 11] - [1, 13]
  string_value [1, 14] - [1, 44]
rule_set [3, 0] - [3, 8]
  selectors [3, 0] - [3, 3]
    tag_name [3, 0] - [3, 3]
  ERROR [3, 3] - [3, 5]
    ERROR [3, 3] - [3, 5]
  block [3, 6] - [3, 8]
rule_set [5, 0] - [5, 12]
  selectors [5, 0] - [5, 9]
    attribute_selector [5, 0] - [5, 9]
      attribute_name [5, 1] - [5, 3]
      ERROR [5, 3] - [5, 8]
        ERROR [5, 3] - [5, 8]
  block [5, 10] - [5, 12]

PostCSS and/or Tailwind's `@apply` support?

Hello!

I'm using Tailwind, which supports this syntax:

.selector {
  @apply variable-a meta-variable-b lots-of-combined-properties-c;
}

but with the current parser, I get a squiggly on everything after variable-a

Is PostCSS / varying grammars in scope for tree-sitter-css?

Publish to crates.io?

I noticed that this language is not published to crates.io while many other tree sitter languages are. Is there a reason for that?

Highlighting issues with grid-template

I've noticed some weird highlighting issues with the grid-template shorthand:

.grid {
  display: grid;
  grid-template:
    [header-left] "header header header" 8rem [header-right]
    [main-left]   "nav article aside"    1fr  [main-right]
    [footer-left] "footer footer footer" 8rem [footer-right]
    / 20% 60% 20%;
  min-height: 100vh;
  max-width: 100vw;
}

The grid-template shorthand makes highlighting go funky through to the rest of the block. I think perhaps it's the line names that are causing it? I don't think it likes the square brackets.

URLs without quotation are considered errors

Expected:
URLs inside the url() function that do not include quotation marks are perfectly valid.

Current behaviour:
URLs inside the url() function that do not include quotation marks are considered errors.

reference: https://developer.mozilla.org/en-US/docs/Web/CSS/url#syntax

The following are all valid and equivalent:

<css_property>: url("https://example.com/image.png")
<css_property>: url('https://example.com/image.png')
<css_property>: url(https://example.com/image.png)

Parser for scss

Hi,
not sure where is the best place to ask about it. Feel free to delete it if that's not the right place.
I extensively work with scss and would really like to have tree sitter parser for it. Could support for sass/scss be added to this parser or does new one need to be created?

Thanks.

feature: release tree-sitter 0.21 compatible version

Did you check the tree-sitter docs?

Is your feature request related to a problem? Please describe.

ast-grep is using a lot of tree-sitter grammars and is going to upgrading the tree-sitter parser library.

However, tree-sitter-css's dependency range is blocking the upgrade.
I do think this will be a more ecosystem breaking change without all parsers upgrading at the same time.

e.g.
ast-grep/ast-grep#1057

Describe the solution you'd like

Release a new tree-sitter 0.21 compatible version

Describe alternatives you've considered

Make the dependency more compatible by relaxing the version range

Additional context

No response

Classes and property keys both get `@property` group

This is noticeable when comparing the default css highlighting with the one from this TS parser:

default css syntax highlighting
Pasted image 2022-11-17 00 41 15

TS css parser
Pasted image 2022-11-17 00 42 54

the white color is simply a color scheme issue – the parser issue is that both, the classes in the selector and the property, both get the same group @property, which I checked with TS playground:
Pasted image 2022-11-17 00 44 41
Pasted image 2022-11-17 00 45 10

Overall, this leads to worse syntax highlighting, regardless the theme.

Interpretation of incomplete selectors is erratic

Let's define an incomplete selector as a CSS selector that the user is in the process of typing which doesn't yet have any trailing braces.

This is the current behavior of tree-sitter-css. In these examples, assume we’re in an otherwise empty file:

Bare tag name

div
stylesheet [0, 0] - [1, 0]
  ERROR [0, 0] - [0, 3]
    attribute_name [0, 0] - [0, 3]

Tag name with pseudoclass

div:foo
stylesheet [0, 0] - [1, 0]
  declaration [0, 0] - [0, 7]
    property_name [0, 0] - [0, 3]
    plain_value [0, 4] - [0, 7]
    MISSING ; [0, 7] - [0, 7]

Pseudoclass by itself

:foo
stylesheet [0, 0] - [1, 0]
  ERROR [0, 0] - [0, 4]
    pseudo_class_selector [0, 0] - [0, 4]
      class_name [0, 1] - [0, 4]

Attribute selector

div[foo]
stylesheet [0, 0] - [1, 0]
  ERROR [0, 0] - [0, 8]
    attribute_selector [0, 0] - [0, 8]
      tag_name [0, 0] - [0, 3]
      attribute_name [0, 4] - [0, 7]

For the most part, there’s a logic to these examples that I can reason through:

  • The last two examples are properly interpreted as selectors because they’re unambiguous in their context.
  • In the second example, I understand the ambiguity in theory, but I don’t think the parser should choose “property-value pair” as its first interpretation of div:foo. It makes more sense to me for the parser to interpret it as a selector until it has more information.
  • The first example’s output doesn’t make sense to me at all.

What’s tricky about these examples is that they all behave differently in an empty file — or at the very end of a file — than they do if the incomplete selector is being typed in the middle of an existing file…

div

div {}

…in which case the parser joins it to the following selector and parses it less ambiguously.

I found all this while trying to adapt Pulsar’s autocomplete-css, which never properly worked with the Tree-sitter CSS grammar. If a user is typing a selector in a brand-new CSS file, we can’t accurately highlight certain selectors until the user types {; not ideal, but understandable.

But it also means that autocompletion suggestions will be either missing or flat-out wrong. My wish is that tree-sitter-css be able to parse these incomplete selectors well enough for us to be able to use that output to offer accurate contextual completions.


My suggested fixes for the first two examples would be something like this:

Bare tag name

div
stylesheet [0, 0] - [1, 0]
  ERROR [0, 0] - [0, 3]
    tag_name [0, 0] - [0, 3]

Tag name with pseudoclass

div:foo
stylesheet [0, 0] - [1, 0]
  ERROR [0, 0] - [0, 7]
    pseudo_class_selector [0, 0] - [0, 7]
      tag_name [0, 0] - [0, 3]
      class_name [0, 4] - [0, 7]

In other words, the parser should assume that arbitrary text at the root of a document is a selector — even when it isn’t yet valid — until that text is unambigously something else.

In the example of a user typing div:foo, I’d want the parser to assume it’s dealing with a CSS selector after every keystroke. If the user instead typed div: foo, I’d expect the parser to change its mind after the space character, and no earlier.

I think this behavior could be introduced without breaking any existing CSS parsing — even in, for example, a case where someone wants to highlight

display: block;

as CSS on a blog post without having to place it inside a selector.

I might try to contribute a PR for this one day if I get more comfortable working with parsers.

Space after colon breaks parser

The recent changes to the scanner with handling of colons for pseudo classes I believe broke parsing in certain circumstances including this example in the atom.io.css example file.

@media screen and (min-width: 0 0) {
    .tooltipped-multiline: after {
    width: 250px;
}
}.tooltipped-sticky:before, .tooltipped-sticky:after {
image

bug: Identifier considers non-ASCII an error

Did you check existing issues?

  • I have read all the tree-sitter docs if it relates to using the parser
  • I have searched the existing issues of tree-sitter-css

Tree-Sitter CLI Version, if relevant (output of tree-sitter --version)

No response

Describe the bug

In an editor, I noticed that a class selector gets marked as an error if I use non-ASCII letters. Looking at the source code here, it seems that identifiers are constrained to ASCII. This is not correct; CSS allows basically any non-ASCII character in identifiers.

Steps To Reproduce/Bad Parse Tree

Use a non-ASCII character in an identifier. One example is the letter á.

Expected Behavior/Parse Tree

Non-ASCII letters should not appear as errors.

Repro

/* Example code that fails to parse */
.skráning {
  background-color: white;
}

Add license to repo

I'm doing some tree-sitter work and wanted to use the languages, but I noticed this one doesn't have a license. All the other ones I've looked at (tree-sitter-html, tree-sitter-css, etc) are MIT licensed. Could you add one here whenever you get a chance?

bug: `apply_directive` node with `rem` unit

Did you check existing issues?

  • I have read all the tree-sitter docs if it relates to using the parser
  • I have searched the existing issues of tree-sitter-css

Tree-Sitter CLI Version, if relevant (output of tree-sitter --version)

tree-sitter 0.20.8 (0c49d6745b3fc4822ab02e0018770cd6383a779c)

Describe the bug

Apply directive with rem unit

.hl-title {
  @apply text-[2.5rem];
}

AST:

(rule_set) ; [1:1 - 3:1]
 (selectors) ; [1:1 - 9]
  (class_selector) ; [1:1 - 9]
   (class_name) ; [1:2 - 9]
 (block) ; [1:11 - 3:1]
  (apply_directive) ; [2:3 - 23]
   (class_name) ; [2:10 - 22]
    (identifier) ; [2:10 - 14]
    (ERROR) ; [2:16 - 17]
    (integer_value) ; [2:18 - 21]
     (unit) ; [2:19 - 21]

Steps To Reproduce/Bad Parse Tree

  1. Create CSS file
  2. Add code above
  3. Run parser

Expected Behavior/Parse Tree

rem unit should be parsed

Repro

.hl-title {
  @apply text-[2.5rem];
}

Fails to compile on node 12

Description

Fails to compile on node 12

Steps to Reproduce

  1. Ensure you are running on node 12
  2. Clone a copy of the repository if you don't have it
  3. Run npm install

Expected behavior:
Compile successfully
Actual behavior:
The following errors are thrown

../src/binding.cc:13:6: error: variable has incomplete type 'void'
void Init(Handle<Object> exports, Handle<Object> module) {
     ^
../src/binding.cc:13:11: error: use of undeclared identifier 'Handle'
void Init(Handle<Object> exports, Handle<Object> module) {
          ^
../src/binding.cc:13:18: error: 'Object' does not refer to a value
void Init(Handle<Object> exports, Handle<Object> module) {
                 ^
/Users/musaibrahim/Library/Caches/node-gyp/12.13.1/include/node/v8.h:3400:17: note: 
      declared here
class V8_EXPORT Object : public Value {
                ^
../src/binding.cc:13:26: error: use of undeclared identifier 'exports'
void Init(Handle<Object> exports, Handle<Object> module) {
                         ^
../src/binding.cc:13:35: error: use of undeclared identifier 'Handle'
void Init(Handle<Object> exports, Handle<Object> module) {
                                  ^
../src/binding.cc:13:42: error: 'Object' does not refer to a value
void Init(Handle<Object> exports, Handle<Object> module) {
                                         ^
/Users/musaibrahim/Library/Caches/node-gyp/12.13.1/include/node/v8.h:3400:17: note: 
      declared here
class V8_EXPORT Object : public Value {
                ^
../src/binding.cc:13:50: error: use of undeclared identifier 'module'
void Init(Handle<Object> exports, Handle<Object> module) {
                                                 ^
../src/binding.cc:13:57: error: expected ';' after top level declarator
void Init(Handle<Object> exports, Handle<Object> module) {
                                                        ^
                                                        ;

Reproduces how often:

100%

Release a new version

The latest stable release (tag) is over two years ago. Please release/tag a new version.

Non space separated attributes generates a huge parser error

div {
  all:unset;
  display: flex;
  justify-content: center;
}

generates

rule_set [0, 0] - [4, 1]
  selectors [0, 0] - [0, 3]
    tag_name [0, 0] - [0, 3]
  block [0, 4] - [4, 1]
    ERROR [1, 2] - [3, 26]
      descendant_selector [1, 2] - [3, 25]
        descendant_selector [1, 2] - [3, 17]
          descendant_selector [1, 2] - [2, 15]
            descendant_selector [1, 2] - [2, 9]
              pseudo_class_selector [1, 2] - [1, 11]
                tag_name [1, 2] - [1, 5]
                class_name [1, 6] - [1, 11]
              ERROR [1, 11] - [1, 12]
              tag_name [2, 2] - [2, 9]
            ERROR [2, 9] - [2, 10]
            tag_name [2, 11] - [2, 15]
          ERROR [2, 15] - [2, 16]
          tag_name [3, 2] - [3, 17]
        ERROR [3, 17] - [3, 18]
        tag_name [3, 19] - [3, 25]

As oppesed to the case where there is a space following the all::

div {
  all: unset;
  display: flex;
  justify-content: center;
}
rule_set [0, 0] - [4, 1]
  selectors [0, 0] - [0, 3]
    tag_name [0, 0] - [0, 3]
  block [0, 4] - [4, 1]
    declaration [1, 2] - [1, 13]
      property_name [1, 2] - [1, 5]
      plain_value [1, 7] - [1, 12]
    declaration [2, 2] - [2, 16]
      property_name [2, 2] - [2, 9]
      plain_value [2, 11] - [2, 15]
    declaration [3, 2] - [3, 26]
      property_name [3, 2] - [3, 17]
      plain_value [3, 19] - [3, 25]

bug: test failure with tree-sitter 0.22.1

Did you check existing issues?

  • I have read all the tree-sitter docs if it relates to using the parser
  • I have searched the existing issues of tree-sitter-css

Tree-Sitter CLI Version, if relevant (output of tree-sitter --version)

tree-sitter 0.22.1

Describe the bug

The psuedo-element selector test fails on the latest master, with tree-sitter 0.22.1.

  declarations:
    ✓ Function calls
    ✓ Calls where each argument has multiple values
    ✓ Color literals
    ✓ Numbers
    ✓ Binary arithmetic operators
    ✓ Strings
    ✓ URLs
    ✓ Important declarations
    ✓ Declarations without trailing semicolons
    ✓ Comments right after numbers
    ✓ Declarations at the top level
    ✓ Spaces after colons in property declarations
    ✓ No spaces after colons
    ✓ PostCSS
  selectors:
    ✓ Universal selectors
    ✓ Type selectors
    ✓ Class selectors
    ✓ Id selectors
    ✓ Attribute selectors
    ✓ Pseudo-class selectors
    ✗ Pseudo-element selectors
    ✓ Child selectors
    ✓ Descendant selectors
    ✓ Nesting selectors
    ✓ Sibling selectors
    ✓ The :not selector
  statements:
    ✓ Import statements
    ✓ Namespace statements
    ✓ Keyframes statements
    ✓ Media statements
    ✓ Supports statements
    ✓ Charset statements
    ✓ Other at-statements
  stylesheets:
    ✓ Rule sets

1 failure:

correct / expected / unexpected

  1. Pseudo-element selectors:

    (stylesheet
      (rule_set
        (selectors
          (pseudo_element_selector
            (tag_name)
            (tag_name)))
        (block))
      (rule_set
        (selectors
          (descendant_selector
            (descendant_selector
              (descendant_selector
                (descendant_selector
                  (tag_name)
                  (ERROR
                    (attribute_name)
                    (attribute_name)
                    (attribute_name)
                    (attribute_name)
                    (attribute_name)
                    (attribute_name)
                    (attribute_name))
                  (pseudo_element_selector
                    (tag_name)))
                (tag_name))
              (tag_name))
            (ERROR)
            (pseudo_element_selector
              (tag_name)
              (arguments
                (tag_name)))))
            (arguments
              (tag_name))))
        (block)))

Steps To Reproduce/Bad Parse Tree

  1. Ensure tree-sitter 0.22.1 (or later?) is installed.
  2. Do not run npm i in the tree-sitter-css directory as this will install tree-sitter 0.20.8.
  3. Run tree-sitter test

Expected Behavior/Parse Tree

Test pass.

Repro

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.