Giter Site home page Giter Site logo

wordpress-coding-standards / stylelint-config-wordpress Goto Github PK

View Code? Open in Web Editor NEW
96.0 96.0 17.0 560 KB

WordPress shareable config for stylelint Note: Migrating to Gutenberg repo:

Home Page: https://github.com/WordPress/gutenberg/pull/22777

License: MIT License

JavaScript 74.29% CSS 21.70% SCSS 4.00%
hacktoberfest stylelint wordpress

stylelint-config-wordpress's Introduction

Latest Stable Version Release Date of the Latest Version ๐Ÿšง Latest Unstable Version

Basic QA checks Unit Tests codecov.io

Minimum PHP Version Tested on PHP 5.4 to 8.3

License: MIT Total Downloads

WordPress Coding Standards for PHP_CodeSniffer


Introduction

This project is a collection of PHP_CodeSniffer rules (sniffs) to validate code developed for WordPress. It ensures code quality and adherence to coding conventions, especially the official WordPress Coding Standards.

This project needs funding. Find out how you can help.

Minimum Requirements

The WordPress Coding Standards package requires:

For the best results, it is recommended to also ensure the following additional PHP extensions are enabled:

Installation

As of WordPressCS 3.0.0, installation via Composer using the below instructions is the only supported type of installation.

Composer will automatically install the project dependencies and register the rulesets from WordPressCS and other external standards with PHP_CodeSniffer using the Composer PHPCS plugin.

If you are upgrading from an older WordPressCS version to version 3.0.0, please read the Upgrade guide for ruleset maintainers and end-users first!

Composer Project-based Installation

Run the following from the root of your project:

composer config allow-plugins.dealerdirect/phpcodesniffer-composer-installer true
composer require --dev wp-coding-standards/wpcs:"^3.0"

Composer Global Installation

Alternatively, you may want to install this standard globally:

composer global config allow-plugins.dealerdirect/phpcodesniffer-composer-installer true
composer global require --dev wp-coding-standards/wpcs:"^3.0"

Updating your WordPressCS install to a newer version

If you installed WordPressCS using either of the above commands, you can upgrade to a newer version as follows:

# Project local install
composer update wp-coding-standards/wpcs --with-dependencies

# Global install
composer global update wp-coding-standards/wpcs --with-dependencies

Using your WordPressCS install

Once you have installed WordPressCS using either of the above commands, use it as follows:

# Project local install
vendor/bin/phpcs -ps . --standard=WordPress

# Global install
%USER_DIRECTORY%/Composer/vendor/bin/phpcs -ps . --standard=WordPress

Pro-tip: For the convenience of using phpcs as a global command, use the Global install method and add the path to the %USER_DIRECTORY%/Composer/vendor/bin directory to the PATH environment variable for your operating system.

Rulesets

Standards subsets

The project encompasses a super-set of the sniffs that the WordPress community may need. If you use the WordPress standard you will get all the checks.

You can use the following as standard names when invoking phpcs to select sniffs, fitting your needs:

  • WordPress - complete set with all of the sniffs in the project

Using a custom ruleset

If you need to further customize the selection of sniffs for your project - you can create a custom ruleset file.

When you name this file either .phpcs.xml, phpcs.xml, .phpcs.xml.dist or phpcs.xml.dist, PHP_CodeSniffer will automatically locate it as long as it is placed in the directory from which you run the CodeSniffer or in a directory above it. If you follow these naming conventions you don't have to supply a --standard CLI argument.

For more info, read about using a default configuration file. See also the provided WordPressCS phpcs.xml.dist.sample file and the fully annotated example ruleset in the PHP_CodeSniffer documentation.

Customizing sniff behaviour

The WordPress Coding Standard contains a number of sniffs which are configurable. This means that you can turn parts of the sniff on or off, or change the behaviour by setting a property for the sniff in your custom [.]phpcs.xml[.dist] file.

You can find a complete list of all the properties you can change for the WordPressCS sniffs in the wiki.

WordPressCS also uses sniffs from PHPCSExtra and from PHP_CodeSniffer itself. The README for PHPCSExtra contains information on the properties which can be set for the sniff from PHPCSExtra. Information on custom properties which can be set for sniffs from PHP_CodeSniffer can be found in the PHP_CodeSniffer wiki.

Recommended additional rulesets

PHPCompatibility

The PHPCompatibility ruleset and its subset PHPCompatibilityWP come highly recommended. The PHPCompatibility sniffs are designed to analyse your code for cross-version PHP compatibility.

The PHPCompatibilityWP ruleset is based on PHPCompatibility, but specifically crafted to prevent false positives for projects which expect to run within the context of WordPress, i.e. core, plugins and themes.

Install either as a separate ruleset and run it separately against your code or add it to your custom ruleset, like so:

<config name="testVersion" value="7.0-"/>
<rule ref="PHPCompatibilityWP">
    <include-pattern>*\.php$</include-pattern>
</rule>

Whichever way you run it, do make sure you set the testVersion to run the sniffs against. The testVersion determines for which PHP versions you will receive compatibility information. The recommended setting for this at this moment is 7.0- to support the same PHP versions as WordPress Core supports.

For more information about setting the testVersion, see:

VariableAnalysis

For some additional checks around (undefined/unused) variables, the VariableAnalysis standard is a handy addition.

VIP Coding Standards

For those projects which deploy to the WordPress VIP platform, it is recommended to also use the official WordPress VIP coding standards ruleset.

How to use

Command line

Run the phpcs command line tool on a given file or directory, for example:

vendor/bin/phpcs --standard=WordPress wp-load.php

Will result in following output:

--------------------------------------------------------------------------------
FOUND 6 ERRORS AND 4 WARNINGS AFFECTING 5 LINES
--------------------------------------------------------------------------------
  36 | WARNING | error_reporting() can lead to full path disclosure.
  36 | WARNING | error_reporting() found. Changing configuration values at
     |         | runtime is strongly discouraged.
  52 | WARNING | Silencing errors is strongly discouraged. Use proper error
     |         | checking instead. Found: @file_exists( dirname(...
  52 | WARNING | Silencing errors is strongly discouraged. Use proper error
     |         | checking instead. Found: @file_exists( dirname(...
  75 | ERROR   | Overriding WordPress globals is prohibited. Found assignment
     |         | to $path
  78 | ERROR   | Detected usage of a possibly undefined superglobal array
     |         | index: $_SERVER['REQUEST_URI']. Use isset() or empty() to
     |         | check the index exists before using it
  78 | ERROR   | $_SERVER['REQUEST_URI'] not unslashed before sanitization. Use
     |         | wp_unslash() or similar
  78 | ERROR   | Detected usage of a non-sanitized input variable:
     |         | $_SERVER['REQUEST_URI']
 104 | ERROR   | All output should be run through an escaping function (see the
     |         | Security sections in the WordPress Developer Handbooks), found
     |         | '$die'.
 104 | ERROR   | All output should be run through an escaping function (see the
     |         | Security sections in the WordPress Developer Handbooks), found
     |         | '__'.
--------------------------------------------------------------------------------

Using PHPCS and WordPressCS from within your IDE

The wiki contains links to various in- and external tutorials about setting up WordPressCS to work in your IDE.

Running your code through WordPressCS automatically using Continuous Integration tools

Fixing errors or ignoring them

You can find information on how to deal with some of the more frequent issues in the wiki.

Tools shipped with WordPressCS

Since version 1.2.0, WordPressCS has a special sniff category Utils.

This sniff category contains some tools which, generally speaking, will only be needed to be run once over a codebase and for which the fixers can be considered risky, i.e. very careful review by a developer is needed before accepting the fixes made by these sniffs.

The sniffs in this category are disabled by default and can only be activated by adding some properties for each sniff via a custom ruleset.

At this moment, WordPressCS offer the following tools:

  • WordPress.Utils.I18nTextDomainFixer - This sniff can replace the text domain used in a code-base. The sniff will fix the text domains in both I18n function calls as well as in a plugin/theme header. Passing the following properties will activate the sniff:
    • old_text_domain: an array with one or more (old) text domain names which need to be replaced;
    • new_text_domain: the correct (new) text domain as a string.

Contributing

See CONTRIBUTING, including information about unit testing the standard.

Funding

If you want to sponsor the work on WordPressCS, you can do so by donating to the PHP_CodeSniffer Open Collective.

License

See LICENSE (MIT).

stylelint-config-wordpress's People

Contributors

arcanemagus avatar garyjones avatar greenkeeper[bot] avatar harleyoliver avatar hbrok avatar jeddy3 avatar ntwb avatar sergiunegara avatar thebrandonallen 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

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

stylelint-config-wordpress's Issues

Move this repo out of the stylelint org

@ntwb We're freeing up the stylelint org to focus on stylelint as a tool rather than the configs. As such we are moving the SuitCSS, Wordpress, CSS Recipes and Standard configs out of the org. We've just finished transferring the SuitCSS config to the SuitCSS org. Would we able to transfer this repo to your github user and then you can decided where best to put it after that (be it the WordPress org or else where)?

Add `comment-empty-line-before` rule

https://make.wordpress.org/core/handbook/best-practices/coding-standards/css/#commenting

"Section/subsection headers should have newlines before and after. Inline comments should not have empty newlines separating the comment from the item to which it relates."

The following patterns are not considered warnings:

/**
* #.# Section title
*
* Description of section, whether or not it has media queries, etc.
*/

.selector {
  float: left;
}


/**
* #.# Another section title
*
* Description of section, whether or not it has media queries, long comments
* should manually break the line length at 80 characters.
*/

.selector {
  float: right;
}

/* This is a comment about this selector */
.another-selector {
  position: absolute;
  top: 0 !important; /* I should explain why this is so !important */
}

The following patterns are considered warnings:

/**
* #.# Section title
*
* Description of section, whether or not it has media queries, etc.
*/
.selector {
  float: left;
}
/**
* #.# Another section title
*
* Description of section, whether or not it has media queries, long comments
* should manually break the line length at 80 characters.
*/
.selector {
  float: right;
}

/* This is a comment about this selector */

.another-selector {
  position: absolute;
  top: 0 !important; /* I should explain why this is so !important */
}

Update `declaration-colon-newline-after` rule

https://make.wordpress.org/core/handbook/best-practices/coding-standards/css/#values

"Multiple comma-separated values for one property should be separated by either a space or a newline, including within rgba(). Newlines should be used for lengthier multi-part values such as those for shorthand properties like box-shadow and text-shadow. Each subsequent value after the first should then be on a new line, indented to the same level as the selector and then spaced over to left-align with the previous value."

Current rule: "declaration-colon-newline-after": "always-multi-line",

Correct:

.class {
    text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.5),
                 0 1px 0 #fff;
}

Incorrect:

.class {
    text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.5),
        0 1px 0 #fff;
}

.class {
    text-shadow: 
        0 -1px 0 rgba(0, 0, 0, 0.5),
        0 1px 0 #fff;
}

Add `value-keyword-case` rule

Once stylelint/stylelint#1101 is fixed and supports font names:

/src/test.css
147:15  โš   Expected "Georgia" to be "georgia" (value-keyword-case) [stylelint]
147:64  โš   Expected "Times" to be "times" (value-keyword-case) [stylelint]
150:15  โš   Expected "Lato" to be "lato" (value-keyword-case) [stylelint]
153:34  โš   Expected "Helvetica" to be "helvetica" (value-keyword-case) [stylelint]
363:15  โš   Expected "Inconsolata" to be "inconsolata" (value-keyword-case) [stylelint]
363:28  โš   Expected "Consolas" to be "consolas" (value-keyword-case) [stylelint]
363:38  โš   Expected "Monaco" to be "monaco" (value-keyword-case) [stylelint]

Add: `block-no-empty` rule.

https://github.com/stylelint/stylelint/tree/master/src/rules/block-no-empty

  "block-no-empty": true,

The following patterns are considered warnings:

a {}
a { }
@media print { a {} }

The following patterns are not considered warnings:

a { color: pink; }

Related:

โ€ข BuddyPress uses/used the equivalent SCSS-Lint EmptyRule rule (src)

โ€ข bbPress has 2 instances https://bbpress.trac.wordpress.org/changeset/3440#file2

โ€ข WordPress has 1 instance https://core.trac.wordpress.org/browser/trunk/src/wp-includes/css/wp-oembed-embed.css?rev=34903#L341

BuddyPress has no CSS or SCSS that would trigger this rule though both the bbPress and WordPress instances that trigger this rule appear to have been added for "completeness" in being a way to document even though unused CSS classes that are available for developers.

Update config to extend `stylelint-config-recommended`

The stylelint-config-recommended repo has been created as a foundation for configs that turns on all the possible errors rules within stylelint, there are no stylelistic rules turned on.

This is the stylelint equivalent shared config to ESLint's shared config eslint-config-recommended

Currently this is blocked by #153 (Add Jest snapshots)

Add `no-unsupported-browser-features` rule

Copied from WordPress Autoprefixer configiruation:

https://core.trac.wordpress.org/browser/trunk/Gruntfile.js#L28

browsers: [
  'Android >= 2.1',
  'Chrome >= 21',
  'Edge >= 12',
  'Explorer >= 7',
  'Firefox >= 17',
  'Opera >= 12.1',
  'Safari >= 6.0'
],

stylelint rule:

    "no-unsupported-browser-features": [true, {
      "browsers": "Android >= 2.1, Chrome >= 21, Edge >= 12, Explorer >= 7, Firefox >= 17, Opera >= 12.1, Safari >= 6.0"
    }],

Testing this rule on WordPress CSS currently results in 3279 warnings, of which 2463 relate to IE, 790 Android Browser, and 227 Opera leaving 158 warnings for all other browsers.

Bumping the versions of each browser greater than 1% usage results in 148 warnings in total:

    "no-unsupported-browser-features": [true, {
      "browsers": "Android >= 4.4, Chrome >= 49, Edge >= 13, Explorer >= 11, Firefox >= 46, Opera >= 38, Safari >= 9.1"
    }],

Bumping explicitly to >1% results in 1448 warnings:

    "no-unsupported-browser-features": [true, {
      "browsers": ">1%"
    }],

Above stats from http://caniuse.com/usage-table

Note: supporting all of the browsers via the Autoprefixer configuration cited is not the same as any WordPress policy on supported browsers, it doesn't hurt to support older browser vendor prefixes and this in no way suggests WordPress supports all these browser versions

Node 7

Can package.json add support for a node engine greater than 7?

Add `ignoreFunctions` regex for `DXImageTransform` in `function-name-case`

There are numerous instances of DXImageTransform throughout WP's CSS, we should ignore these in the function-name-case rule, some examples:

โ€ข progid:DXImageTransform.Microsoft.gradient
โ€ข progid:DXImageTransform.Microsoft.Alpha
โ€ข progid:DXImageTransform.Microsoft.Matrix
โ€ข progid:DXImageTransform.Microsoft.AlphaImageLoader

Use unitless `line-height`

Via WordPress/gutenberg#571

See https://make.wordpress.org/core/handbook/best-practices/coding-standards/css/#values

"Line height should also be unit-less, unless necessary to be defined as a specific pixel value. This is more than just a style convention, but is worth mentioning here. More information: http://meyerweb.com/eric/thoughts/2006/02/08/unitless-line-heights/"

Also https://developer.mozilla.org/en-US/docs/Web/CSS/line-height#Prefer_unitless_numbers_for_line-height_values

Drop NodeJS 0.12.x

stylelint has dropped NodeJS 0.12.x support
WordPress is about to drop NodeJS 0.12.x support

npm run release credential failure

Following on from #27:

$ npm run release

> [email protected] release /Users/netweb/dev/stylelint/stylelint-config-wordpress
> npmpub

๐Ÿ“ฆ  Preparing v2.0.1.
๐Ÿ“ฆ  Running 'npm install'. This can take a while.
๐Ÿ“ฆ  Running tests...

> [email protected] pretest /Users/netweb/dev/stylelint/stylelint-config-wordpress
> npm run lint


> [email protected] lint /Users/netweb/dev/stylelint/stylelint-config-wordpress
> eslint . --ignore-path .gitignore


> [email protected] test /Users/netweb/dev/stylelint/stylelint-config-wordpress
> npm run ava


> [email protected] ava /Users/netweb/dev/stylelint/stylelint-config-wordpress
> ava --verbose "__tests__/**/*.js"


  โœ” no warnings with valid css
  โœ” a warning with invalid css

  2 tests passed

๐Ÿ“ฆ  Publishing...
+ [email protected]
Everything up-to-date

/Users/netweb/dev/stylelint/stylelint-config-wordpress/node_modules/github-release-from-changelog/github-release-from-changelog.js:112
    throw err
    ^
Error: {"message":"Bad credentials","documentation_url":"https://developer.github.com/v3"}
๐Ÿ“ฆ  GitHub release failed.

npm ERR! Darwin 15.3.0
npm ERR! argv "/usr/local/Cellar/node/5.6.0/bin/node" "/usr/local/bin/npm" "run" "release"
npm ERR! node v5.6.0
npm ERR! npm  v3.6.0
npm ERR! code ELIFECYCLE
npm ERR! [email protected] release: `npmpub`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the [email protected] release script 'npmpub'.
npm ERR! Make sure you have the latest version of node.js and npm installed.
npm ERR! If you do, this is most likely a problem with the stylelint-config-wordpress package,
npm ERR! not with npm itself.
npm ERR! Tell the author that this fails on your system:
npm ERR!     npmpub
npm ERR! You can get information on how to open an issue for this project with:
npm ERR!     npm bugs stylelint-config-wordpress
npm ERR! Or if that isn't available, you can get their info via:
npm ERR!     npm owner ls stylelint-config-wordpress
npm ERR! There is likely additional logging output above.

npm ERR! Please include the following file with any support request:
npm ERR!     /Users/netweb/dev/stylelint/stylelint-config-wordpress/npm-debug.log

Just like last time 2.0.1 already exists 2.0.2 incoming

Add Jest snapshots tests

We should add some Jest snapshots to aid detection of any regressions:

  • bbPress
  • BuddyPress
  • WordPress

Add the stylelint-order plugin pack

The 'declaration-block-properties-order' rule appears to not be present in this config.

According to https://make.wordpress.org/core/handbook/best-practices/coding-standards/css/#property-ordering:

The baseline for ordering is:

Display
Positioning
Box model
Colors and Typography
Other

I could try to put this together in a list for declaration-block-properties-order if that would help? I'm just not sure if it has already been done and is just missing from the rules.

Add rules

@ntwb Sorry, I've only just seen your comment about setting up this repo. I totally missed it when the issue was closed and we were celebrating the first release of the linter!

Better late than never though :)

I've added some basic tests to make sure the config isn't malformed. I've given you access to the repo though, so you can change anything to your liking :)

Please don't hesitate to give me a shout if you need a hand with anything. And sorry again for the delay!

Support long comments in the header of `style.css` files

Given a typical theme header such as this below stylelint should include exceptions for long lines within these comments, typically URLs, Description, and Tags lines are longer than 80 characters:

/*
Theme Name: Twenty Ten
Theme URI: https://wordpress.org/themes/twentyten/themes/twentyten/themes/twentyten/themes/twentyten/
Description: The 2010 theme for WordPress is stylish, customizable, simple, and readable -- make it yours with a custom menu, header image, and background. Twenty Ten supports six widgetized areas (two in the sidebar, four in the footer) and featured images (thumbnails for gallery posts and custom header images for posts and pages). It includes stylesheets for print and the admin Visual Editor, special styles for posts in the "Asides" and "Gallery" categories, and has an optional one-column page template that removes the sidebar.
Author: the WordPress team
Author URI: https://wordpress.org/
Version: 2.3
License: GNU General Public License v2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
Tags: blog, two-columns, custom-header, custom-background, threaded-comments, sticky-post, translation-ready, microformats, rtl-language-support, editor-style, custom-menu, flexible-header, featured-images, footer-widgets, featured-image-header
Text Domain: twentyten
*/

a {
	top: 0.2em;
}

...

NPM Release Error

So I just made a mistake doing the release :(

I ran npm pub, the output of that was [email protected]

I should have ran npm run release, which I just ran:

$ npm run release

> [email protected] release /Users/netweb/dev/stylelint/stylelint-config-wordpress
> npmpub

๐Ÿ“ฆ  Preparing v2.0.0.
๐Ÿ“ฆ  Running 'npm install'. This can take a while.
๐Ÿ“ฆ  Running tests...

> [email protected] pretest /Users/netweb/dev/stylelint/stylelint-config-wordpress
> npm run lint


> [email protected] lint /Users/netweb/dev/stylelint/stylelint-config-wordpress
> eslint . --ignore-path .gitignore


> [email protected] test /Users/netweb/dev/stylelint/stylelint-config-wordpress
> npm run ava


> [email protected] ava /Users/netweb/dev/stylelint/stylelint-config-wordpress
> ava --verbose "__tests__/**/*.js"


  โœ” no warnings with valid css
  โœ” a warning with invalid css

  2 tests passed

๐Ÿ“ฆ  Publishing...
npm ERR! publish Failed PUT 403
npm ERR! Darwin 15.3.0
npm ERR! argv "/usr/local/Cellar/node/5.6.0/bin/node" "/usr/local/bin/npm" "publish"
npm ERR! node v5.6.0
npm ERR! npm  v3.6.0
npm ERR! code E403

npm ERR! "You cannot publish over the previously published version 2.0.0." : stylelint-config-wordpress
npm ERR! 
npm ERR! If you need help, you may report this error at:
npm ERR!     <https://github.com/npm/npm/issues>

npm ERR! Please include the following file with any support request:
npm ERR!     /Users/netweb/dev/stylelint/stylelint-config-wordpress/npm-debug.log
๐Ÿ“ฆ  Publishing failed.

npm ERR! Darwin 15.3.0
npm ERR! argv "/usr/local/Cellar/node/5.6.0/bin/node" "/usr/local/bin/npm" "run" "release"
npm ERR! node v5.6.0
npm ERR! npm  v3.6.0
npm ERR! code ELIFECYCLE
npm ERR! [email protected] release: `npmpub`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the [email protected] release script 'npmpub'.
npm ERR! Make sure you have the latest version of node.js and npm installed.
npm ERR! If you do, this is most likely a problem with the stylelint-config-wordpress package,
npm ERR! not with npm itself.
npm ERR! Tell the author that this fails on your system:
npm ERR!     npmpub
npm ERR! You can get information on how to open an issue for this project with:
npm ERR!     npm bugs stylelint-config-wordpress
npm ERR! Or if that isn't available, you can get their info via:
npm ERR!     npm owner ls stylelint-config-wordpress
npm ERR! There is likely additional logging output above.

npm ERR! Please include the following file with any support request:
npm ERR!     /Users/netweb/dev/stylelint/stylelint-config-wordpress/npm-debug.log

The key line from above is: npm ERR! "You cannot publish over the previously published version 2.0.0." : stylelint-config-wordpress

Going to push out 2.0.1 so that a release tag is created et cetera:

https://github.com/ntwb/stylelint-config-wordpress/releases

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.