getgrav / grav-plugin-archives Goto Github PK
View Code? Open in Web Editor NEWGrav Archives Plugin
Home Page: https://getgrav.org
License: MIT License
Grav Archives Plugin
Home Page: https://getgrav.org
License: MIT License
Could we get a "Date Published - based on publish_date field in page header" option, with a fallback to date if publish_date isn't available?
The blueprints.yaml only support limited type of date format
some countries use different date format for example:
China uses format like "2019年-05月-08日"
Japan uses format like "令和元年5月" etc. very tricky though...
maybe add more options for the users using the date format like 'Y-m':"2019-05"
or a custom input box to input the format settings in the web interface
date_display_format:
type: select
size: medium
classes: fancy
label: Date Format
default: 'jS M Y'
options:
'F jS Y': "January 1st 2014"
'l jS of F': "Monday 1st of January"
'D, m M Y': "Mon, 01 Jan 2014"
'd-m-y': "01-01-14"
'jS M Y': "10th Feb 2014"
'F Y': "Jan 2015"
I just started playing around with grav the other day, but I did notice something I would like to do with the output of the archives... sorting by year then month within each year?
Is this possible? I know I can do something like archives_year:2014
and archives_month:jun_2014
, but is the looping possible the way the plugin is setup?
The default is something along the lines of :
{% for month,items in archives_data %}
<li>
<a href="{{ base_url }}/{{ config.plugins.archives.taxonomy_names.month }}{{ config.system.param_sep }}{{ month|date('M_Y')|lower|e('url') }}">
{{ month }}
</a>
{% if archives_show_count %}
({{ items|length }})
{% endif %}
</li>
{% endfor %}
I would need a loop for each year and then another for each month/item in that year... so is there a way to 'store' each result array and loop through each month then?
I've been noticing that nothing is displayed under my Archives area in the sidebar and looking at the Grav Blog Site demo it seems to be the same case:
https://demo.getgrav.org/blog-skeleton/
Was there a recent change that required a config update?
Thank you very much
Mario
{{ dump(route)) }} works
{{ dump(raw_route)) }} returns null
Using Grav - Gantry5 and Helium
Hi guys,
I've been playing a bit with the archives and it seems that somehow the months appear to be translated using antimatter theme.
The issue is that pressing "march" will result in the same page being loaded with same articles, the only thing changed being the url with the addition of the archives:march ...
Same thing happens with June, July, any months. It will display same articles on the same page.
(Started from TwentyFifteen skeleton, added Admin plugin, updated all.)
Turning "Show Count" off should show the list of months with the post counts removed
Archive month list disappears forever. Clearing the cache doesn't help. Must reinstall Grav.
Hello,
After an update, I get a bug when using archives plugin on some pages only. In browser, I get :
Server Error
Sorry, something went terribly wrong!
0 - Call to a member function children() on null
For further details please review your logs/ folder, or enable displaying of errors in your system configuration.
Her is the log :
[2020-08-05 16:56:53] grav.CRITICAL: Call to a member function children() on null - Trace: #0 /user/plugins/archives/archives.php(144): Grav\Plugin\ArchivesPlugin->getArchives(Array, 'and', Array) #1 /vendor/symfony/event-dispatcher/EventDispatcher.php(212): Grav\Plugin\ArchivesPlugin->onTwigSiteVariables(Object(RocketTheme\Toolbox\Event\Event), 'onTwigSiteVaria...', Object(RocketTheme\Toolbox\Event\EventDispatcher)) #2 /vendor/symfony/event-dispatcher/EventDispatcher.php(44): Symfony\Component\EventDispatcher\EventDispatcher->doDispatch(Array, 'onTwigSiteVaria...', Object(RocketTheme\Toolbox\Event\Event)) #3 /vendor/rockettheme/toolbox/Event/src/EventDispatcher.php(23): Symfony\Component\EventDispatcher\EventDispatcher->dispatch('onTwigSiteVaria...', Object(RocketTheme\Toolbox\Event\Event)) #4 /system/src/Grav/Common/Grav.php(403): RocketTheme\Toolbox\Event\EventDispatcher->dispatch('onTwigSiteVaria...', Object(RocketTheme\Toolbox\Event\Event)) #5 /system/src/Grav/Common/Twig/Twig.php(363): Grav\Common\Grav->fireEvent('onTwigSiteVaria...') #6 /system/src/Grav/Common/Service/OutputServiceProvider.php(28): Grav\Common\Twig\Twig->processSite('html') #7 /vendor/pimple/pimple/src/Pimple/Container.php(118): Grav\Common\Service\OutputServiceProvider->Grav\Common\Service{closure}(Object(Grav\Common\Grav)) #8 /system/src/Grav/Common/Processors/RenderProcessor.php(28): Pimple\Container->offsetGet('output') #9 /system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(45): Grav\Common\Processors\RenderProcessor->process(Object(Nyholm\Psr7\ServerRequest), Object(Grav\Framework\RequestHandler\RequestHandler)) #10 /system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(57): Grav\Framework\RequestHandler\RequestHandler->handle(Object(Nyholm\Psr7\ServerRequest)) #11 /system/src/Grav/Common/Processors/DebuggerAssetsProcessor.php(28): Grav\Framework\RequestHandler\RequestHandler->handle(Object(Nyholm\Psr7\ServerRequest)) #12 /system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(45): Grav\Common\Processors\DebuggerAssetsProcessor->process(Object(Nyholm\Psr7\ServerRequest), Object(Grav\Framework\RequestHandler\RequestHandler)) #13 /system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(57): Grav\Framework\RequestHandler\RequestHandler->handle(Object(Nyholm\Psr7\ServerRequest)) #14 /system/src/Grav/Common/Processors/PagesProcessor.php(69): Grav\Framework\RequestHandler\RequestHandler->handle(Object(Nyholm\Psr7\ServerRequest)) #15 /system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(45): Grav\Common\Processors\PagesProcessor->process(Object(Nyholm\Psr7\ServerRequest), Object(Grav\Framework\RequestHandler\RequestHandler)) #16 /system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(57): Grav\Framework\RequestHandler\RequestHandler->handle(Object(Nyholm\Psr7\ServerRequest)) #17 /system/src/Grav/Common/Processors/TwigProcessor.php(27): Grav\Framework\RequestHandler\RequestHandler->handle(Object(Nyholm\Psr7\ServerRequest)) #18 /system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(45): Grav\Common\Processors\TwigProcessor->process(Object(Nyholm\Psr7\ServerRequest), Object(Grav\Framework\RequestHandler\RequestHandler)) #19 /system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(57): Grav\Framework\RequestHandler\RequestHandler->handle(Object(Nyholm\Psr7\ServerRequest)) #20 /system/src/Grav/Common/Processors/AssetsProcessor.php(28): Grav\Framework\RequestHandler\RequestHandler->handle(Object(Nyholm\Psr7\ServerRequest)) #21 /system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(45): Grav\Common\Processors\AssetsProcessor->process(Object(Nyholm\Psr7\ServerRequest), Object(Grav\Framework\RequestHandler\RequestHandler)) #22 /system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(57): Grav\Framework\RequestHandler\RequestHandler->handle(Object(Nyholm\Psr7\ServerRequest)) #23 /system/src/Grav/Common/Processors/SchedulerProcessor.php(29): Grav\Framework\RequestHandler\RequestHandler->handle(Object(Nyholm\Psr7\ServerRequest)) #24 /system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(45): Grav\Common\Processors\SchedulerProcessor->process(Object(Nyholm\Psr7\ServerRequest), Object(Grav\Framework\RequestHandler\RequestHandler)) #25 /system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(57): Grav\Framework\RequestHandler\RequestHandler->handle(Object(Nyholm\Psr7\ServerRequest)) #26 /system/src/Grav/Common/Processors/BackupsProcessor.php(28): Grav\Framework\RequestHandler\RequestHandler->handle(Object(Nyholm\Psr7\ServerRequest)) #27 /system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(45): Grav\Common\Processors\BackupsProcessor->process(Object(Nyholm\Psr7\ServerRequest), Object(Grav\Framework\RequestHandler\RequestHandler)) #28 /system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(57): Grav\Framework\RequestHandler\RequestHandler->handle(Object(Nyholm\Psr7\ServerRequest)) #29 /system/src/Grav/Common/Processors/TasksProcessor.php(59): Grav\Framework\RequestHandler\RequestHandler->handle(Object(Nyholm\Psr7\ServerRequest)) #30 /system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(45): Grav\Common\Processors\TasksProcessor->process(Object(Nyholm\Psr7\ServerRequest), Object(Grav\Framework\RequestHandler\RequestHandler)) #31 /system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(57): Grav\Framework\RequestHandler\RequestHandler->handle(Object(Nyholm\Psr7\ServerRequest)) #32 /system/src/Grav/Common/Processors/RequestProcessor.php(52): Grav\Framework\RequestHandler\RequestHandler->handle(Object(Nyholm\Psr7\ServerRequest)) #33 /system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(45): Grav\Common\Processors\RequestProcessor->process(Object(Nyholm\Psr7\ServerRequest), Object(Grav\Framework\RequestHandler\RequestHandler)) #34 /system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(57): Grav\Framework\RequestHandler\RequestHandler->handle(Object(Nyholm\Psr7\ServerRequest)) #35 /system/src/Grav/Common/Processors/ThemesProcessor.php(27): Grav\Framework\RequestHandler\RequestHandler->handle(Object(Nyholm\Psr7\ServerRequest)) #36 /system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(45): Grav\Common\Processors\ThemesProcessor->process(Object(Nyholm\Psr7\ServerRequest), Object(Grav\Framework\RequestHandler\RequestHandler)) #37 /system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(57): Grav\Framework\RequestHandler\RequestHandler->handle(Object(Nyholm\Psr7\ServerRequest)) #38 /system/src/Grav/Common/Processors/PluginsProcessor.php(30): Grav\Framework\RequestHandler\RequestHandler->handle(Object(Nyholm\Psr7\ServerRequest)) #39 /system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(45): Grav\Common\Processors\PluginsProcessor->process(Object(Nyholm\Psr7\ServerRequest), Object(Grav\Framework\RequestHandler\RequestHandler)) #40 /system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(57): Grav\Framework\RequestHandler\RequestHandler->handle(Object(Nyholm\Psr7\ServerRequest)) #41 /system/src/Grav/Common/Processors/InitializeProcessor.php(95): Grav\Framework\RequestHandler\RequestHandler->handle(Object(Nyholm\Psr7\ServerRequest)) #42 /system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(45): Grav\Common\Processors\InitializeProcessor->process(Object(Nyholm\Psr7\ServerRequest), Object(Grav\Framework\RequestHandler\RequestHandler)) #43 /system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(57): Grav\Framework\RequestHandler\RequestHandler->handle(Object(Nyholm\Psr7\ServerRequest)) #44 /system/src/Grav/Common/Processors/DebuggerProcessor.php(27): Grav\Framework\RequestHandler\RequestHandler->handle(Object(Nyholm\Psr7\ServerRequest)) #45 /system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(45): Grav\Common\Processors\DebuggerProcessor->process(Object(Nyholm\Psr7\ServerRequest), Object(Grav\Framework\RequestHandler\RequestHandler)) #46 /system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(57): Grav\Framework\RequestHandler\RequestHandler->handle(Object(Nyholm\Psr7\ServerRequest)) #47 /system/src/Grav/Common/Processors/ErrorsProcessor.php(27): Grav\Framework\RequestHandler\RequestHandler->handle(Object(Nyholm\Psr7\ServerRequest)) #48 /system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(45): Grav\Common\Processors\ErrorsProcessor->process(Object(Nyholm\Psr7\ServerRequest), Object(Grav\Framework\RequestHandler\RequestHandler)) #49 /system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(57): Grav\Framework\RequestHandler\RequestHandler->handle(Object(Nyholm\Psr7\ServerRequest)) #50 /system/src/Grav/Common/Processors/LoggerProcessor.php(48): Grav\Framework\RequestHandler\RequestHandler->handle(Object(Nyholm\Psr7\ServerRequest)) #51 /system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(45): Grav\Common\Processors\LoggerProcessor->process(Object(Nyholm\Psr7\ServerRequest), Object(Grav\Framework\RequestHandler\RequestHandler)) #52 /system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(57): Grav\Framework\RequestHandler\RequestHandler->handle(Object(Nyholm\Psr7\ServerRequest)) #53 /system/src/Grav/Common/Processors/ConfigurationProcessor.php(28): Grav\Framework\RequestHandler\RequestHandler->handle(Object(Nyholm\Psr7\ServerRequest)) #54 /system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(45): Grav\Common\Processors\ConfigurationProcessor->process(Object(Nyholm\Psr7\ServerRequest), Object(Grav\Framework\RequestHandler\RequestHandler)) #55 /system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(57): Grav\Framework\RequestHandler\RequestHandler->handle(Object(Nyholm\Psr7\ServerRequest)) #56 /system/src/Grav/Common/Grav.php(272): Grav\Framework\RequestHandler\RequestHandler->handle(Object(Nyholm\Psr7\ServerRequest)) #57 /index.php(54): Grav\Common\Grav->process() #58 {main} [] []
Hello!
It's not an issue, but a question/enhancement.
How to create the same URL and filters for each post in blog?
Post: https://bestblog.wordpress.com/2007/06/13/elle-effect/
Day: https://bestblog.wordpress.com/2007/06/13/
Month: https://bestblog.wordpress.com/2007/06/
Year: https://bestblog.wordpress.com/2007/
Do I need to create 3 level of nested folders? Or maybe if I have folder name 2007-06-13-elle-effect
I can do it with redirects or something?
It should work with a multilingual site.
First of all: Grav is great. I just started a website for my brother and i'm almost done :). Really love it.
The missing piece now is the archives for the website's news/blog section.
After understanding the code, i realized, that i have to put (according to my filter configuration) a certain taxonomy on every news item (no other filter possible).
So i think this pretty redundant and not as nice as in grav-plugin-simplesearch, where you can put the @self filter on the news listing page to gather child items: https://github.com/getgrav/grav-plugin-simplesearch/blob/develop/simplesearch.php#L142
If you like, i can make a pull request!
Best Regards,
Sebastian
PS: Also wished to have the query params (e.g. archives_year) configurable... don't like underscores in the URL and would prefer a simple year
The config option date_display_format
is handed over to the PHP date()
function, which accepts a certain list of format characters. However, when I tried to change this option to 'Y m'
, the page will throw an exception:
An exception has been thrown during the rendering of a template ("DateTime::__construct(): Failed to parse time string (2016 06) at position 5 (0): Unexpected character").
Which points to plugins/archives/templates/partials/archives.html.twig
, line 5.
Also:
'Y-m'
(dash between), it works as expected'年Y月m'
The expected behavior is that any format character/ string, as outlined in the PHP documentation (see above) can be used for this option and no exception is thrown. At the very least, better documentation is needed to understand what format characters can be used or can't be used (and why).
I have an "Archive" sidebar item. Any page within the /blog list will show the archive list, but regular pages outside the blog just show a blank area. Here is my config:
enabled: true
built_in_css: true
date_display_format: 'F Y'
show_count: true
limit: 12
taxonomy_names:
month: archives_month
year: archives_year
taxonomy_values:
month: 'M_Y'
year: 'Y'
#Defaults
order:
by: date
dir: desc
filters:
category:
filter_combinator: and
#New Page-Specific Configurations
page_specific_config:
- route: '/blog'
order:
by: date
dir: desc
filters:
page@: '/blog'
filter_combinator: and
I have tried playing around with the route
. The archive links will show up if I leave it blank, but the links themselves just route back to the homepage and not the taxonomy page.
This feels simple, but I keep missing it.
Hi,
when I use "Y" as date_display_format it need to preserve_keys in array_slice function: see row 119. I have made this change:
$archives = array_slice($archives, 0, intval($this->config->get('plugins.archives.limit')), true);
Hi,
I accidentally published a blog post that had a date of October 2020 and now my Archive Plugin displays that, is there anyway of clearing that entry so it doesn’t display?
Thanks,
Sarah
Hi,
how can I translate the months?
its now in English, we want it in the local language
best regards
Is there any purpose for this? If not, just needs $collection->published();
after line 151.
Hi guys,
when the yaml will include the following syntax, the archives do not work.
Could it be that this may as well be an enhancement in the future?
the code is at follows:
enabled: true
built_in_css: true
date_display_format: 'F Y'
show_count: true
limit: 12
order:
by: date
dir: desc
filter_combinator: and
filters:
category:
- blog
- marturii
if the category is only one (ex: blog) the archives are appearing on the sidebar. if there are 2 or more categories then the archives is empty field with only the header.
not sure if this an issue but this would be a scenario where I could use the archives to show me only specific articles related to specific page collections.
Hi guys,
Been playing with the Archives for a while now trying to make sure translate is ok. I ran into this little issue as per the picture.
this is my configs of archives.yaml in both the plugin/partial, config/archives.yaml and theme/templates/partials/archives in their respective order.
<ul class="archives">
{% for month,items in archives_data %}
<li>
<a href="{{ base_url }}/archives_month{{ config.system.param_sep }}{{ month|date('M_Y')|lower|e('url') }}">
{% if archives_show_count %}
<span class="label">{{ items|length }}</span>
{% endif %}
<span class="archive_date">{{ month }}</span>
</a>
</li>
{% endfor %}
</ul>
enabled: true
built_in_css: true
date_display_format: 'F jS Y'
show_count: true
limit: 12
order:
by: date
dir: desc
filter_combinator: and
filters:
category:
- blog
<ul class="archives">
{% for month, items in archives_data %}
<li>
<a href="{{ base_url }}/arhive{{ config.system.param_sep }}{{ month|date('M_Y')|lower|e('url') }}">
{% if archives_show_count %}
<span class="label">{{ items|length }}</span>
{% endif %}
<span class="archive_date">{{ 'MONTHS_OF_THE_YEAR'|ta(month|date('n') -1) }} {{ month|date('Y') }}</span>
</a>
</li>
{% endfor %}
</ul>
Cannot understand where the duplicate month is appearing. Also on the live site the archives are more, as there are more articles. I am sure I must have done something :P just cant figure out what, or maybe it's a bug/issue ?
Hi,
I have this plugin filtering blog pages under /blog
folder. My blog folder is organised with subfolders for each year. Each blog page has blog
taxonomy category. However, this plugin doesn't seem to iterate through subfolders. Can anyone advise how to make it work this way?
Hello,
due to grav caching, only one cached version of the archive page is displayed at a time, no matter what parameters are specified in the URL. It would be necessary to disable caching for the archive pages.
Hi rhukster
As seen on the forum, I have a problem with the archive plugin since I use multilanguage support. My website is in French, so I declared in admin plugin this language (fr), and only this language. Since this change, when I use the archive plugin, there is no results returned for a year or a month. However, the number of articles showed near the links is correct.
With the archive plus plugin, the problem is the same, except that all articles are returned as results whatever the link for years or months.
Thx
Ludo
I've been noticing that nothing is displayed under my Archives area in the sidebar on multiple projects, and looking at the Grav Blog Site demo it seems to be the same case:
https://demo.getgrav.org/blog-skeleton/
Was there a recent change that required a config update?
Thanks very much,
Paul
I have successfully setup the archive plugin but when clicked on an item the result is always empty. I use a different language, could that be the problem? You can have a look here: http://vzwdeschakelbe.webhosting.be/nieuws
There should be field for MONTHS_OF_THE_YEAR where to add translated month text and archives plugin use it.
Like in twentyfifteen theme there is in languages.yaml file MONTHS_OF_THE_YEAR: [Tammikuu, Helmikuu, Maaliskuu, Huhtikuu, Toukokuu, Kesäkuu, Heinäkuu, Elokuu, Syyskuu, Lokakuu, Marraskuu, Joulukuu]
I have a multilanguage blog.
The hierachy like this:
/3d-printers type:blog
page1 fr type:item
page2 fr type:item
/software blog
page1 fr type:item
page2 fr type:item
I've tried both Archive Plus and Archive. Archive Plus displays the items in the blog but Archive does not. Please notice that all item
have a category of blog
The configuration for the Archive plugin is:
enabled: true
built_in_css: true
date_display_format: 'F Y'
show_count: true
limit: 12
taxonomy_names:
month: archives_month
year: archives_year
order:
by: date
dir: desc
filters:
category: blog
filter_combinator: and
I do see an "Archive" title in the sidebar but without any page listing. With Archive Plus, I get a list of items plus the month.
If I click on a month, it's redirecting to https://mysite.com/fr/archive:déc_2020
(or https://mysite.com/en/archive:dec_2020
)
This is nothing to answer for this page, so the "Home" page is returned.
Please notice that I have SimpleSearch plugin and it's working fine to display posts related to the searched item, so the url parsing is working.
I don't know how to:
Archive
to list my posts (I've also added a page route but I don't understand what to put in there nor what it means).Archive
to answer an logical url like https://mysite.com/en/software/archives_month:dec_2020
(if I enter this URL manually it's working, so there is something wrong in between).I did setup 2 separate blogs on site using 2 blog_list pages. Archive plugin missing the blog_list page route in links to archived pages. I solved this with a quick hack. Please check it out.
Added new variable "route" in user/plugins/archives/archives.php
if ($new_approach) {
$collection = $page->children();
+ $this->grav['twig']->twig_vars['route'] = $page->route();
} else {
Added "route" in user/plugins/archives/templates/partials/archives.html.twig
<a href="{{ base_url }}{{ route }}/{{ config.plugins.archives.taxonomy_names.month }}{{ config.system.param_sep }}{{ month|date('M_Y')|lower|e('url') }}">
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.