konafets / antlers-idea Goto Github PK
View Code? Open in Web Editor NEWAdds support for Antlers, the templating language of Statamic
License: MIT License
Adds support for Antlers, the templating language of Statamic
License: MIT License
Plugin: 0.0.6
PhpStorm: 2023.1.1
I get an IDE error from time to time, i haven't figured out which project / file cashes the plugin yet.
Thanks for your great work - we have been waiting for PhpStorm antlers support so long :)
Here is the trace:
java.lang.Throwable: Read access is allowed from inside read-action (or EDT) only (see com.intellij.openapi.application.Application.runReadAction())
Current thread: Thread[EncodingManagerImpl Document Pool,4,main] 414988783 (EventQueue.isDispatchThread()=false)
SystemEventQueueThread: Thread[AWT-EventQueue-0,6,main] 1512743941
at com.intellij.openapi.diagnostic.Logger.error(Logger.java:202)
at com.intellij.openapi.application.impl.ApplicationImpl.assertReadAccessAllowed(ApplicationImpl.java:1004)
at com.intellij.workspaceModel.core.fileIndex.impl.WorkspaceFileIndexDataImpl.ensureIsUpToDate(WorkspaceFileIndexDataImpl.kt:127)
at com.intellij.workspaceModel.core.fileIndex.impl.WorkspaceFileIndexDataImpl.getFileInfo(WorkspaceFileIndexDataImpl.kt:70)
at com.intellij.workspaceModel.core.fileIndex.impl.WorkspaceFileIndexImpl.getFileInfo(WorkspaceFileIndexImpl.kt:220)
at com.intellij.workspaceModel.core.fileIndex.impl.WorkspaceFileIndexImpl.findFileSet(WorkspaceFileIndexImpl.kt:180)
at com.intellij.workspaceModel.core.fileIndex.impl.WorkspaceFileIndexImpl.isInContent(WorkspaceFileIndexImpl.kt:73)
at com.intellij.openapi.roots.impl.ProjectFileIndexImpl.isInContent(ProjectFileIndexImpl.java:314)
at com.intellij.lang.PerFileMappingsBase.getNotInHierarchy(PerFileMappingsBase.java:144)
at com.intellij.lang.PerFileMappingsBase.getMappingInner(PerFileMappingsBase.java:136)
at com.intellij.lang.PerFileMappingsBase.getConfiguredMapping(PerFileMappingsBase.java:105)
at com.intellij.psi.templateLanguages.TemplateDataLanguageMappings.getMapping(TemplateDataLanguageMappings.java:46)
at de.arrobait.antlers.file.AntlersFileType$Companion.getAssociatedFileType(AntlersFileType.kt:30)
at de.arrobait.antlers.file.AntlersFileType$Companion.access$getAssociatedFileType(AntlersFileType.kt:16)
at de.arrobait.antlers.file.AntlersFileType.extractCharsetFromFileContent(AntlersFileType.kt:55)
at com.intellij.openapi.fileTypes.CharsetUtil.extractCharsetFromFileContent(CharsetUtil.java:33)
at com.intellij.openapi.fileEditor.impl.LoadTextUtil.charsetFromContentOrNull(LoadTextUtil.java:470)
at com.intellij.openapi.vfs.encoding.EncodingManagerImpl.handleDocument(EncodingManagerImpl.java:131)
at com.intellij.openapi.vfs.encoding.EncodingManagerImpl$DocumentEncodingDetectRequest.run(EncodingManagerImpl.java:203)
at com.intellij.util.concurrency.BoundedTaskExecutor.doRun(BoundedTaskExecutor.java:248)
at com.intellij.util.concurrency.BoundedTaskExecutor.access$200(BoundedTaskExecutor.java:28)
at com.intellij.util.concurrency.BoundedTaskExecutor$1.executeFirstTaskAndHelpQueue(BoundedTaskExecutor.java:221)
at com.intellij.util.ConcurrencyUtil.runUnderThreadName(ConcurrencyUtil.java:227)
at com.intellij.util.concurrency.BoundedTaskExecutor$1.run(BoundedTaskExecutor.java:210)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
at java.base/java.util.concurrent.Executors$PrivilegedThreadFactory$1$1.run(Executors.java:702)
at java.base/java.util.concurrent.Executors$PrivilegedThreadFactory$1$1.run(Executors.java:699)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
at java.base/java.util.concurrent.Executors$PrivilegedThreadFactory$1.run(Executors.java:699)
at java.base/java.lang.Thread.run(Thread.java:833)
Great plugin, thanks for the work on it!
One UX issue I often hit is the way the Antlers tags are formatted. The biggest issues I hit are:
I've included some code below so you can get a sense of what I mean.
{{ nocache }} {{ collection from="training_log" status:is="published" limit="20"
sort="date:desc" }}
<div class="flex {{ index === 0 ? 'col-span-3 row-span-3 sm:col-span-2 sm:row-span-2' : '' }}">
<a class="group relative flex" href="{{ url }}">
{{ if images }} {{ images limit="1" }} <img class="object-cover relative z-0" src="{{
imagekit :src=" path" n="home_thumbnail" }}" alt=""/> {{ /images }} {{ /if }} {{ if
index===0 }}
<div
class="pointer-events-none absolute bottom-0 right-0 z-20 bg-black bg-opacity-75 px-4 py-2 text-xs font-semibold text-cfhsv-blue group-hover:text-cfhsv-light-blue"
>
{{ title }}
</div>
{{ /if }}
<div
class="pointer-events-none absolute inset-0 z-10 bg-black opacity-20 transition-all duration-200 group-hover:opacity-0"
></div>
</a>
</div>
{{ /collection }} {{ /nocache }}
This obviously isn't a breaking issue but visually it makes it tough to ensure my tags are configured and balanced correctly.
Thanks!
Hi Stefano,
I just renamed an .antlers.html file to .antlers.php to use native PHP inside – and the magic Antlers highlighting is gone. :-(
Would it be possible to highlight those files as well, combined with normal PHP syntax highlighting?
Best, Jens Olaf
Describe the bug
If you add some PHP into an antlers.html
file the highlight is incorrect.
It's misleading because you feel you have some issue but the file works correctly.
OS:
Jetbrains Product:
IDE Version:
Plugin Version:
To Reproduce
Go to https://statamic.dev/antlers#syntax
Copy the example code
<a href="{{$ route('account.register') $}}">Register for a new account</a>
Expected behavior
Should keep the correct highlight as if we are using variables
{{ variable }}
Hi, when I use the reformat code function in .antlers.html file, it reformats my code badly. I'm not sure what causes this behaviour because I think it was working for me fine before. Could you please help me navigate this issue?
I tried on both the latest released version 0.0.4 and the latest main.
A normal comment looks like {{# This is a comment #}}
and this works so far. However, "Template IDE hints" are getting used more often for example in the Peak codebase. This concept originated from the Antlers Toolbox https://antlers.dev/docs/template-ide-hints. For now this plugin should be able to lex and parse them correctly to provide proper formatting.
{{#
@name The template name.
@desc A human-friendly description for your awesome template.
#}}
In the following antlers snippet the formatter in v.0.0.5 changes {{ /cells }}
to {{ / cells }}
which throws a parsing error (runtime parser):
<tr>
{{ cells }}
{{ if first && first_column_headers }}
<th class="border-b border-black bg-black px-3 py-3 text-left font-anton uppercase tracking-wider text-white xl:px-6">
{{ value }}
</th>
{{ else }}
<td class="border-b border-black px-3 py-3 text-black xl:px-6">{{ value }}</td>
{{ /if }}
{{ /cells }}
</tr>
Error: [ANTLR_131]: Unpaired closing tag.
When the Antlers plugin is enabled, the code formatting, indenting and brackets as you type is not working correctly.
PhpStorm version
PhpStorm 2022.2.1 Preview
Build #PS-222.3739.28, built on August 5, 2022
(using EAP for the UI Preview program)
Video of issue
https://www.awesomescreenshot.com/video/10406461?key=5c7ca37705ea5526a79c6935abb8a3c0
Interesting notes:
{{
appears to work correctly - it creates the correct double closing{{
and you only get one }
- expected }}
{{
and you get three }}}
closing bracketsI see there is already issue #19 regarding indentation too - was able to confirm incorrect indentation.
Formatter adds spaces around assignment operator like {{ foo = [1, 2, 3] }}
but also around the assignment of parameter values:
{{ svg src = "hamburger" class = "w-full" }}
^ ^ ^ ^
Describe the bug
A clear and concise description of what the bug is.
OS:
Jetbrains Product:
IDE Version:
Plugin Version:
To Reproduce
Steps to reproduce the behavior:
Expected behavior
Smooth fast response
Additional context
The IDE is super slow and takes over 30 seconds just to copy paste code or comment a line
New Antlers style for modifiers is:
`{{ var | modifier('hi', ['pooh', 'pea'], true, 42, $favoriteVar) }}
However the new Antlers still supports the legacy style:
{{ var group_by="date|F Y" }}
{{ var | group_by:date:F Y }}
Describe the bug
A clear and concise description of what the bug is.
OS:
Jetbrains Product:
IDE Version:
Plugin Version:
To Reproduce
Describe the bug
A clear and concise description of what the bug is.
OS:
Jetbrains Product:
IDE Version:
Plugin Version:
To Reproduce
Steps to reproduce the behavior:
resources/views/page_builder/_link_blocks.antlers.html
Expected behavior
No errors
Hey! Let me start out by saying that you've done an awesome job! I started building a similar plugin before but never finished it since it was a lot of work. Believe me when I say I know how much effort you've put into this 😄.
Nevertheless, adding a feature request: support for scopes in the grammar. Here's an example of the default template in Peak where it's used in the wild.
I'm using John Kosters Antlers Prettier formatter (https://github.com/Stillat/vscode-antlers-language-server/tree/main/formatcli/prettier-plugin-antlers) instead of the one provided by the plugin. In PhpStorm it's possible to define Prettier as formatter on Reformat Code
action which uses Prettier instead of the PhpStorm formatter. The issue is that the bundled formatter in the Antlers IDEA seems not to respect that checkbox. The issue is gone when disabling the plugin.
It would be nice if the plugin would respect that setting or the formatting capabilities could be deactivated via settings.
npm install -D prettier prettier-plugin-antlers
).prettierrc
file in the project root{
"singleQuote": true,
"trailingComma": "all",
"printWidth": 140,
"tabWidth": 16,
"endOfLine": "lf",
"plugins": [
"./node_modules/prettier-plugin-antlers/"
],
"overrides": [
{
"files": "*.antlers.html",
"options": {
"parser": "antlers",
"singleQuote": false
}
}
]
}
Settings > Languages & Frameworks > JavaScript > Prettier
{**/*,*}.{js,ts,jsx,tsx,antlers.html,vue,blade.php,css}
for Run for files:
On 'Reformat Code' action
Code > Reformat Code
<main id="content">{{ page_builder }} {{ partial src="blocks/{type}" }} {{ /page_builder }}</main>
"tabWidth": 16,
in .prettierrc
This issue lists Renovate updates and detected dependencies. Read the Dependency Dashboard docs to learn more.
These updates are currently rate-limited. Click on a checkbox below to force their creation now.
These updates have all been created already. Click a checkbox below to force a retry/rebase of any.
.github/workflows/build.yml
actions/checkout v3
gradle/wrapper-validation-action v1.0.5
actions/setup-java v3
actions/upload-artifact v3
actions/cache v3
actions/upload-artifact v3
JetBrains/qodana-action v2022.3.4
actions/upload-artifact v3
actions/checkout v3
.github/workflows/release.yml
actions/checkout v3
actions/setup-java v3
.github/workflows/run-ui-tests.yml
actions/checkout v3
actions/setup-java v3
jtalk/url-health-check-action v3
gradle.properties
junit:junit 4.13.2
org.junit.vintage:junit-vintage-engine 5.9.2
settings.gradle.kts
build.gradle.kts
org.jetbrains.kotlin.jvm 1.8.20
org.jetbrains.intellij 1.13.3
org.jetbrains.changelog 2.0.0
org.jetbrains.qodana 0.1.13
gradle/wrapper/gradle-wrapper.properties
gradle 8.0.2
Describe the bug
When using the reformat option it's adding spaces around group_by
options and others.
OS:
Jetbrains Product:
IDE Version:
2023.1.4
Plugin Version:
0.0.6
To Reproduce
Steps to reproduce the behavior:
group_by
Expected behavior
Expected spaces not to show up
Additional context
Link to Discord thread
Describe the bug
A clear and concise description of what the bug is.
OS:
Jetbrains Product:
IDE Version:
Plugin Version:
To Reproduce
layout.antlers.html
{{ partial:statamic-peak-seo::snippets/seo }}
Expected behavior
See no error
The issue was reported here:
https://plugins.jetbrains.com/plugin/19203-antlers-language-support/reviews#review=78503-78519
Hey @Konafets
thank you for the hard work on this plugin. I know it is a lot of work and I appreciate it.
I wanted to let you know, that the last days PHPStorms crashes because of the plugin. Here is the stacktrace. Maybe it helps you. It happens when selecting some text parts in the code.
e.g. selecting the word „Marktführende“
{{# Other / Extras #}}
<section class="container space-y-6 px-6 lg:space-y-2 lg:px-12">
{{# Manufacturers #}}
<div class="gap-x-16 space-y-8 md:flex md:space-y-0">
<div class="space-y-4 md:w-1/3">
<h3 class="text-lg font-semibold">Marktführende Hersteller</h3>
{{ partial:typography/paragraph :text="text" }}
</div>
<div class="flex-1">
<div class="grid grid-cols-2 gap-2 md:grid-cols-3">
{{ manufacturers }}
<div class="border-4 border-gray-300 py-4">
<img
class="mx-auto"
src="{{ glide :src='url' height='80' filter='greyscale' }}"
alt=""
/>
</div>
{{ /manufacturers }}
</div>
</div>
</div>
// some more code
</section>
Here is the stacktrace:
java.lang.Throwable: Read access is allowed from inside read-action (or EDT) only (see com.intellij.openapi.application.Application.runReadAction())
Current thread: Thread[EncodingManagerImpl Document Pool[ApplicationImpl pooled thread 3],4,main] 1027375984 (EventQueue.isDispatchThread()=false)
SystemEventQueueThread: Thread[AWT-EventQueue-0,6,main] 1110023023
at com.intellij.openapi.diagnostic.Logger.error(Logger.java:202)
at com.intellij.openapi.application.impl.ApplicationImpl.assertReadAccessAllowed(ApplicationImpl.java:1004)
at com.intellij.workspaceModel.core.fileIndex.impl.WorkspaceFileIndexDataImpl.ensureIsUpToDate(WorkspaceFileIndexDataImpl.kt:127)
at com.intellij.workspaceModel.core.fileIndex.impl.WorkspaceFileIndexDataImpl.getFileInfo(WorkspaceFileIndexDataImpl.kt:70)
at com.intellij.workspaceModel.core.fileIndex.impl.WorkspaceFileIndexImpl.getFileInfo(WorkspaceFileIndexImpl.kt:220)
at com.intellij.workspaceModel.core.fileIndex.impl.WorkspaceFileIndexImpl.findFileSet(WorkspaceFileIndexImpl.kt:180)
at com.intellij.workspaceModel.core.fileIndex.impl.WorkspaceFileIndexImpl.isInContent(WorkspaceFileIndexImpl.kt:73)
at com.intellij.openapi.roots.impl.ProjectFileIndexImpl.isInContent(ProjectFileIndexImpl.java:314)
at com.intellij.lang.PerFileMappingsBase.getNotInHierarchy(PerFileMappingsBase.java:144)
at com.intellij.lang.PerFileMappingsBase.getMappingInner(PerFileMappingsBase.java:136)
at com.intellij.lang.PerFileMappingsBase.getConfiguredMapping(PerFileMappingsBase.java:105)
at com.intellij.psi.templateLanguages.TemplateDataLanguageMappings.getMapping(TemplateDataLanguageMappings.java:46)
at de.arrobait.antlers.file.AntlersFileType$Companion.getAssociatedFileType(AntlersFileType.kt:30)
at de.arrobait.antlers.file.AntlersFileType$Companion.access$getAssociatedFileType(AntlersFileType.kt:16)
at de.arrobait.antlers.file.AntlersFileType.extractCharsetFromFileContent(AntlersFileType.kt:55)
at com.intellij.openapi.fileTypes.CharsetUtil.extractCharsetFromFileContent(CharsetUtil.java:33)
at com.intellij.openapi.fileEditor.impl.LoadTextUtil.charsetFromContentOrNull(LoadTextUtil.java:470)
at com.intellij.openapi.vfs.encoding.EncodingManagerImpl.handleDocument(EncodingManagerImpl.java:131)
at com.intellij.openapi.vfs.encoding.EncodingManagerImpl$DocumentEncodingDetectRequest.run(EncodingManagerImpl.java:203)
at com.intellij.util.concurrency.BoundedTaskExecutor.doRun(BoundedTaskExecutor.java:248)
at com.intellij.util.concurrency.BoundedTaskExecutor.access$200(BoundedTaskExecutor.java:28)
at com.intellij.util.concurrency.BoundedTaskExecutor$1.executeFirstTaskAndHelpQueue(BoundedTaskExecutor.java:221)
at com.intellij.util.ConcurrencyUtil.runUnderThreadName(ConcurrencyUtil.java:227)
at com.intellij.util.concurrency.BoundedTaskExecutor$1.run(BoundedTaskExecutor.java:210)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
at java.base/java.util.concurrent.Executors$PrivilegedThreadFactory$1$1.run(Executors.java:702)
at java.base/java.util.concurrent.Executors$PrivilegedThreadFactory$1$1.run(Executors.java:699)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
at java.base/java.util.concurrent.Executors$PrivilegedThreadFactory$1.run(Executors.java:699)
at java.base/java.lang.Thread.run(Thread.java:833)
Following exceptions happened soon after this one, most probably they are induced.
2023-04-27T13:58:37.291
java.lang.Throwable: Read access is allowed from inside read-action (or EDT) only (see com.intellij.openapi.application.Application.runReadAction())
Current thread: Thread[EncodingManagerImpl Document Pool[ApplicationImpl pooled thread 4],4,main] 1507409463 (EventQueue.isDispatchThread()=false)
SystemEventQueueThread: Thread[AWT-EventQueue-0,6,main] 1110023023
at com.intellij.openapi.diagnostic.Logger.error(Logger.java:202)
at com.intellij.openapi.application.impl.ApplicationImpl.assertReadAccessAllowed(ApplicationImpl.java:1004)
at com.intellij.workspaceModel.core.fileIndex.impl.WorkspaceFileIndexDataImpl.ensureIsUpToDate(WorkspaceFileIndexDataImpl.kt:127)
at com.intellij.workspaceModel.core.fileIndex.impl.WorkspaceFileIndexDataImpl.getFileInfo(WorkspaceFileIndexDataImpl.kt:70)
at com.intellij.workspaceModel.core.fileIndex.impl.WorkspaceFileIndexImpl.getFileInfo(WorkspaceFileIndexImpl.kt:220)
at com.intellij.workspaceModel.core.fileIndex.impl.WorkspaceFileIndexImpl.findFileSet(WorkspaceFileIndexImpl.kt:180)
at com.intellij.workspaceModel.core.fileIndex.impl.WorkspaceFileIndexImpl.isInContent(WorkspaceFileIndexImpl.kt:73)
at com.intellij.openapi.roots.impl.ProjectFileIndexImpl.isInContent(ProjectFileIndexImpl.java:314)
at com.intellij.lang.PerFileMappingsBase.getNotInHierarchy(PerFileMappingsBase.java:144)
at com.intellij.lang.PerFileMappingsBase.getMappingInner(PerFileMappingsBase.java:136)
at com.intellij.lang.PerFileMappingsBase.getConfiguredMapping(PerFileMappingsBase.java:105)
at com.intellij.psi.templateLanguages.TemplateDataLanguageMappings.getMapping(TemplateDataLanguageMappings.java:46)
at de.arrobait.antlers.file.AntlersFileType$Companion.getAssociatedFileType(AntlersFileType.kt:30)
at de.arrobait.antlers.file.AntlersFileType$Companion.access$getAssociatedFileType(AntlersFileType.kt:16)
at de.arrobait.antlers.file.AntlersFileType.extractCharsetFromFileContent(AntlersFileType.kt:55)
at com.intellij.openapi.fileTypes.CharsetUtil.extractCharsetFromFileContent(CharsetUtil.java:33)
at com.intellij.openapi.fileEditor.impl.LoadTextUtil.charsetFromContentOrNull(LoadTextUtil.java:470)
at com.intellij.openapi.vfs.encoding.EncodingManagerImpl.handleDocument(EncodingManagerImpl.java:131)
at com.intellij.openapi.vfs.encoding.EncodingManagerImpl$DocumentEncodingDetectRequest.run(EncodingManagerImpl.java:203)
at com.intellij.util.concurrency.BoundedTaskExecutor.doRun(BoundedTaskExecutor.java:248)
at com.intellij.util.concurrency.BoundedTaskExecutor.access$200(BoundedTaskExecutor.java:28)
at com.intellij.util.concurrency.BoundedTaskExecutor$1.executeFirstTaskAndHelpQueue(BoundedTaskExecutor.java:221)
at com.intellij.util.ConcurrencyUtil.runUnderThreadName(ConcurrencyUtil.java:227)
at com.intellij.util.concurrency.BoundedTaskExecutor$1.run(BoundedTaskExecutor.java:210)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
at java.base/java.util.concurrent.Executors$PrivilegedThreadFactory$1$1.run(Executors.java:702)
at java.base/java.util.concurrent.Executors$PrivilegedThreadFactory$1$1.run(Executors.java:699)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
at java.base/java.util.concurrent.Executors$PrivilegedThreadFactory$1.run(Executors.java:699)
at java.base/java.lang.Thread.run(Thread.java:833)
Follow-up from #116
Antlers support the concept of interpolated statements, which means, one can insert Antlers into a Antlers node:
{{ items = {collection:products sort="rating:desc" limit="5"} }}
While this already works, I discovered a special case, where an Antlers switch
statement is inserted into the string value of a class
attribute:
{{ svg
:src="type"
alt=""
aria-hidden="true"
class="
h-5 w-5 fill-current motion-safe:transition-colors
{ switch(
(type == 'success') => 'text-green-800',
(type == 'notice') => 'text-yellow-800',
(type == 'error') => 'text-red-800',
() => 'text-gray-800'
)}
"
}}
Antlers allows multiple statements inside a block, separated by a semicolon ;
called the Terminator.
Allow modifiers in conditionals like if
, elseif
and unless
. Testing code: {{ if summary | contains:BEST }}
It seems the plugin does not support PhpStorm 2023.1 atm.
When I start typing {{
it autocompletes to {{ }''
instead of {{ }}
.
I am not sure why this happens but it stops when I disable the plugin.
The last days I have very bad performance issues when activating the plugin. They are so bad, that every typing or moving with keys has lags of 2-3secs or more.
I love the plugin, but under this circumstances I can not use it. After deactivating the plugin the performance issues are gone.
After update phpstorm now the plugin is not usable.
It seems like the plugin currently confuses PhpStorm if you have the plugin enabled and try to edit a regular .HTML file.
Code highlighting and executing the comment shortcut do not function correctly.
I don't know how this plugin exactly works, but maybe the file extension pattern is incorrect?
This has been tested using a scratch file on PhpStorm 2022.2.4 with plugin version 0.0.5.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.