“dc45cb4b9d03c413dec807bc287af7135191a4c8”上不存在“git@gitcode.net:paddlepaddle/PaddleDetection.git”
提交 861fac1e 编写于 作者: Lab机器人's avatar Lab机器人

init

上级
image: ruby:latest
variables:
JEKYLL_ENV: production
LC_ALL: C.UTF-8
before_script:
- gem install bundler
- bundle install
pages:
stage: deploy
script:
- bundle exec jekyll build -d public
artifacts:
paths:
- public
rules:
- if: $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH
// For format details, see https://aka.ms/devcontainer.json. For config options, see the README at:
// https://github.com/microsoft/vscode-dev-containers/tree/v0.245.2/containers/docker-existing-dockerfile
{
"name": "Existing Dockerfile",
// Sets the run context to one level up instead of the .devcontainer folder.
"context": "..",
// Update the 'dockerFile' property if you aren't using the standard 'Dockerfile' filename.
"dockerFile": "../.dockerfile"
// Use 'forwardPorts' to make a list of ports inside the container available locally.
// "forwardPorts": [],
// Uncomment the next line to run commands after the container is created - for example installing curl.
// "postCreateCommand": "apt-get update && apt-get install -y curl",
// Uncomment when using a ptrace-based debugger like C++, Go, and Rust
// "runArgs": [ "--cap-add=SYS_PTRACE", "--security-opt", "seccomp=unconfined" ],
// Uncomment to use the Docker CLI from inside the container. See https://aka.ms/vscode-remote/samples/docker-from-docker.
// "mounts": [ "source=/var/run/docker.sock,target=/var/run/docker.sock,type=bind" ],
// Uncomment to connect as a non-root user if you've added one. See https://aka.ms/vscode-remote/containers/non-root.
// "remoteUser": "vscode"
}
# # Create a Jekyll container form a Ruby Apline image
# # At a minimum, use Ruby 2.5 or Later
# FROM ruby:2.7-alpine3.15
# # Add Jekyll dependencies to Alpine
# RUN apk update
# RUN apk add --no-cache build-base gcc cmake git
# # Upate the Ruby bundler and install Jekyll
# RUN gem update bundler
# RUN gem install bundler jekyll
FROM ruby:2.3 as build
ENV JEKYLL_ENV: production
WORKDIR /usr/src/app
COPY . /usr/src/app
RUN bundle install && \
bundle exec jekyll build -d public
FROM nginx:1.13-alpine
COPY --from=build /usr/src/app/public/ /usr/share/nginx/html/
\ No newline at end of file
# editorconfig.org
root = true
[*]
charset = utf-8
end_of_line = lf
indent_size = 2
indent_style = space
insert_final_newline = true
trim_trailing_whitespace = true
[*.md]
trim_trailing_whitespace = false
# These are supported funding model platforms
github: jeffreytse # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: jeffreytse
open_collective: # Replace with a single Open Collective username
ko_fi: jeffreytse
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: jeffreytse
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
name: Github Pages
on:
push:
branches:
- master # Here source code branch is `master`, it could be other branch
jobs:
build_and_deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
# Use GitHub Actions' cache to cache dependencies on servers
- uses: actions/cache@v1
with:
path: vendor/bundle
key: ${{ runner.os }}-gems-${{ hashFiles('**/Gemfile.lock') }}
restore-keys: |
${{ runner.os }}-gems-
# Use GitHub Deploy Action to build and deploy to Github
- uses: jeffreytse/jekyll-deploy-action@master
with:
provider: 'github'
token: ${{ secrets.GITHUB_TOKEN }} # It's your Personal Access Token(PAT)
repository: '' # Default is current repository
branch: 'gh-pages' # Default is gh-pages for github provider
jekyll_src: './' # Default is root directory
jekyll_cfg: '_config.yml' # Default is _config.yml
jekyll_baseurl: '/jekyll-theme-yat' # Default is empty
cname: '' # Default is to not use a cname
actor: '' # Default is the GITHUB_ACTOR
*.gem
.bundle
.sass-cache
_site
Gemfile.lock
---
layout: 404
---
# frozen_string_literal: true
source "https://rubygems.org"
gemspec
gem "kramdown-parser-gfm"
\ No newline at end of file
The MIT License (MIT)
Copyright (c) 2019 Jeffrey Tse
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
<div align="center">
<br>
<a href="https://github.com/jeffreytse/jekyll-theme-yat">
<img alt="jekyll-theme-yat →~ jekyll" src="https://user-images.githubusercontent.com/9413601/106478481-346fdf00-64e4-11eb-9385-1ab5329c3234.png" width="600">
</a>
<h1>JEKYLL YAT THEME</h1>
</div>
<h4 align="center">
<a href="https://jekyllrb.com/" target="_blank"><code>Jekyll</code></a> theme for elegant writers.
</h4>
<p align="center">
<a href="https://jeffreytse.github.io/jekyll-theme-yat">
<img src="https://github.com/jeffreytse/jekyll-theme-yat/workflows/Github%20Pages/badge.svg"
alt="Github Pages" />
</a>
<a href="https://badge.fury.io/rb/jekyll-theme-yat">
<img src="https://badge.fury.io/rb/jekyll-theme-yat.svg"
alt="Gem Version" />
</a>
<a href="https://opensource.org/licenses/MIT">
<img src="https://img.shields.io/badge/License-MIT-brightgreen.svg"
alt="License: MIT" />
</a>
<a href="https://liberapay.com/jeffreytse">
<img src="https://img.shields.io/liberapay/goal/jeffreytse.svg?logo=liberapay"
alt="Donate (Liberapay)" />
</a>
<a href="https://patreon.com/jeffreytse">
<img src="https://img.shields.io/badge/support-patreon-F96854.svg?style=flat-square"
alt="Donate (Patreon)" />
</a>
<a href="https://ko-fi.com/jeffreytse">
<img height="20" src="https://www.ko-fi.com/img/githubbutton_sm.svg"
alt="Donate (Ko-fi)" />
</a>
</p>
<div align="center">
<sub>Built with ❤︎ by
<a href="https://jeffreytse.net">jeffreytse</a> and
<a href="https://github.com/jeffreytse/jekyll-theme-yat/graphs/contributors">contributors </a>
</sub>
</div>
<br>
Hey, nice to meet you, you found this [Jekyll][jekyll] theme. Here the
_YAT (Yet Another Theme)_ is a modern responsive theme. It's quite
clear, clean and neat for writers and posts. **If you are an elegant
writer and focus on content, don't miss it.**
<p align="center">
Like this elegant theme? You can give it a star or sponsor me!<br>
I will respect your crucial support and say THANK YOU!
</p>
<p align="center">
<img src="https://user-images.githubusercontent.com/9413601/91842897-6a840b00-ec87-11ea-95ca-52abcc1ac063.png" alt="demo-screenshot" width="100%"/>
</p>
<h4 align="center">BANNER</h4>
<p align="center">
<img src="https://user-images.githubusercontent.com/9413601/123897812-ae729a00-d996-11eb-96b8-b76ba926f555.gif" alt="demo-screenshot" width="100%"/>
</p>
## Features
- Support beautiful **Night Mode**.
- Modern responsive web design.
- Full layouts `home`, `post`, `tags`, `archive` and `about`.
- Uses font awesome 5 for icons.
- Beautiful page banner with image and video.
- Beautiful Syntax Highlight using [highlight.js][highlight-js].
- RSS support using [Jekyll Feed][jekyll-feed] gem.
- Optimized for search engines using [Jekyll Seo Tag][jekyll-seo-tag] gem.
- Sitemap support using [Jekyll Sitemap][jekyll-sitemap] gem.
- Complex and flexible table support using [Jekyll Spaceship][jekyll-spaceship] gem.
- MathJAX and LaTeX optional support using [Jekyll Spaceship][jekyll-spaceship] gem.
- Media (Youtube, Spotify, etc.) support using [Jekyll Spaceship][jekyll-spaceship] gem.
- Diagram (PlantUML, Mermaid) support using [Jekyll Spaceship][jekyll-spaceship] gem.
- Google Translation support.
- New post tag support.
Also, visit the [Live Demo][yat-live-demo] site for the theme.
## Installation
There are three ways to install:
- As a [gem-based theme](https://jekyllrb.com/docs/themes/#understanding-gem-based-themes).
- As a [remote theme](https://blog.github.com/2017-11-29-use-any-theme-with-github-pages/) (GitHub Pages compatible).
- Forking/directly copying all of the theme files into your project.
### Gem-based Theme Method
Add this line to your Jekyll site's `Gemfile`:
```ruby
gem "jekyll-theme-yat"
```
And add this line to your Jekyll site's `_config.yml`:
```yaml
theme: jekyll-theme-yat
```
And then execute:
```bash
$ bundle
```
Or install it yourself as:
```bash
$ gem install jekyll-theme-yat
```
### Remote Theme Method with GitHub Pages
Remote themes are similar to Gem-based themes, but do not require `Gemfile` changes or whitelisting making them ideal for sites hosted with GitHub Pages.
To install:
Add this line to your Jekyll site's `Gemfile`:
```ruby
gem "github-pages", group: :jekyll_plugins
```
And add this line to your Jekyll site's `_config.yml`:
```yaml
# theme: owner/name --> Don't forget to remove/comment the gem-based theme option
remote_theme: "jeffreytse/jekyll-theme-yat"
```
And then execute:
```bash
$ bundle
```
### GitHub Pages without limitation
GitHub Pages runs in `safe` mode and only allows [a set of whitelisted plugins/themes](https://pages.github.com/versions/). **In other words, the third-party gems will not work normally**.
To use the third-party gem in GitHub Pages without limitation:
Here is a GitHub Action named [jekyll-deploy-action](https://github.com/jeffreytse/jekyll-deploy-action) for Jekyll site deployment conveniently. 👍
## Usage
Add or update your available layouts, includes, sass and/or assets.
## Development
To set up your environment to develop this theme, run `bundle install`.
Your theme is setup just like a normal Jekyll site! To test your theme, run `bundle exec jekyll serve` and open your browser at `http://localhost:4000`. This starts a Jekyll server using your theme. Add pages, documents, data, etc. like normal to test your theme's contents. As you make modifications to your theme and to your content, your site will regenerate and you should see the changes in the browser after a refresh, just like normal.
When your theme is released, only the files in `_data`, `_layouts`, `_includes`, `_sass` and `assets` tracked with Git will be bundled.
To add a custom directory to your theme-gem, please edit the regexp in `jekyll-theme-yat.gemspec` accordingly.
## Contributing
Issues and Pull Requests are greatly appreciated. If you've never contributed to an open source project before I'm more than happy to walk you through how to create a pull request.
You can start by [opening an issue](https://github.com/jeffreytse/jekyll-theme-yat/issues/new) describing the problem that you're looking to resolve and we'll go from there.
## License
This theme is licensed under the [MIT license](https://opensource.org/licenses/mit-license.php) © JeffreyTse.
<!-- External links -->
[jekyll]: https://jekyllrb.com/
[yat-git-repo]: https://github.com/jeffreytse/jekyll-theme-yat/
[yat-live-demo]: https://jeffreytse.github.io/jekyll-theme-yat/
[jekyll-spaceship]: https://github.com/jeffreytse/jekyll-spaceship
[jekyll-seo-tag]: https://github.com/jekyll/jekyll-seo-tag
[jekyll-sitemap]: https://github.com/jekyll/jekyll-sitemap
[jekyll-feed]: https://github.com/jekyll/jekyll-feed
[highlight-js]: https://github.com/highlightjs/highlight.js
# Welcome to Jekyll!
#
# About Theme
#
# Yet another theme for elegant writers with modern flat style and beautiful
# night/dark mode.
#
# Website: https://github.com/jeffreytse/jekyll-theme-yat
#
# You can do anything you want, including projects for your clients, as long
# as you mention an attribution back (credit links in footer or project).
# See the LICENCE file.
#
# This config file is meant for settings that affect your whole blog, values
# which you are expected to set up once and rarely edit after that.
#
# For technical reasons, this file is *NOT* reloaded automatically when you
# use 'bundle exec jekyll serve'. If you change this file, please restart
# the server process.
#
# Site settings
# These are used to personalize your new site. If you look in the HTML files,
# you will see them accessed via {{ site.title }}, {{ site.email }}, and so on.
# You can create any custom variable you would like, and they will be accessible
# in the templates via {{ site.myvariable }}.
title: '2022 中国开源报告'
email: gitcode@csdn.net
author: GitCode
# Copyright setting
# You can use any html code, currently below placeholders are available:
# * current year: {currentYear}
# * author: {author} (Value is the same as site.author)
# * copyright: (c) - ©
# * copyleft: (cleft)
# * sound recording copyright: (p) - ℗
#
# For example:
# "Copyright (c) 2017-{currentYear} <a href="https://example.com">{author}</a>"
# "Copyright © 2017-2021 Foobar"
#
copyright: "CSDN & GitCode (©版权所有) 2022-{currentYear} {author}"
description: >- # this means to ignore newlines until "baseurl:"
Write an awesome description for your new site here. You can edit this
line in _config.yml. It will appear in your document head meta (for
Google search results) and in your feed.xml site description.
baseurl: "" # the subpath of your site, e.g. /blog
url: "" # the base hostname & protocol for your site, e.g. https://example.com
favicon: "/assets/images/favicon.ico" # the favicon for your site
# Yat date format
# refer to https://shopify.github.io/liquid/filters/date/ if you want to customize this
yat:
date_format: "%b %d, %Y"
# If you want more debug log, you can set true
debug: false
# If you don't want transparent header, you can set false
header_transparent: true
# If you want to change the content width, you can set to another value
content_width: "1280px"
# Google analytics
# google_analytics: [Tracking ID]
# If you want to generate website sitemap, you can set true
sitemap: false
# If you want to change site language, you can set lang option
lang: "zh-CN" # default lang is en
# Translate languges
# langs refer to https://cloud.google.com/translate/docs/languages
# translate_langs: ""
# You can choose a theme color
# Default theme colors as below:
# coolblack: #090a0b
# spacegrey: #353535
# snowwhite: #ffffff
#
# theme_color: snowwhite
#
# Custom color as below:
# theme_color: "#882250"
# You can choose a brand color
# Default brand colors as below:
# orangered: #ff5100
# greatgold: #f2cb05
# greenblue: #389092
#
# brand_color: orangered
#
# Custom color as below:
# brand_color: "#1a8e42"
# Night/Dark mode
# Default mode is "auto", "auto" is for auto nightshift
# (19:00 - 07:00), "manual" is for manual toggle, and
# "on/off" is for default on/off.
#
# Whatever the user's choice is, it will supersede the
# default setting of the site and be kept during the
# visit (session). Only the dark mode setting is"manual",
# it will be always kept on every visit (i.e. no matter
# the browser is closed or not)
#
night_mode: "on"
# Code badge setting
# You can enable or disable the code badge and so on
# code_badge:
# enabled: "true"
# color: "#fff"
# background_color: "#ff4e00"
# text_transform: "uppercase" # ("uppercase", "lowercase", "capitalize")
# If you want to link only specific pages in your header, uncomment
# this and add the path to the pages in order as they should show up
# header_pages:
# - index.html
# - archives.html
# - categories.html
# - tags.html
# - about.md
# Page default value
# defaults:
# home:
# heading: "《开源时代的开发者》 2022 中国开源报告"
# subheading: "CSDN GitCode OSSinsight 联合发布"
# banner: "#"
# Banner default settings
# These banner settings are for global banner default, but you can also
# config it by the front matter for one specific post
# banner:
# video: null # Video banner source
# loop: true # Video loop
# volume: 0 # Video volume (100% is 1.0)
# start_at: 0 # Video start time
# image: null # Image banner source
# opacity: 1.0 # Banner opacity (100% is 1.0)
# background: "rgba(0, 0, 0, 0.8)" # Banner background (Could be a image)
# height: "640px" # Banner default height
# min_height: null # Banner minimum height
# heading_style: null # Custom heading style (e.g. "font-weight: bold; text-decoration: underline")
# subheading_style: null # Custom subheading style (e.g. color: gold)
# Excerpt size setting
# excerpt_size: 350
# Pagination setting
# paginate: 5
# Disqus comments
# disqus:
# shortname: "Your Disqus username"
# Gitment comments
# gitment:
# username: "Your GitHub username"
# repo: "The repo to store comments"
# client_id: "Your client ID"
# client_secret: "Your client secret"
# redirect_uri: "Your redirect url" # If you use a custom domain name
# Utterances comments
# See https://utteranc.es/
# set follow_site_theme true to make utterances' theme follow the site's
# utterances:
# repo: "owner/repo"
# issue_term: "title"
# label: "utterances comment"
# theme: "github-light"
# follow_site_theme: true
# Build settings
# highlighter: none
markdown: kramdown
kmarkdown:
input: GFM
plugins:
- jekyll-feed
- jekyll-seo-tag
- jekyll-sitemap
- jekyll-paginate
- jekyll-spaceship
home:
heading: "开源时代的开发者——《2022 中国开源报告》"
subheading: "CSDN GitCode OSSinsight 联合发布"
banner: "#"
\ No newline at end of file
# Translate languages
# langs refer to https://cloud.google.com/translate/docs/languages
# - lang: en
# img: https://cdn.countryflags.com/thumbs/united-states-of-america/flag-400.png
# text: English
# - lang: fr
# img: https://cdn.countryflags.com/thumbs/france/flag-400.png
# text: French
# - lang: zh-CN
# img: https://cdn.countryflags.com/thumbs/china/flag-400.png
# text: Chinese(Simple)
# - lang: ja
# img: https://cdn.countryflags.com/thumbs/japan/flag-400.png
# text: Japanese
# - lang: ko
# img: https://cdn.countryflags.com/thumbs/south-korea/flag-400.png
# text: Korean
# - lang: ru
# img: https://cdn.countryflags.com/thumbs/russia/flag-400.png
# text: Russian
{% comment %}
Placeholder to allow defining custom head, in principle, you can add anything here, e.g. favicons:
1. Head over to https://realfavicongenerator.net/ to add your own favicons.
2. Customize default _includes/custom-head.html in your source directory and insert the given code snippet.
{% endcomment %}
\ No newline at end of file
<div id="click-to-top" class="click-to-top">
<i class="fa fa-arrow-up"></i>
</div>
<script>
(function () {
const clickToTop = document.getElementById('click-to-top');
window.addEventListener('scroll', () => {
if (window.scrollY > 100) {
clickToTop.classList.add('show')
}else {
clickToTop.classList.remove('show')
}
});
clickToTop.addEventListener('click', () => {
window.smoothScrollTo(0);
});
})();
</script>
<link rel="stylesheet"
href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/default.min.css">
<script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js"></script>
<!-- and it's easy to individually load additional languages -->
<script charset="UTF-8"
src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/languages/go.min.js"></script>
{%- assign name = 'code_badge.enabled' -%}
{%- include functions.html func='get_value' default='true' -%}
{%- assign badge_enabled = return -%}
{%- assign name = 'code_badge.color' -%}
{%- include functions.html func='get_value' default='#fff' -%}
{%- assign badge_color = return -%}
{%- assign name = 'code_badge.background_color' -%}
{%- include functions.html func='get_value' default='#ff4e00' -%}
{%- assign badge_background_color = return -%}
{%- assign name = 'code_badge.text_transform' -%}
{%- include functions.html func='get_value' default='uppercase' -%}
{%- assign badge_text_transform = return -%}
<script>
// Init highlight js
document.addEventListener('DOMContentLoaded', function(event) {
var els = document.querySelectorAll('pre code')
function addLangData(block) {
var outer = block.parentElement.parentElement.parentElement;
var lang = block.getAttribute('data-lang');
for (var i = 0; i < outer.classList.length; i++) {
var cls = outer.classList[i];
if (cls.startsWith('language-')) {
lang = cls;
break;
}
}
if (!lang) {
cls = block.getAttribute('class');
lang = cls ? cls.replace('hljs ', '') : '';
}
if (lang.startsWith('language-')) {
lang = lang.substr(9);
}
block.setAttribute('class', 'hljs ' + lang);
block.parentNode.setAttribute('data-lang', lang);
}
function addBadge(block) {
var enabled = ('{{ badge_enabled }}' || 'true').toLowerCase();
if (enabled == 'true') {
var pre = block.parentElement;
pre.classList.add('badge');
}
}
function handle(block) {
addLangData(block);
addBadge(block)
hljs.highlightBlock(block);
}
for (var i = 0; i < els.length; i++) {
var el = els[i];
handle(el);
}
});
</script>
<style>
/* code language badge */
pre.badge::before {
content: attr(data-lang);
color: {{badge_color}};
background-color: {{badge_background_color}};
padding: 0 .5em;
border-radius: 0 2px;
text-transform: {{badge_text_transform}};
text-align: center;
min-width: 32px;
display: inline-block;
position: absolute;
right: 0;
}
/* fix wrong badge display for firefox browser */
code > table pre::before {
display: none;
}
</style>
<div id="disqus_thread"></div>
<script>
var disqus_config = function () {
this.page.url = '{{ page.url | absolute_url }}';
this.page.identifier = '{{ page.url | absolute_url }}';
};
(function() {
var d = document, s = d.createElement('script');
s.src = 'https://{{ site.disqus.shortname }}.disqus.com/embed.js';
s.setAttribute('data-timestamp', +new Date());
(d.head || d.body).appendChild(s);
})();
</script>
<noscript>Please enable JavaScript to view the <a href="https://disqus.com/?ref_noscript" rel="nofollow">comments powered by Disqus.</a></noscript>
<div id="gitment_thread"></div>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/theme-next/theme-next-gitment@1/default.css"/>
<script src="https://cdn.jsdelivr.net/gh/theme-next/theme-next-gitment@1/gitment.browser.js"></script>
<script>
var gitment = new Gitment({
id: '{{ page.id }}',
owner: '{{ site.gitment.username }}',
repo: '{{ site.gitment.repo }}',
oauth: {
client_id: '{{ site.gitment.client_id }}',
client_secret: '{{ site.gitment.client_secret }}',
},
});
gitment.render('gitment_thread')
</script>
{%- if site.utterances.follow_site_theme -%}
<div id="utterances-placeholder"></div>
<script>
const utterancesThemeFromDataTheme = () => {
const dataTheme = document.documentElement.getAttribute('data-theme');
return `github-${dataTheme}`;
};
const setUtterancesTheme = () => {
const iframe = document.querySelector('.utterances-frame');
if (iframe) {
const message = {
type: 'set-theme',
theme: utterancesThemeFromDataTheme()
};
iframe.contentWindow.postMessage(message, 'https://utteranc.es');
}
}
// dynamic change
const observer = new MutationObserver((mutationsList, observer) => {
for (let mutation of mutationsList) {
if (mutation.type === 'attributes' && mutation.attributeName === 'data-theme') {
setUtterancesTheme();
}
}
});
observer.observe(document.documentElement, { attributes: true, childList: false, subtree: false });
let utterancesScript = document.createElement('script');
utterancesScript.async = true;
utterancesScript.src = 'https://utteranc.es/client.js';
utterancesScript.crossOrigin = 'anonymous';
utterancesScript.setAttribute('issue-term', '{{ site.utterances.issue_term }}');
utterancesScript.setAttribute('label', '{{ site.utterances.label }}');
utterancesScript.setAttribute('repo', '{{ site.utterances.repo }}');
utterancesScript.setAttribute('theme', utterancesThemeFromDataTheme());
const placeholder = document.getElementById('utterances-placeholder');
placeholder.parentNode.replaceChild(utterancesScript, placeholder);
</script>
{%- else -%}
<script async
crossorigin="anonymous"
issue-term="{{ site.utterances.issue_term }}"
label="{{ site.utterances.label }}"
repo="{{ site.utterances.repo }}"
src="https://utteranc.es/client.js"
theme="{{ site.utterances.theme }}">
</script>
{%- endif -%}
{% if include.selector %}
{% assign selector = include.selector %}
{% endif %}
{% if include.seed %}
{% assign seed = include.seed %}
{% endif %}
<script src="https://cdnjs.cloudflare.com/ajax/libs/geopattern/1.2.3/js/geopattern.min.js"></script>
<script>
function setRandomBgImage(selector, seed) {
var pattern = GeoPattern.generate(seed);
var element = document.querySelector(selector)
if (element) {
element.style.backgroundImage = pattern.toDataUrl();
}
}
setRandomBgImage('{{ selector }}', '{{ seed }}');
</script>
<script>
function initGoogleAnalytics() {
var doNotTrack = (window.doNotTrack === "1" || navigator.doNotTrack === "1" ||
navigator.doNotTrack === "yes" || navigator.msDoNotTrack === "1");
var enableDNT = "{{ site.enableDNT | default: true }}" == "true";
if (!enableDNT || !doNotTrack) {
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
ga('create', '{{ site.google_analytics }}', 'auto');
ga('send', 'pageview');
}
}
window.addEventListener("load", initGoogleAnalytics);
</script>
{% if include.translate_langs %}
{% assign translate_langs = include.translate_langs %}
{% endif %}
{% if include.lang %}
{% assign lang = include.lang %}
{% endif %}
<div id="google_translate_element" style="display: none;">
</div>
<span class="ct-language">
<ul class="list-unstyled ct-language-dropdown">
{% for item in translate_langs %}
<li>
<a href="#" class="lang-select" data-lang="{{ item.lang }}">
{% if item.img %}
<img src="{{ item.img }}" title="{{ item.text }}">
{% else %}
{{ item.text }}
{% endif %}
</a>
</li>
{% endfor %}
</ul>
</span>
<script type="text/javascript">
function googleTranslateElementInit() {
new google.translate.TranslateElement({
pageLanguage: '{{ lang }}',
autoDisplay: false,
layout: google.translate.TranslateElement.InlineLayout.VERTICAL
}, 'google_translate_element');
// Links to cross-origin destinations are unsafe
var gll = document.getElementsByClassName('goog-logo-link')[0];
if (gll) {
gll.setAttribute('rel', 'noopener');
}
function restoreLang() {
var iframe = document.getElementsByClassName('goog-te-banner-frame')[0];
if (!iframe) return;
var innerDoc = iframe.contentDocument || iframe.contentWindow.document;
var restore_el = innerDoc.getElementsByTagName("button");
for (var i = 0; i < restore_el.length; i++) {
if (restore_el[i].id.indexOf("restore") >= 0) {
restore_el[i].click();
var close_el = innerDoc.getElementsByClassName("goog-close-link");
close_el[0].click();
return;
}
}
}
function triggerHtmlEvent(element, eventName) {
var event;
if (document.createEvent) {
event = document.createEvent('HTMLEvents');
event.initEvent(eventName, true, true);
element.dispatchEvent(event);
} else {
event = document.createEventObject();
event.eventType = eventName;
element.fireEvent('on' + event.eventType, event);
}
}
var googleCombo = document.querySelector("select.goog-te-combo");
var langSelect = document.querySelector('.ct-language');
langSelect.addEventListener('click', function(event) {
if (!event.target) {
return;
}
var selected = document.querySelector('.ct-language .ct-language-selected');
if (selected) {
selected.classList.remove('ct-language-selected');
}
var target = event.target;
while (target && target !== langSelect ) {
if (target.matches('.lang-select')) {
break;
}
target = target.parentElement;
}
if (target && target.matches('.lang-select')) {
var lang = target.getAttribute('data-lang');
if (googleCombo.value == lang) {
restoreLang();
} else {
target.parentElement.classList.add('ct-language-selected');
googleCombo.value = lang;
triggerHtmlEvent(googleCombo, 'change');
}
}
event.preventDefault();
});
}
</script>
<script type="text/javascript" src="//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit"></script>
<script>
function hashLocate(hashValue) {
hashValue = hashValue.replace(/^.*#h-/, '');
hashValue = decodeURIComponent(hashValue);
var element = document.getElementById(hashValue);
if (!element) {
return;
}
var header = document.querySelector('header.site-header');
var headerRect = header.getBoundingClientRect();
var headerTop = Math.floor(headerRect.top);
var headerHeight = Math.floor(headerRect.height);
var scrollPos = getScrollPos();
var offsetY = element.offsetTop - (headerTop + headerHeight + 20);
if (offsetY == scrollPos.y) {
return;
}
if (headerTop == 0 && offsetY > scrollPos.y) {
offsetY += headerHeight + 2;
} else if (headerTop < 0 && offsetY < scrollPos.y) {
offsetY -= headerHeight - 2;
}
smoothScrollTo(offsetY);
}
// The first event occurred
window.addEventListener('load', function(event) {
if (window.location.hash) {
hashLocate(window.location.hash);
}
});
// The first event occurred
window.addEventListener('click', function(event) {
if (event.target.tagName.toLowerCase() == 'a') {
hashLocate(event.target.getAttribute('href'));
}
});
</script>
<script type="text/x-mathjax-config">
MathJax.Hub.Config({
tex2jax: {
skipTags: ['script', 'noscript', 'style', 'textarea', 'pre'],
inlineMath: [['$','$']]
}
});
</script>
<script
src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-MML-AM_CHTML" type="text/javascript"></script>
<div class="theme-toggle">
<input type="checkbox" id="theme-switch">
<label for="theme-switch">
<div class="toggle"></div>
<div class="names">
<p class="light">浅色</p>
<p class="dark">深色</p>
</div>
</label>
</div>
{%- assign name = 'night_mode' -%}
{%- include functions.html func='get_value' default='auto' -%}
{%- assign night_mode = return -%}
<script>
(function() {
var sw = document.getElementById('theme-switch');
var html = document.getElementsByTagName('html')[0];
var nightModeOption = ('{{ night_mode }}' || 'auto').toLowerCase();
var storage = nightModeOption === 'manual'
? localStorage
: sessionStorage;
var themeData = loadThemeData();
function saveThemeData(data) {
storage.setItem('theme', JSON.stringify(data));
}
function loadThemeData() {
var data = storage.getItem('theme');
try {
data = JSON.parse(data ? data : '');
} catch(e) {
data = { nightShift: undefined, autoToggleAt: 0 };
saveThemeData(data);
}
return data;
}
function handleThemeToggle(nightShift) {
themeData.nightShift = nightShift;
saveThemeData(themeData);
html.dataset.theme = nightShift ? 'dark' : 'light';
setTimeout(function() {
sw.checked = nightShift ? true : false;
}, 50);
}
function autoThemeToggle() {
// Next time point of theme toggle
var now = new Date();
var toggleAt = new Date();
var hours = now.getHours();
var nightShift = hours >= 19 || hours <=7;
if (nightShift) {
if (hours > 7) {
toggleAt.setDate(toggleAt.getDate() + 1);
}
toggleAt.setHours(7);
} else {
toggleAt.setHours(19);
}
toggleAt.setMinutes(0);
toggleAt.setSeconds(0);
toggleAt.setMilliseconds(0)
var delay = toggleAt.getTime() - now.getTime();
// auto toggle theme mode
setTimeout(function() {
handleThemeToggle(!nightShift);
}, delay);
return {
nightShift: nightShift,
toggleAt: toggleAt.getTime()
};
}
// Listen the theme toggle event
sw.addEventListener('change', function(event) {
handleThemeToggle(event.target.checked);
});
if (nightModeOption == 'auto') {
var data = autoThemeToggle();
// Toggle theme by local setting
if (data.toggleAt > themeData.autoToggleAt) {
themeData.autoToggleAt = data.toggleAt;
handleThemeToggle(data.nightShift);
} else {
handleThemeToggle(themeData.nightShift);
}
} else if (nightModeOption == 'manual') {
handleThemeToggle(themeData.nightShift);
} else {
var nightShift = themeData.nightShift;
if (nightShift === undefined) {
nightShift = nightModeOption === 'on';
}
handleThemeToggle(nightShift);
}
})();
</script>
{% if include.selector %}
{% assign selector = include.selector %}
{% endif %}
{% if include.seed %}
{% assign seed = include.seed %}
{% endif %}
<script src="https://cdnjs.cloudflare.com/ajax/libs/trianglify/2.0.0/trianglify.min.js"></script>
<script>
function setRandomBgImage(selector, seed, zoom) {
var element = document.querySelector(selector);
if (!element) return;
var pattern = Trianglify({
width: screen.width * zoom,
height: element.offsetHeight * zoom,
seed: seed
});
var image = document.createElement("div");
image.style.backgroundImage = "url(" + pattern.png() + ")";
element.appendChild(image);
}
setRandomBgImage('{{ selector }}', '{{ seed }}', {{ zoom | default: 1}});
</script>
{%- assign params = include -%}
{%- if params.func -%}
{%- assign func = params.func -%}
{%- endif -%}
{%- assign include_path = func -%}
{%- assign path_array = include_path | split: '.' -%}
{%- if path_array.size == 1 -%}
{%- assign include_path = include_path | append: '.html' -%}
{%- endif -%}
{%- if func == 'log' -%}
{%- include functions/log.html level=include.level msg=include.msg -%}
{%- else -%}
{%- assign include_path = 'functions/' | append: include_path -%}
{%- include {{ include_path }} params=params-%}
{%- endif -%}
{%- if return == nil -%}
{%- assign return = include.default -%}
{%- endif -%}
{%- if func != 'log' -%}
{%- assign msg = '[function]['
| append: {{func}}
| append: '] '
| append: {{return}}
-%}
{%- include functions.html func='log' level='info' -%}
{%- endif -%}
{% if include.params.article %}
{% assign article = include.params.article %}
{% endif %}
{% if include.params.lang %}
{% assign lang = include.params.lang %}
{% else %}
{% assign lang = lang | default: site.lang | default: "en" %}
{% endif %}
{% if include.params.excerpt_size %}
{% assign excerpt_size = include.params.excerpt_size %}
{% else %}
{% assign excerpt_size = excerpt_size
| default: site.excerpt_size
| default: 350 %}
{% endif %}
{%- include functions.html func='get_article_words' -%}
{% assign words = return %}
{% assign _article = article | strip_html %}
{% assign _words = _article | size %}
{% assign _size = excerpt_size %}
{% if lang != "en" %}
{% assign _size = words
| times: 1.0
| divided_by: _words
| times: _size
| round %}
{% endif %}
{% if _size > excerpt_size %}
{% assign _size = excerpt_size %}
{% endif %}
{% assign return = _article | truncate: _size %}
{% if include.params.article %}
{% assign article = include.params.article %}
{% endif %}
{% if include.params.lang %}
{% assign lang = include.params.lang %}
{% else %}
{% assign lang = lang | default: site.lang | default: "en" %}
{% endif %}
{% assign words = article | number_of_words %}
{% if lang != "en" %}
{% assign words = words
| times: 0.6
| round %}
{% assign words = article
| strip_html
| strip_newlines
| size
| times: 0.4
| plus: words
| round %}
{% endif %}
{% assign return = words %}
{%- include functions.html func='log' level='debug' msg='Get banner value' -%}
{% assign name = 'banner' %}
{%- include functions.html func='get_value' -%}
{% assign banner = return %}
{%- if banner.first -%}
{%- include functions.html func='log' level='debug' msg='Get banner_image value' -%}
{% assign name = 'banner.image' %}
{%- include functions.html func='get_value' -%}
{% assign banner_image = return | relative_url %}
{%- else -%}
{% assign banner_image = banner | relative_url %}
{%- endif -%}
{%- include functions.html func='log' level='debug' msg='Get banner_background value' -%}
{% assign name = 'banner.background' %}
{%- include functions.html func='get_value' -%}
{% assign banner_background = return %}
{%- include functions.html func='log' level='debug' msg='Get banner_opacity value' -%}
{% assign name = 'banner.opacity' %}
{%- include functions.html func='get_value' -%}
{% assign banner_opacity = return %}
{%- include functions.html func='log' level='debug' msg='Get banner_height value' -%}
{% assign name = 'banner.height' %}
{%- include functions.html func='get_value' -%}
{% assign banner_height = return %}
{%- include functions.html func='log' level='debug' msg='Get banner_min_height value' -%}
{% assign name = 'banner.min_height' %}
{%- include functions.html func='get_value' -%}
{% assign banner_min_height = return %}
{%- include functions.html func='log' level='debug' msg='Get banner_heading_style value' -%}
{% assign name = 'banner.heading_style' %}
{%- include functions.html func='get_value' -%}
{% assign banner_heading_style = return %}
{%- include functions.html func='log' level='debug' msg='Get banner_subheading_style value' -%}
{% assign name = 'banner.subheading_style' %}
{%- include functions.html func='get_value' -%}
{% assign banner_subheading_style = return %}
{%- include functions.html func='log' level='debug' msg='Get banner_video value' -%}
{% assign name = 'banner.video' %}
{%- include functions.html func='get_value' -%}
{% assign banner_video = return %}
{%- include functions.html func='log' level='debug' msg='Get banner_loop value' -%}
{% assign name = 'banner.loop' %}
{%- include functions.html func='get_value' default=true -%}
{% assign banner_loop = return %}
{%- include functions.html func='log' level='debug' msg='Get banner_volume value' -%}
{% assign name = 'banner.volume' %}
{%- include functions.html func='get_value' default=0 -%}
{% assign banner_volume = return %}
{%- include functions.html func='log' level='debug' msg='Get banner_start_at value' -%}
{% assign name = 'banner.start_at' %}
{%- include functions.html func='get_value' default=0 -%}
{% assign banner_start_at = return %}
{% if banner_image or banner_video %}
{% assign has_banner = true %}
{% endif %}
{% assign split_mark = '<|>' %}
{% assign categories = '' %}
{% for category in site.categories %}
{% assign name = category | first %}
{% assign categories = categories | append: split_mark | append: name %}
{% endfor %}
{% assign return = categories
| remove_first: split_mark
| split: split_mark
| sort: self %}
{% if include.params.filter %}
{% assign filter = include.params.filter %}
{% endif %}
{% assign split_mark = '<|>' %}
{% assign dates = '' %}
{% for post in site.posts %}
{% assign name = post.date | date: filter %}
{% assign dates = dates | append: split_mark | append: name %}
{% endfor %}
{% assign return = dates
| remove_first: split_mark
| split: split_mark
| sort: self
| uniq %}
{% if include.params.article %}
{% assign article = include.params.article %}
{% endif %}
{% if include.params.lang %}
{% assign lang = include.params.lang %}
{% else %}
{% assign lang = lang | default: site.lang | default: "en" %}
{% endif %}
{% if include.params.speed %}
{% assign speed = include.params.speed %}
{% else %}
{% assign speed = 160 %}
{% endif %}
{%- include functions.html func='get_article_words' -%}
{% assign words = return %}
{% assign total_mins = words
| divided_by: speed
| at_least: 1 %}
{% assign hours = total_mins | divided_by: 60 %}
{% assign mins = total_mins | modulo: 60 %}
{% assign return = "大约需要" %}
{% if hours > 0 %}
{% assign unit = "小时" %}
{% if hours > 1 %}
{% assign unit = unit | append: "" %}
{% endif %}
{% assign return = return
| append: " "
| append: 小时
| append: " "
| append: unit %}
{% endif %}
{% assign unit = "分钟" %}
{% if mins > 1 %}
{% assign unit = unit | append: "" %}
{% endif %}
{% assign return = return
| append: " "
| append: 分钟
| append: " "
| append: unit %}
{% assign split_mark = '<|>' %}
{% assign tags = '' %}
{% for tag in site.tags %}
{% assign name = tag | first %}
{% assign tags = tags | append: split_mark | append: name %}
{% endfor %}
{% assign return = tags
| remove_first: split_mark
| split: split_mark
| sort: self %}
{%- if include.params.name -%}
{%- assign name = include.params.name -%}
{%- endif -%}
{%- assign return = nil -%}
{%- assign keys = name | split:'.' -%}
{%- assign name = keys.first -%}
{%- assign keys = keys | shift -%}
{%- for step in (1..7) -%}
{%- case step -%}
{%- when 1 -%}
{%- assign return = page[name] -%}
{%- when 2 -%}
{%- assign return = site[name] -%}
{%- when 3 -%}
{%- assign return = site.data[name] -%}
{%- when 4 -%}
{%- assign return = site.defaults[page.layout][name] -%}
{%- when 5 -%}
{%- assign return = site.data.defaults[page.layout][name] -%}
{%- when 6 -%}
{%- assign return = layout[name] -%}
{%- else -%}
{%- assign return = include.params.default -%}
{%- endcase -%}
{%- for key in keys -%}
{%- assign return = return[key] -%}
{%- if return == nil -%}
{%- break -%}
{%- endif -%}
{%- endfor -%}
{%- if return != nil -%}
{%- break -%}
{%- endif -%}
{%- endfor -%}
{% if include.params.level %}
{% assign level = include.params.level %}
{% endif %}
{% if include.params.msg %}
{% assign msg = include.params.msg %}
{% endif %}
{% if site.debug == true %}
{% if level == 'debug' %}
{% if jekyll.environment == "development" %}
<!-- {{ msg }} -->
{% endif %}
{% else %}
<!-- {{ msg }} -->
{% endif %}
{% endif %}
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="google-translate-customization" content="108d9124921d80c3-80e20d618ff053c8-g4f02ec6f3dba68b7-c">
{%- seo -%}
<link rel="icon" href="{{ site.favicon }}">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/typeface-noto-sans@0.0.72/index.min.css">
<link rel="stylesheet" href="{{ "/assets/css/main.css" | relative_url }}">
<script src="{{ "/assets/js/main.js" | relative_url }}"></script>
{%- feed_meta -%}
{%- if jekyll.environment == 'production' and site.google_analytics -%}
{%- include extensions/google-analytics.html -%}
{%- endif -%}
{%- include extensions/code-highlight.html -%}
{%- include custom-head.html -%}
</head>
{%- include functions.html func='log' level='debug' msg='Get datetimes value' -%}
{% assign filter = '%Y' %}
{% include functions.html func='get_datetimes' %}
{% assign datetimes = return %}
{% assign keys = datetimes %}
{% assign field = 'date' %}
{% assign url = '/archives.html' | relative_url %}
{% include sidebar/common-list.html %}
<style type="text/css" media="screen">
.post-menu ul {
list-style: none;
padding: 0;
margin: 0;
}
</style>
<div class="post-menu">
<div class="post-menu-title">目录</div>
<div class="post-menu-content"></div>
</div>
<script>
function generateContent() {
var menu = document.querySelector(".post-menu");
var menuContent = menu.querySelector(".post-menu-content");
var headings = document.querySelector(".post-content").querySelectorAll("h2, h3, h4, h5, h6");
// Hide menu when no headings
if (headings.length === 0) {
return menu.style.display = "none";
}
// Generate post menu
var menuHTML = '';
for (var i = 0; i < headings.length; i++) {
var h = headings[i];
menuHTML += (
'<li class="h-' + h.tagName.toLowerCase() + '">'
+ '<a href="#h-' + h.getAttribute('id') + '">' + h.textContent + '</a></li>');
}
menuContent.innerHTML = '<ul>' + menuHTML + '</ul>';
// The header element
var header = document.querySelector('header.site-header');
function doMenuCollapse(index, over_items) {
var items = menuContent.firstChild.children;
if (over_items == undefined) {
over_items = 20;
}
if (items.length < over_items) {
return;
}
var activeItem = items[index];
var beginItem = activeItem
var endItem = activeItem
var beginIndex = index;
var endIndex = index + 1;
while (beginIndex >= 0
&& !items[beginIndex].classList.contains('h-h2')) {
beginIndex -= 1;
}
while (endIndex < items.length
&& !items[endIndex].classList.contains('h-h2')) {
endIndex += 1;
}
for (var i = 0; i < beginIndex; i++) {
item = items[i]
if (!item.classList.contains('h-h2')) {
item.style.display = 'none';
}
}
for (var i = beginIndex + 1; i < endIndex; i++) {
item = items[i]
// if (!item.classList.contains('h-h2')) {
item.style.display = '';
// }
}
for (var i = endIndex; i < items.length; i++) {
item = items[i]
if (!item.classList.contains('h-h2')) {
item.style.display = 'none';
}
}
}
// Init menu collapsed
doMenuCollapse(-1);
// Active the menu item
window.addEventListener('scroll', function (event) {
var lastActive = menuContent.querySelector('.active');
var changed = true;
var activeIndex = -1;
for (var i = headings.length - 1; i >= 0; i--) {
var h = headings[i];
var headingRect = h.getBoundingClientRect();
var headerRect = header.getBoundingClientRect();
var headerTop = Math.floor(headerRect.top);
var headerHeight = Math.floor(headerRect.height);
var headerHeight = headerTop + headerHeight + 20;
if (headingRect.top <= headerHeight) {
var id = 'h-' + h.getAttribute('id');
var a = menuContent.querySelector('a[href="#' + id + '"]');
var curActive = a.parentNode;
if (curActive) {
curActive.classList.add('active');
activeIndex = i;
}
if (lastActive == curActive) {
changed = false;
}
break;
}
}
if (changed) {
if (lastActive) {
lastActive.classList.remove('active');
}
doMenuCollapse(activeIndex);
}
event.preventDefault();
});
}
generateContent();
</script>
{%- include functions.html func='log' level='debug' msg='Get categories value' -%}
{%- include functions.html func='get_categories' -%}
{% assign categories = return %}
{% assign keys = categories %}
{% assign field = 'categories' %}
{% assign url = '/categories.html' | relative_url %}
{% include sidebar/common-list.html %}
{%- if include.keys -%}
{%- assign keys = include.keys -%}
{%- endif -%}
{%- if include.field -%}
{%- assign field = include.field -%}
{%- endif -%}
<div class="common-list">
<ul>
<li>
<a href="{{ '/index.html' | relative_url }}">
All<span>{{ site.posts.size }}</span>
</a>
</li>
{% for key in keys %}
<li>
<a href="{{ url }}#h-{{ key }}">
{{ key }} <span>{{ site.posts | where: field, key | size }}</span>
</a>
</li>
{% endfor %}
</ul>
</div>
<div>
{%- include extensions/google-translate.html -%}
</div>
{%- include functions.html func='log' level='debug' msg='Get tags value' -%}
{%- include functions.html func='get_tags' -%}
{% assign tags = return %}
{% assign keys = tags %}
{% assign field = 'tags' %}
{% assign url = '/tags.html' | relative_url %}
{%- include sidebar/common-list.html -%}
<article class="post h-entry" itemscope itemtype="http://schema.org/BlogPosting">
<div class="post-content e-content" itemprop="articleBody">
{{ content }}
</div>
</article>
{%- include functions.html func='log' level='debug' msg='Get banner_html value' -%}
{% assign name = 'banner_html' %}
{%- include functions.html func='get_value' -%}
{% assign banner_html = return %}
{%- include functions.html func='log' level='debug' msg='Get heading value' -%}
{% assign name = 'heading' %}
{%- include functions.html func='get_value' -%}
{% assign heading = return %}
{%- include functions.html func='log' level='debug' msg='Get subheading value' -%}
{% assign name = 'subheading' %}
{%- include functions.html func='get_value' -%}
{% assign subheading = return %}
{%- include functions.html func='get_banner' -%}
{%- if has_banner -%}
{%- if banner_background -%}
<style>
html .page-banner {
background: {{ banner_background }};
}
</style>
{%- endif -%}
{%- if banner_height -%}
<style>
{%- assign num = banner_height | times: 1 -%}
{%- assign unit = banner_height | replace_first: num -%}
{%- assign banner_min_height = banner_min_height | default: banner_height -%}
html .page-banner {
height: {{ banner_height | times: 0.368 | append: unit }};
min-height: {{ banner_min_height }};
}
html[data-scroll-status="top"] .page-banner {
height: {{ banner_height }};
}
</style>
{%- endif -%}
{%- if banner_opacity -%}
<style>
html .page-banner .page-banner-img > *:first-child {
opacity: {{ banner_opacity }};
}
html[data-theme="dark"] .page-banner .page-banner-img > *:first-child {
opacity: {{ banner_opacity | times: 0.718 }};
}
</style>
{%- endif -%}
{%- if banner_heading_style -%}
<style>
html .page-banner .page-banner-inner > *:first-child > *:nth-child(1) {
{{ banner_heading_style }}
}
</style>
{%- endif -%}
{%- if banner_subheading_style -%}
<style>
html .page-banner .page-banner-inner > *:first-child > *:nth-child(2) {
{{ banner_subheading_style }}
}
</style>
{%- endif -%}
<section class="page-banner">
<div class="page-banner-img">
{%- if banner_video -%}
<video
autoplay=""
poster="{{ banner_image }}"
playsinline
>
<source src="{{ banner_video }}">
</video>
<script>
(function() {
var video = document.querySelector('.page-banner .page-banner-img > video');
var videoPlay = function() {
video.play().catch (function() {
video.muted = true;
video.play();
});
}
video.onloadstart = function() {
video.currentTime = {{ banner_start_at }};
video.volume = {{ banner_volume }};
video.muted = (video.volume == 0);
videoPlay();
}
video.onended = function() {
video.currentTime = {{ banner_start_at }};
video.volume = 0;
{%- if banner_loop -%}
video.play();
{%- endif -%}
}
})();
</script>
{%- else -%}
<div style="background-image: url({{ banner_image }})"></div>
<img class="img-placeholder" src="{{ banner_image }}">
{%- endif -%}
</div>
<div class="wrapper">
<div class="page-banner-inner">
{%- if banner_html -%}
{%- assign banner_html = 'views/' | append: banner_html -%}
{%- include {{ banner_html }} -%}
{%- else -%}
<div class="page-banner-default">
<h1 class="page-banner-heading">
{{ heading | default: page.title | escape }}
</h1>
<h2 class="page-banner-subheading">
{{ subheading | default: page.subtitle | escape }}
</h2>
</div>
{%- endif -%}
</div>
</div>
</section>
{%- endif -%}
<footer class="site-footer h-card">
<data class="u-url" href="{{ "/" | relative_url }}"></data>
<div class="wrapper">
<div class="site-footer-inner">
{%- assign currentYear = 'now' | date: "%Y" -%}
{%- assign copyright = site.copyright
| replace: '{currentYear}', currentYear
| replace: '{author}', site.author
| replace: '(c)', '&copy;'
| replace: '(p)', '℗'
| replace: '(cleft)', '<span class="copyleft">&copy;</span>'
-%}
<div>{{ copyright }}</div>
<div>Powered by <a title="Jekyll is a simple, blog-aware, static site
generator." href="https://jekyllrb.com/">Jekyll</a> &amp; <a title="Yat, yet
another theme." href="https://github.com/jeffreytse/jekyll-theme-yat">Yat Theme</a>.</div>
<div class="footer-col rss-subscribe">Subscribe <a href="{{ "/feed.xml" | relative_url }}">via RSS</a></div>
</div>
</div>
</footer>
{%- include functions.html func='get_banner' -%}
{%- include functions.html func='log' level='debug' msg='Get header_transparent value' -%}
{%- assign name = 'header_transparent' -%}
{%- include functions.html func='get_value' default=true -%}
{%- assign header_transparent = return -%}
{%- if has_banner and header_transparent -%}
{%- assign header_transparent_class = "site-header-transparent" -%}
{%- endif -%}
<header class="site-header {{ header_transparent_class }}" role="banner">
<div class="wrapper">
<div class="site-header-inner">
{%- assign default_paths = site.pages | where: "dir", "/" | map: "path" -%}
{%- assign page_paths = site.header_pages | default: default_paths -%}
<span class="site-brand">
{%- include views/site-brand.html -%}
</span>
{%- if page_paths -%}
<nav class="site-nav">
<input type="checkbox" id="nav-trigger" class="nav-trigger" />
<label for="nav-trigger">
<span class="menu-icon">
<svg viewBox="0 0 18 15" width="18px" height="15px">
<path d="M18,1.484c0,0.82-0.665,1.484-1.484,1.484H1.484C0.665,2.969,0,2.304,0,1.484l0,0C0,0.665,0.665,0,1.484,0 h15.032C17.335,0,18,0.665,18,1.484L18,1.484z M18,7.516C18,8.335,17.335,9,16.516,9H1.484C0.665,9,0,8.335,0,7.516l0,0 c0-0.82,0.665-1.484,1.484-1.484h15.032C17.335,6.031,18,6.696,18,7.516L18,7.516z M18,13.516C18,14.335,17.335,15,16.516,15H1.484 C0.665,15,0,14.335,0,13.516l0,0c0-0.82,0.665-1.483,1.484-1.483h15.032C17.335,12.031,18,12.695,18,13.516L18,13.516z"/>
</svg>
</span>
</label>
<div class="trigger">
{%- for path in page_paths -%}
{%- assign my_page = site.pages | where: "path", path | first -%}
{%- if my_page.title -%}
<a class="page-link" href="{{ my_page.url | relative_url }}">{{ my_page.title | upcase | escape }}</a>
{%- endif -%}
{%- endfor -%}
{%- assign name = 'translate_langs' -%}
{%- include functions.html func='get_value' -%}
{%- assign translate_langs = return -%}
{%- if translate_langs.size > 0 -%}
{%- assign name = 'lang' -%}
{%- include functions.html func='get_value' default='en' -%}
{%- assign lang = return -%}
<span class="page-link">
{%- include extensions/google-translate.html -%}
</span>
{%- endif -%}
</div>
</nav>
{%- endif -%}
</div>
</div>
</header>
<script>
function initHeader() {
var lastScrollY = getScrollPos().y;
var documentElement = document.documentElement;
function storeScrollData() {
var y = getScrollPos().y;
{%- if banner and header_transparent -%}
documentElement.setAttribute("data-header-transparent", "");
{%- endif -%}
var scrollStatus = "";
if (y <= 0) {
scrollStatus = "top";
} else if ((window.innerHeight + y) >= document.body.offsetHeight) {
scrollStatus = "bottom";
} else {
var isScrollDown = (y - lastScrollY > 0) ? true : false;
scrollStatus = isScrollDown ? "down" : "up";
}
lastScrollY = y;
documentElement.setAttribute("data-scroll-status", scrollStatus);
}
window.addEventListener('scroll', function(e) {
storeScrollData();
});
storeScrollData();
}
document.addEventListener('DOMContentLoaded', initHeader);
</script>
{%- if page.paginator -%}
{%- assign paginator = page.paginator -%}
{%- elsif paginator == nil -%}
{%- assign paginator = site -%}
{%- endif -%}
{%- if paginator.posts.size > 0 -%}
<div class="pagination">
<!-- Post list links -->
<ul class="post-list">
{%- for post in paginator.posts -%}
<li>
{%- assign date_format = site.yat.date_format | default: "%b %-d, %Y" -%}
{% assign article = post.content %}
{% assign lang = post.lang %}
{%- include functions.html func='get_reading_time' -%}
{% assign reading_time = return %}
{%- include functions.html func='get_article_excerpt' -%}
{% assign excerpt = return %}
{%- assign post_url = post.url | relative_url -%}
<h2 class="post-title">
<a class="post-link" href="{{ post_url }}">
{{ post.title | escape }}
</a>
</h2>
<div class="post-meta">
<span class="post-date"><i class="fa fa-calendar"></i> {{ post.date | date: date_format }}</span>
<!-- <span class="post-reading-time left-vsplit"><i class="fa fa-clock-o"></i> {{ reading_time }}</span> -->
</div>
<a class="post-excerpt" href="{{ post_url }}">
<p>
{{ excerpt }} <span class="read_more">Read More</span>
</p>
</a>
<div class="post-tags">
{%- for tag in post.tags -%}
<a class="post-tag" href="{{ '/tags.html ' | relative_url }}#{{tag}}">#{{tag}}</a>
{%- endfor -%}
</div>
</li>
{%- endfor -%}
</ul>
<!-- Pagination links -->
{%- if paginator.posts.size < site.posts.size -%}
{%- include views/paginator.html -%}
{%- endif -%}
</div>
{%- endif -%}
{% if include.paginator %}
{% assign paginator = include.paginator %}
{% endif %}
{% if paginator.posts.size > 0 %}
<div class="paginator">
<span class="previous">
{% if paginator.previous_page %}
<a href="{{ paginator.previous_page_path | relative_url }}">Prev</a>
{% else %}
<span>Prev</span>
{% endif %}
</span>
<span class="indicator"> {{ paginator.page }}/{{ paginator.total_pages }}</span>
<span class="next">
{% if paginator.next_page %}
<a href="{{ paginator.next_page_path | relative_url }}">Next</a>
{% else %}
<span>Next</span>
{% endif %}
</span>
</div>
{% endif %}
<header class="post-header">
<h1 class="post-title p-name" itemprop="name headline">{{ heading | default: page.title | escape }}</h1>
<h2 class="post-subtitle">{{ subheading | default: page.subtitle | escape }}</h2>
<p class="post-meta">
<time class="dt-published" datetime="{{ page.date | date_to_xmlschema }}" itemprop="datePublished">
{%- assign date_format = site.yat.date_format | default: "%b %-d, %Y" -%}
<i class="fa fa-calendar"></i> {{ page.date | date: date_format }}
</time>
{% assign article = page.content %}
{% assign lang = page.lang %}
{%- include functions.html func='get_reading_time' -%}
{% assign reading_time = return %}
<!-- <span class="post-reading-time left-vsplit"><i class="fa fa-clock-o"></i> {{ reading_time }}</span> -->
</p>
{%- if page.tags.size > 0 -%}
<div class="post-tags">
{%- for tag in page.tags -%}
<a class="post-tag" href="{{ '/tags.html ' | relative_url }}#{{tag}}">#{{tag}}</a>
{%- endfor -%}
</div>
{%- endif -%}
</header>
{%- if include.item -%}
{%- assign item = include.item -%}
{%- endif -%}
{%- assign post = item -%}
{% assign date_format = site.yat.date_format | default: "%b %-d, %Y" %}
<span class="post-meta">{{ post.date | date: date_format }}</span>
<span>
<a class="post-link" href="{{ post.url | relative_url }}">
{{ post.title | escape }}
</a>
</span>
{%- if include.keys -%}
{%- assign keys = include.keys -%}
{%- endif -%}
{%- if include.field -%}
{%- assign field = include.field -%}
{%- endif -%}
<div class="page-segments">
<ul class="page-segments-list">
{% for key in keys %}
<h2 id="{{ key }}" class="segment-name">{{ key }}</h2>
{% assign items = site.posts | where: field, key | sort: weight asc%}
{% for item in items %}
{% if item != nil %}
<li> {% include views/post-item.html %} </li>
{% endif %}
{% endfor %}
{% endfor %}
</ul>
</div>
<a class="site-brand-inner" rel="author" href="{{ "/" | relative_url }}">
<img class="site-favicon" title="{{ site.title | escape }}" src="{{ site.favicon }}" onerror="this.style.display='none'">
{{ site.title | escape }}
</a>
---
layout: default
---
<style type="text/css" media="screen">
.container {
margin: 10px auto;
max-width: 600px;
text-align: center;
}
h1 {
margin: 30px 0;
font-size: 4em;
line-height: 1;
letter-spacing: -1px;
}
</style>
<div class="container">
<h1>404</h1>
<p><strong>Page not found :(</strong></p>
<p>Try to check other pages through the menu. </p>
</div>
---
layout: post
hidden:
- header
- navigator
- related_posts
---
{{ content }}
---
layout: framework
sidebar: archive-list
---
{%- if site.posts.size > 0 -%}
{% include functions.html func='log' level='debug' msg='Get datetimes value' %}
{% assign filter = '%Y' %}
{% include functions.html func='get_datetimes' %}
{% assign datetimes = return %}
{% assign keys = datetimes | reverse %}
{% assign field = 'date' %}
{% include views/segments.html %}
{%- endif -%}
---
layout: framework
sidebar: category-list
---
<div class="articles">
{% if page.banner == nil %}
{% assign banner = page.title %}
{% endif %}
{{ content }}
{% include views/pagination.html %}
</div>
---
layout: framework
sidebar: category-list
---
{%- if site.posts.size > 0 -%}
{%- include functions.html func='log' level='debug' msg='Get value' -%}
{%- include functions.html func='get_categories' -%}
{% assign categories = return %}
{% assign keys = categories %}
{% assign field = 'categories' %}
{%- include views/segments.html -%}
{%- endif -%}
<!DOCTYPE html>
<html lang="{{ page.lang | default: site.lang | default: "zh-CN" }}">
{%- include head.html -%}
<body>
{%- include views/header.html -%}
{%- include views/banner.html -%}
{%- include extensions/hashlocate.html -%}
{%- include extensions/theme-toggle.html -%}
{%- include extensions/click-to-top.html -%}
<main class="page-content" aria-label="Content">
<div class="wrapper">
{{ content }}
</div>
</main>
{%- include views/footer.html -%}
</body>
</html>
---
layout: default
---
<div class="framework">
<section class="main">
{{ content }}
</section>
<section class="sidebar" style="margin-left: 15px;">
<!-- Get sidebar items -->
{%- if page.sidebar -%}
{%- assign sidebar = page.sidebar -%}
{%- elsif site.defaults[page.layout].sidebar -%}
{%- assign sidebar = site.defaults[page.layout].sidebar -%}
{%- elsif layout.sidebar -%}
{%- assign sidebar = layout.sidebar -%}
{%- endif -%}
{%- for item in sidebar -%}
{%- assign file = item -%}
{%- assign array = file | split: '.' -%}
{%- if array.size == 1 -%}
{%- assign file = file | append: '.html' -%}
{%- endif -%}
{%- assign file = 'sidebar/' | append: file -%}
{%- include {{ file }} %}
{%- endfor -%}
</section>
</div>
---
layout: articles
heading: 'Your awesome heading'
subheading: 'Your awesome subheading'
banner: 'default'
---
{{ content }}
---
layout: framework
banner:
banner_html: post-header.html
hidden: []
sidebar:
- article-menu
---
<div class="post">
<section>
{%- assign name = 'banner' -%}
{%- include functions.html func='get_value' -%}
{%- assign banner = return -%}
{%- assign name = 'hidden' -%}
{%- include functions.html func='get_value' -%}
{%- assign hidden = return -%}
{%- assign result = hidden | where_exp: "item", "item == 'header'" -%}
{%- if banner == nil and result.size == 0 -%}
{%- include views/post-header.html -%}
{%- endif -%}
{%- include views/article.html -%}
{%- assign result = hidden | where_exp: "item", "item == 'navigator'" -%}
{%- if result.size == 0 -%}
<div class="post-nav">
{%- if page.previous -%}
<a class="previous" href="{{ page.previous.url | relative_url }}" title="{{
page.previous.title | escape }}">{{ page.previous.title | escape | truncatewords: 6 }}</a>
{%- else -%}
<span></span>
{%- endif -%}
{%- if page.next -%}
<a class="next" href="{{ page.next.url | relative_url }}" title="{{ page.next.title | escape }}">{{ page.next.title | escape | truncatewords: 6 }}</a>
{%- else -%}
<span></span>
{%- endif -%}
</div>
{%- endif -%}
{%- assign result = hidden | where_exp: "item", "item == 'related_posts'" -%}
{%- if result.size == 0 -%}
<div class="post-related">
<div>更多内容</div>
<ul>
{% assign posts = site[page.collection] | sample:4 %}
{%- for post in posts -%}
<li><a class="post-link" href="{{post.url | relative_url}}" title="{{ page.next.title | escape }}">{{ post.title | escape | truncatewords: 12 }}</a></li>
{%- endfor -%}
</ul>
</div>
{%- endif -%}
{%- assign result = hidden | where_exp: "item", "item == 'comments'" -%}
{%- if result.size == 0 -%}
<div class="post-comments">
{%- if page.comments != false -%}
{%- if site.disqus.shortname -%}
{%- include extensions/comments/disqus.html -%}
{%- endif -%}
{%- if site.gitment.username -%}
{%- include extensions/comments/gitment.html -%}
{%- endif -%}
{%- if site.utterances.repo -%}
{%- include extensions/comments/utterances.html -%}
{%- endif -%}
{%- endif -%}
</div>
{%- endif -%}
</section>
</div>
---
layout: framework
sidebar: tag-list
---
{%- if site.posts.size > 0 -%}
{%- include functions.html func='log' level='debug' msg='Get tags value' -%}
{%- include functions.html func='get_tags' -%}
{% assign tags = return %}
{% assign keys = tags %}
{% assign field = 'tags' %}
{%- include views/segments.html -%}
{%- endif -%}
---
layout: post
title: '中国开发者个人贡献 Top20'
subtitle: '2022 年中国开发者开源贡献排行榜'
categories: '贡献排行'
tags: ['2022','中国开发者']
sidebar: []
weight: 3
---
## 中国开发者开源贡献排行榜
| 排名 | GitHub ID | 综合得分 | Name(github profile)| 公司 | 地点 | 粉丝数 |
| :-- | :-- | :--: | -- | -- | -- | -- |
| 1 | Snailclimb | 11,063,702.55 | Guide | | Wuhan, Hubei | 9087 |
| 2 | afc163 | 8,004,266.10 | afc163 | Alipay | Hangzhou, China | 6380 |
| 3 | youngyangyang04 | 6,987,463.03 | 程序员Carl | Baidu/Tencent | Shenzhen | 4346 |
| 4 | chenjiahan | 6,881,717.19 | neverland | ByteDance | Hangzhou, China | 865 |
| 5 | pissang | 6,505,382.80 | Yi Shen | Shanghai, | China | 3861 |
| 6 | tchaikov | 6,254,702.75 | Kefu Chai | yet another startup | Shanghai, China | 289 |
| 7 | guanshengliang | 5,970,019.13 | Shengliang Guan | www.taosdata.com | Beijing | 107 |
| 8 | sangshuduo | 5,712,770.55 | Shuduo Sang | TAOS Data | Beijing | 69 |
| 9 | looly | 5,555,536.74 | Golden Looly | Dromara | Beijing,China | 1436 |
| 10 | hjxilinx | 5,235,371.75 | Haojun Liao | @taosdata | Beijing, China | 13 |
| 11 | Yuuoniy | 4,465,388.26 | Yuuoniy | | Beijing | 66 |
| 12 | MrVan | 4,186,351.66 | Peng Fan | NXP | Suzhou, China | 40 |
| 13 | 07akioni | 4,073,966.43 | 07akioni | ByteDance | China | 945 |
| 14 | plum-lihui | 3,943,684.04 | Hui Li | TAOS Data | Beijing | 11 |
| 15 | Anduin2017 | 3,635,084.74 | Anduin Xue | @Microsoft | Suzhou, China | 2593 |
| 16 | multiverse-tf | 3,374,140.44 | Chao Mei | | Beijing, CN | 4 |
| 17 | macrozheng | 3,109,141.18 | macro | | Wuxi,China | 7630 |
| 18 | Leo-Yan | 3,032,981.82 | Leo Yan | Linaro | Shanghai, China | 24 |
| 19 | pacoxu | 2,667,323.78 | Paco Xu | @DaoCloud Co,.Ltd, | Shanghai, China | 354 |
| 20 | amosbird | 2,544,358.01 | Amos Bird | | Beijing | 259 |
\ No newline at end of file
---
layout: post
title: '中国公司开源贡献榜 TOP20'
subtitle: '2022 年中国公司在全球开源贡献中的排行榜'
categories: '贡献排行'
tags: ['公司贡献', '2022', '中国']
sidebar: []
weight: 5
---
## 中国公司开源贡献榜TOP20,华为遥遥领先
在国内,通信、互联网、大数据、云、电子等领域的头部公司对开源作出重要贡献。
榜单中,排在前五的是华为、阿里巴巴、联发科(中国台湾)、腾讯和乐鑫科技。其中,华为的贡献度大幅超过其他科技公司。
从Commit数据来看,华为为国际项目做了大量的开源贡献,包括 `Linux` 内核、`Rust`等,为中国公司在全球开源项目贡献中的 TOP1。与之类似的是联发科,专注为 `Linux` 做贡献。腾讯的贡献则以自有开源项目为主,包括`bk-ci`(持续集成平台)、`Matrix`(性能监控框架)等 。
| 排行 | 公司 | 综合得分 |
| :-- | -- | --: |
| 1 | 华为 | 158186175.6 |
| 2 | 阿里巴巴 | 54257540.36 |
| 3 | 联发科(中国台湾) | 41179248.21 |
| 4 | 腾讯 | 21452693.35 |
| 5 | 乐鑫科技 | 19340065.33 |
| 6 | 百度 | 18501453.39 |
| 7 | 字节跳动 | 16636785.91 |
| 8 | 中兴 | 16558044.64 |
| 9 | 瑞昱(中国台湾) | 14205166.99 |
| 10 | 涛思数据 | 13616080.59 |
| 11 | 龙芯 | 10455923.38 |
| 12 | Vivo | 9606146.75 |
| 13 | 飞致云 | 9201413.171 |
| 14 | 声网 | 8275165.952 |
| 15 | 有赞 | 7281454.899 |
| 16 | 道客 | 5758594.228 |
| 17 | 富士康(中国台湾) | 4283910.971 |
| 18 | 网易 | 3159876.02 |
| 19 | OPPO | 3077912.592 |
| 20 | 涂鸦智能 | 2997483.845 |
\ No newline at end of file
---
layout: post
title: '中国开源项目 Top20'
subtitle: '2022 年中国最受欢迎的开源项目排行榜'
categories: '开源项目排行'
tags: ['开源项目', '2022','中国']
sidebar: []
weight: 2
---
## 中国开源项目TOP 20,阿里系占6席
尽管大多开源项目还是以国际公司为主导推出,但中国开源势力已经开始登上国际化的舞台。报告根据GitHub Event的数据,汇总出“中国开源项目 Top20”
> 注:由于本轮发布项目排行数据主要参考GitHub中Event数据,目前在GitHub中没有数据的项目尚未计算在内,例如OpenHarmony、openEuler、 MindSpore等。
| 排名 | 项目 | Star | Fork | 贡献者数量 | CSDN索引指数 | 月均pus | 月均PR | 月均issue | 活跃用户 | 月均Star | 月均Fork | 综合得分 |
| :-- | :-- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | --: |
| 1 | [ant-design/ant-design ](https://gitcode.net/mirrors/ant-design/ant-design ) | 82,096 | 36,086 | 1,946 | 51.25 | 797.28 | 137.96 | 219.24 | 45.64 | 3,528.48 | 597.96 | 13,077.07 |
| 2 | [panjiachen/vue-element-admin](https://gitcode.net/mirrors/panjiachen/vue-element-admin) | 78,731 | 28,633 | 124 | 33.96 | 0.28 | 2.28 | 20.72 | 2.12 | 808.88 | 374 | 11,203.07 |
| 3 | [apache/echarts ](https://gitcode.net/mirrors/apache/echarts ) | 52,604 | 19,198 | 178 | 99.17 | 516.77 | 22.64 | 130.14 | 10.45 | 417.23 | 159.95 | 7,546.85 |
| 4 | [fatedier/frp ](https://gitcode.net/mirrors/fatedier/frp ) | 60,541 | 10,698 | 95 | 30.88 | 18.12 | 7.04 | 34.04 | 4.44 | 868.28 | 152.76 | 7,079.54 |
| 5 | [apache/dubbo ](https://gitcode.net/mirrors/apache/dubbo ) | 37,912 | 25,338 | 471 | 338.21 | 98.84 | 77.2 | 63.04 | 23.84 | 205.32 | 172.68 | 7,041.41 |
| 6 | [elemefe/element ](https://gitcode.net/mirrors/elemefe/element ) | 52,700 | 14,225 | 639 | 10.96 | 12.52 | 17.48 | 54.48 | 13.08 | 276.16 | 163.88 | 6,846.09 |
| 7 | [jeecgboot/jeecg-boot ](https://gitcode.net/mirrors/jeecgboot/jeecg-boot ) | 31,049 | 12,316 | 13 | 10.67 | 13.59 | 1.94 | 70.53 | 1.71 | 471.53 | 205.24 | 4,583.07 |
| 8 | [gogs/gogs ](https://gitcode.net/mirrors/gogs/gogs ) | 40,965 | 4,643 | 534 | 27.92 | 20.04 | 8.76 | 12.12 | 3.48 | 262.04 | 35.4 | 4,441.00 |
| 9 | [blankj/androidutilcode ](https://gitcode.net/mirrors/blankj/androidutilcode ) | 31,421 | 10,428 | 51 | 2.17 | 6.44 | 1.32 | 12.32 | 1 | 169.44 | 67 | 4,309.74 |
| 10 | [dogfalo/materialize ](https://gitcode.net/mirrors/dogfalo/materialize ) | 38,728 | 4,850 | 302 | 0.17 | 0.56 | 0.68 | 1.88 | 0.64 | 76.88 | 14.16 | 4,218.82 |
| 11 | [ventoy/ventoy ](https://gitcode.net/mirrors/ventoy/ventoy ) | 40,073 | 2,894 | 79 | 13.88 | 22.04 | 6.72 | 39.2 | 6.04 | 1,178.68 | 95.08 | 4,172.92 |
| 12 | [taosdata/tdengine ](https://gitcode.net/mirrors/taosdata/tdengine ) | 19,342 | 4,486 | 180 | 9.63 | 17,316.68 | 429.16 | 66.12 | 32.88 | 226.28 | 46.68 | 4,036.52 |
| 13 | [iamkun/dayjs ](https://gitcode.net/mirrors/iamkun/dayjs ) | 40,499 | 2,039 | 308 | 1.25 | 21.08 | 11.56 | 24.72 | 8.72 | 397.04 | 31.48 | 4,034.28 |
| 14 | [dcloudio/uni-app ](https://gitcode.net/dcloud/uni-app ) | 37,141 | 3,352 | 239 | 10.63 | 717.32 | 4.52 | 61.44 | 3.88 | 498.36 | 49.4 | 3,979.84 |
| 15 | [bilibili/ijkplayer ](https://gitcode.net/mirrors/bilibili/ijkplayer ) | 30,792 | 7,875 | 63 | 7.21 | 1.12 | 1.2 | 12.4 | 0.92 | 157.28 | 37.56 | 3,900.36 |
| 16 | [pingcap/tidb ](https://gitcode.net/mirrors/pingcap/tidb ) | 32,441 | 5,277 | 865 | 44.13 | 343.52 | 288.48 | 256 | 72.24 | 319.72 | 67.08 | 3,876.93 |
| 17 | [alibaba/nacos ](https://gitcode.net/mirrors/alibaba/nacos ) | 24,072 | 10,709 | 290 | 502.67 | 188.04 | 68.4 | 128.8 | 21 | 410.64 | 250.24 | 3,829.13 |
| 18 | [alibaba/arthas ](https://gitcode.net/mirrors/alibaba/arthas ) | 30,518 | 6,658 | 167 | 53.04 | 50.08 | 5.84 | 19.56 | 4.32 | 316.72 | 75.36 | 3,748.60 |
| 19 | [alibaba/p3c ](https://gitcode.net/mirrors/alibaba/p3c ) | 28,267 | 775,5 | 44 | 14.13 | 1.04 | 0.92 | 5.48 | 0.8 | 229.12 | 82.72 | 3,665.37 |
| 20 | [agalwood/motrix ](https://gitcode.net/mirrors/agalwood/motrix ) | 33666 | 3895 | 58 | 0.83 | 10.08 | 2.4 | 14.24 | 1.76 | 483.6 | 53.96 | 3650.94 |
榜单上,位列前五的是`ant-design``vue-element-admin``echarts``frp`,以及 `dubbo`。有五个项目的 Star 数超过五万,Fork 数最高为 `ant-design` 的36,086,贡献者近两千人。
值得注意的是,Top20 的项目中,阿里系占到6席(包括阿里巴巴、蚂蚁集团和饿了么),这与阿里在 GitHub 上的长期沉淀不无关系。早在五年前,阿里就成为唯一一家入围 GitHub 顶尖贡献名单的中国公司。
\ No newline at end of file
---
layout: post
title: '全球公司开源贡献榜TOP50'
subtitle: '2022 年公司在全球开源贡献中的排行榜'
categories: '贡献排行'
tags: ['公司贡献', '2022']
sidebar: []
weight: 4
---
## 全球公司开源贡献榜TOP50,中国占比20%
全球贡献排名前50的公司中有10家国内企业上榜。
整体来看,前五分别是谷歌、脸书、英特尔、红帽,以及美国超威半导体。中国上榜公司包括华为、阿里巴巴、联发科(中国台湾)、腾讯、乐鑫科技、百度、字节跳动、中兴、瑞昱(中国台湾),以及涛思数据。
其中,华为的贡献度遥遥领先,排在第六,前三十中还有阿里巴巴和联发科,其余七家在30到50位之间。
| 排名 | 公司 | 综合得分 |
| :-- | -- | --: |
| 1 | 谷歌 | 1,571,370,636.19 |
| 2 | 脸书 | 691,569,819.40 |
| 3 | 英特尔 | 322,620,764.93 |
| 4 | 红帽 | 247,301,828.81 |
| 5 | 美国超威半导体 | 178,148,916.66 |
| 6 | 华为 | 158,186,175.65 |
| 7 | 微软 | 143,549,439.68 |
| 8 | 英伟达 | 136,294,218.04 |
| 9 | 苹果 | 131,730,271.98 |
| 10 | SUSE | 104,245,021.84 |
| 11 | GitHub | 92,008,221.89 |
| 12 | Yandex | 90,458,420.54 |
| 13 | VMware | 78,848,844.02 |
| 14 | 甲骨文 | 75,506,703.89 |
| 15 | Cloudflare | 69,649,941.14 |
| 16 | JetBrains | 62,622,269.13 |
| 17 | ARM | 61,748,477.99 |
| 18 | Elastic | 57,077,360.89 |
| 19 | 阿里巴巴 | 4,257,540.36 |
| 20 | NXP | 51,876,629.39 |
| 21 | IBM | 50,220,969.02 |
| 22 | 亚马逊 | 45,936,621.05 |
| 23 | Canonical | 41,524,412.85 |
| 24 | 联发科(中国台湾) | 41,170,248.21 |
| 25 | Gradle | 39,789,054.18 |
| 26 | Cockroachlabs | 39,298,420.25 |
| 27 | Pengutronix | 33,936,806.53 |
| 28 | mongoDB | 31,432,021.05 |
| 29 | HashiCorp | 30,575,523.72 |
| 30 | Sentry | 27,492,545.78 |
| 31 | 微芯科技 | 26,713,964.61 |
| 32 | 瑞萨电子 | 25,350,782.01 |
| 33 | Linutronix | 25,052,813.30 |
| 34 | Collabora | 21,905,361.00 |
| 35 | 腾讯 | 21,452,693.35 |
| 36 | 乐鑫科技 | 19,340,065.33 |
| 37 | 百度 | 18,501,453.39 |
| 38 | ClickHouse | 18,147,294.40 |
| 39 | Glider | 16,999,167.70 |
| 40 | Sourcegraph | 16,733,191.53 |
| 41 | 字节跳动 | 16,636,785.91 |
| 42 | 中兴 | 16,558,044.64 |
| 43 | 德州仪器 | 16,554,805.65 |
| 44 | Bootlin | 15,057,317.77 |
| 45 | Marvell | 14,340,424.73 |
| 46 | Adobe | 14,280,886.60 |
| 47 | 瑞昱(中国台湾) | 14,205,166.99 |
| 48 | Rapid7 | 13,775,780.01 |
| 49 | 博通 | 13,732,060.94 |
| 50 | 涛思数据 | 13,616,080.59 |
\ No newline at end of file
---
layout: post
title: '国际主流开源项目 Top50'
subtitle: '2022 年最受欢迎的开源项目排行榜'
categories: '开源项目排行'
tags: ['开源项目', '2022']
sidebar: []
weight: 1
---
## 国际开源项目TOP 50,中国仅占两席
整体来看,主流开源项目国内席位稀少,只有两个项目上榜。
其中,`pytorch`超过`tensorflow`位列第一,`tensorflow``bootstrap``vue``react`位列二、三、四、五。中国项目`ant-design``vue-element-admin`上榜,排名17和26,均为前端项目。
| 排名 | 项目 | Star | Fork | 综合得分 |
| :-- | :-- | :--: | :--: | --: |
| 1 | [pytorch/pytorch ](https://gitcode.net/mirrors/pytorch/pytorch ) | 59330 | 16513 | 44,288.98 |
| 2 | [tensorflow/tensorflow ](https://gitcode.net/mirrors/tensorflow/tensorflow ) | 168154 | 87235 | 28,117.84 |
| 3 | [twbs/bootstrap ](https://gitcode.net/mirrors/twbs/bootstrap ) | 159814 | 77315 | 25,685.78 |
| 4 | [vuejs/vue ](https://gitcode.net/mirrors/vuejs/vue ) | 199777 | 32877 | 24,190.23 |
| 5 | [facebook/react ](https://gitcode.net/mirrors/facebook/react ) | 195592 | 40513 | 24,042.60 |
| 6 | [public-apis/public-apis ](https://gitcode.net/mirrors/public-apis/public-apis ) | 210747 | 24113 | 23,085.03 |
| 7 | [torvalds/linux ](https://gitcode.net/mirrors/torvalds/linux ) | 138982 | 44900 | 20,757.70 |
| 8 | [octocat/spoon-knife ](https://gitcode.net/mirrors/octocat/spoon-knife ) | 113171 | 29976 | 18,958.60 |
| 9 | [microsoft/vscode ](https://gitcode.net/mirrors/microsoft/vscode ) | 137259 | 23522 | 17,506.31 |
| 10 | [ohmyzsh/ohmyzsh ](https://gitcode.net/mirrors/ohmyzsh/ohmyzsh ) | 150733 | 24556 | 17,442.51 |
| 11 | [flutter/flutter ](https://gitcode.net/mirrors/flutter/flutter ) | 145487 | 23390 | 17,224.28 |
| 12 | [vinta/awesome-python ](https://gitcode.net/mirrors/vinta/awesome-python ) | 143616 | 21960 | 16,342.74 |
| 13 | [airbnb/javascript ](https://gitcode.net/mirrors/airbnb/javascript ) | 127655 | 24335 | 15,121.26 |
| 14 | [kubernetes/kubernetes ](https://gitcode.net/mirrors/kubernetes/kubernetes ) | 92557 | 33911 | 13,844.92 |
| 15 | [opencv/opencv ](https://gitcode.net/mirrors/opencv/opencv ) | 64067 | 52632 | 13,657.94 |
| 16 | [tensorflow/models ](https://gitcode.net/mirrors/tensorflow/models ) | 74488 | 46036 | 13,313.03 |
| 17 | [ant-design/ant-design ](https://gitcode.net/mirrors/ant-design/ant-design ) | 82096 | 36086 | 13,077.07 |
| 18 | [facebook/react-native ](https://gitcode.net/mirrors/facebook/react-native ) | 105154 | 22472 | 13,039.40 |
| 19 | [d3/d3 ](https://gitcode.net/mirrors/d3/d3 ) | 102984 | 23174 | 12,754.34 |
| 20 | [mrdoob/three.js ](https://gitcode.net/mirrors/mrdoob/three.js ) | 85808 | 33001 | 12,693.16 |
| 21 | [nodejs/node ](https://gitcode.net/mirrors/nodejs/node ) | 90711 | 24443 | 12,407.76 |
| 22 | [golang/go ](https://gitcode.net/mirrors/golang/go ) | 104324 | 15456 | 12,244.62 |
| 23 | [vercel/next.js ](https://gitcode.net/mirrors/vercel/next.js ) | 93393 | 20496 | 11,884.96 |
| 24 | [electron/electron ](https://gitcode.net/mirrors/electron/electron ) | 103939 | 13892 | 11,854.61 |
| 25 | [mui/material-ui ](https://gitcode.net/mirrors/mui/material-ui ) | 81715 | 28142 | 11,761.42 |
| 26 | [panjiachen/vue-element-admin ](https://gitcode.net/mirrors/panjiachen/vue-element-admin ) | 78731 | 28633 | 11,203.07 |
| 27 | [spring-projects/spring-boot ](https://gitcode.net/mirrors/spring-projects/spring-boot ) | 63435 | 37295 | 11,156.18 |
| 28 | [angular/angular ](https://gitcode.net/mirrors/angular/angular ) | 84134 | 22243 | 11,137.81 |
| 29 | [bitcoin/bitcoin ](https://gitcode.net/mirrors/bitcoin/bitcoin ) | 66361 | 33076 | 10,835.49 |
| 30 | [django/django ](https://gitcode.net/mirrors/django/django ) | 66600 | 27917 | 10,486.43 |
| 31 | [axios/axios ](https://gitcode.net/mirrors/axios/axios ) | 96085 | 9820 | 10,355.54 |
| 32 | [laravel/laravel ](https://gitcode.net/mirrors/laravel/laravel ) | 71115 | 23018 | 9,835.16 |
| 33 | [microsoft/typescript ](https://gitcode.net/mirrors/microsoft/typescript ) | 84711 | 11017 | 9,515.45 |
| 34 | [angular/angular.js ](https://gitcode.net/mirrors/angular/angular.js ) | 59378 | 28237 | 9,430.72 |
| 35 | [spring-projects/spring-framework](https://gitcode.net/mirrors/spring-projects/spring-framework) | 49294 | 34782 | 9,424.98 |
| 36 | [elastic/elasticsearch ](https://gitcode.net/mirrors/elastic/elasticsearch ) | 61345 | 22288 | 9,218.66 |
| 37 | [redis/redis ](https://gitcode.net/mirrors/redis/redis ) | 56977 | 21800 | 9,210.76 |
| 38 | [animate-css/animate.css ](https://gitcode.net/mirrors/animate-css/animate.css ) | 75910 | 16251 | 9,185.12 |
| 39 | [home-assistant/core ](https://gitcode.net/mirrors/home-assistant/core ) | 55108 | 19836 | 9,111.34 |
| 40 | [microsoft/terminal ](https://gitcode.net/mirrors/microsoft/terminal ) | 85495 | 7519 | 9,108.96 |
| 41 | [grafana/grafana ](https://gitcode.net/mirrors/grafana/grafana ) | 51223 | 10057 | 9,095.77 |
| 42 | [rust-lang/rust ](https://gitcode.net/mirrors/rust-lang/rust ) | 72685 | 9850 | 8,971.09 |
| 43 | [jetbrains/kotlin ](https://gitcode.net/mirrors/jetbrains/kotlin ) | 42767 | 5281 | 8,852.01 |
| 44 | [ansible/ansible ](https://gitcode.net/mirrors/ansible/ansible ) | 54716 | 22437 | 8,780.73 |
| 45 | [git/git ](https://gitcode.net/mirrors/git/git ) | 43753 | 24075 | 8,695.09 |
| 46 | [denoland/deno ](https://gitcode.net/mirrors/denoland/deno ) | 85628 | 4627 | 8,622.65 |
| 47 | [puppeteer/puppeteer ](https://gitcode.net/mirrors/puppeteer/puppeteer ) | 80178 | 8647 | 8,615.58 |
| 48 | [moby/moby ](https://gitcode.net/mirrors/moby/moby ) | 64173 | 18291 | 8,609.85 |
| 49 | [jquery/jquery ](https://gitcode.net/mirrors/jquery/jquery ) | 56775 | 20486 | 8,529.91 |
| 50 | [rails/rails ](https://gitcode.net/mirrors/rails/rails ) | 51517 | 20650 | 8,190.59 |
\ No newline at end of file
/*
* Post menu
*/
.post-menu {
padding-left: 20px;
min-width: 200px;
max-width: 230px;
.post-menu-title {
font-size: $base-font-size * 1.5;
margin-bottom: 14px;
font-weight: 600;
color: #222;
}
.post-menu-content {
ul {
border-left: 1px solid #e9ecef;
$indent: $base-font-size / 4;
$active-bgcolor: #ecebec;
@for $i from 2 to 7 {
.h-h#{$i} {
padding-inline-start: $indent + ($i - 2) * $base-font-size * 1.3;
font-size: $base-font-size * 1.1;
line-height: 1.4;
}
}
a {
display: flex;
padding: 2px 8px;
color: darken($text-color, 10%);
* {
pointer-events: none;
}
&:hover {
text-decoration: none;
color: lighten($text-color, 20%)!important;
}
}
.active {
background-color: $active-bgcolor;
transition: background 0.5s;
border-left: 2px solid #202020;
margin-left: -2px;
&:hover {
background-color: lighten($active-bgcolor, 2%);
}
a {
color: #121416;
}
}
}
}
}
.click-to-top {
transition: 0.3s;
display: flex;
align-items: center;
justify-content: center;
position: fixed;
width: 64px;
height: 64px;
border-radius: 32px;
right: 60px;
bottom: 48px;
background: white;
cursor: pointer;
opacity: 0;
transform: translateY(10px);
box-shadow: 0 2px 15px rgba(0, 0, 0, 0.15);
font-size: 24px;
user-select: none;
@include media-query(1024px) {
width: 48px;
height: 48px;
border-radius: 24px;
right: 35px;
font-size: 20px;
}
@include media-query($on-palm) {
width: 36px;
height: 36px;
border-radius: 18px;
right: 20px;
font-size: 16px;
}
}
.click-to-top.show {
opacity: 1;
transform: translateY(0);
}
html[data-theme="dark"] {
.click-to-top {
background: #34323D;
}
}
/**
* Common list
*/
.common-list {
@include relative-font-size(1.0);
min-width: 200px;
ul {
list-style: none;
margin: 0;
}
li {
border-bottom: solid 1px #00000018;
&:last-child {
border-bottom: none;
}
a {
display: flex;
justify-content: space-between;
padding: 8px 12px;
text-decoration: none;
font-weight: normal;
color: $text-color;
transition: background 0.2s;
&:hover {
background-color: mix($theme-color, #eaeaea, 20%);
}
}
span {
@include relative-font-size(0.8);
display: inline-block;
border-radius: 10px;
align-self: center;
background: #000000bd;
padding: 0px 8px;
margin-left: 20px;
color: $white-color;
}
}
}
.gitment-container {
color: #787878 !important;
}
.gitment-editor-header {
background-color: #fefefe;
}
.gitment-comment-main, .gitment-editor-main {
background-color: #fff;
border-radius: 3px !important;
}
.gitment-heart-icon {
fill: #ff0808;
}
/* OVERRIDE GOOGLE TRANSLATE WIDGET CSS BEGIN */
%goog-te-menu {
a.goog-te-menu-value {
vertical-align: top !important;
&:hover {
text-decoration: none;
}
span {
color: #aaa;
}
span:hover {
color: white;
}
/* Remove the down arrow */
/* when dropdown open */
span[style="color: rgb(213, 213, 213);"] {
display: none;
}
/* after clicked/touched */
span[style="color: rgb(118, 118, 118);"] {
display: none;
}
/* on page load (not yet touched or clicked) */
span[style="color: rgb(155, 155, 155);"] {
display: none;
}
/* Remove span with left border line | (next to the arrow) in Chrome & Firefox */
span[style="border-left: 1px solid rgb(187, 187, 187);"] {
display: none;
}
/* Remove span with left border line | (next to the arrow) in Edge & IE11 */
span[style="border-left-color: rgb(187, 187, 187); border-left-width: 1px; border-left-style: solid;"] {
display: none;
}
}
}
div#google_translate_element {
display: inline;
div.goog-te-gadget {
display: inline;
font-size: 0;
}
div[id=':0.targetLanguage'] {
display: inline;
}
div.goog-te-gadget-simple {
border: none;
background-color: transparent;
@extend %goog-te-menu;
}
a.goog-logo-link {
display: none;
}
.goog-te-gadget-icon {
display: none !important;
/*background: url("url for the icon") 0 0 no-repeat !important;*/
}
a.goog-te-menu-value {
margin: 0;
span:first-child {
display: none;
}
&:before {
content: "\f1ab \f0d7";
font-family: FontAwesome;
font-size: initial;
color: #fefefe;
border: 1px solid #fefefe85;
border-radius: 3px;
padding: 3px 6px;
}
}
}
.goog-te-menu-frame .goog-te-menu2 {
max-width: 100%;
overflow-x: auto;
box-sizing: border-box;
height: auto;
}
/* HIDE the google translate toolbar */
.goog-te-banner-frame.skiptranslate {
display: none !important;
border: none;
box-shadow: 0 0;
-webkit-box-shadow: 0 0;
}
body {
top: 0px !important;
}
/* OVERRIDE GOOGLE TRANSLATE WIDGET CSS END */
// Main look
.ct-language-selected {
background-color: darken($theme-color, 5%) !important;
}
.ct-language-dropdown {
overflow: hidden;
max-height: 0;
position: absolute;
top: 110%;
right: -10px;
background-color: lighten($theme-color, 5%);
-webkit-transition: all 0.25s ease-in-out;
transition: all 0.25s ease-in-out;
width: 100px;
text-align: center;
margin-top: 0;
z-index: 200;
border-radius: 3px;
visibility: hidden;
li {
padding: 5px;
&:first-child {
padding-top: 12px;
}
&:last-child {
padding-bottom: 12px;
}
&:not(:last-child) {
border-bottom: 1px solid rgba(0, 0, 0, .04);
}
a {
display: block;
color: invert($theme-color);
img {
width: 24px;
max-height: 24px;
border: none;
}
}
&:hover {
@extend .ct-language-selected;
}
}
}
.list-unstyled {
display: inline-block;
list-style: none;
margin-left: 0;
}
.ct-language {
display: inline-block;
position: relative;
background-color: #fefefe2b;
padding: 3px 10px;
border-radius: 3px;
&:hover {
cursor: pointer;
.ct-language-dropdown {
margin-top: 8px;
max-height: 10000px;
visibility: visible;
box-shadow: 0 0 9px 3px rgba(0, 0, 0, .06);
}
}
&:before {
content: "\f1ab \f0d7";
font-family: FontAwesome;
}
}
.theme-toggle {
position: relative;
width: $base-font-size * 7.65;
margin-top: 10px;
margin-right: 60px;
margin-left: auto;
transition: .3s cubic-bezier(.4,.03,0,1);
label, .toggle {
border-radius: 100px;
}
label {
display: block;
background-color: rgba(120,120,120,.15);
cursor: pointer;
}
.toggle {
position: absolute;
width: 50%;
height: 100%;
background-color: #fff;
box-shadow: 0 2px 15px rgba(0,0,0,.15);
transition: transform .2s cubic-bezier(0.25, 0.46, 0.45, 0.94);
}
.names {
font-size: 1em;
font-weight: bolder;
width: 76%;
margin-left: 12%;
position: relative;
display: flex;
justify-content: space-between;
user-select: none;
}
.dark {
opacity: .5;
}
p {
color: #acacac;
margin-bottom: 0;
line-height: 24px;
}
[type="checkbox"] {
display: none;
}
/* Toggle */
[type="checkbox"]:checked ~ label .toggle {
transform: translateX(100%);
background-color: #34323D;
}
[type="checkbox"]:checked ~ label .dark{
opacity: 1;
}
[type="checkbox"]:checked ~ label .light{
opacity: .5;
}
@include media-query(1024px) {
margin-right: 35px;
}
@include media-query($on-palm) {
width: $base-font-size * 6.65;
margin-right: 20px;
.names {
font-size: .85em;
}
}
}
@charset "utf-8";
// Define defaults for each variable.
$base-font-family: Helvetica, Arial, Oswald, sans-serif, !default;
$base-font-size: 14px !default;
$base-font-weight: 400 !default;
$small-font-size: $base-font-size * 0.875 !default;
$base-line-height: 1.6 !default;
$spacing-unit: 30px !default;
$text-color: #454545 !default;
$background-color: #fff !default;
$grey-color: #828282 !default;
$grey-color-light: lighten($grey-color, 40%) !default;
$grey-color-dark: darken($grey-color, 25%) !default;
$white-color: #fdfdfd !default;
$table-text-align: left !default;
$header-height: $base-line-height * $base-font-size * 2.85 !default;
$header-text-color: invert($theme-color) !default;
$header-background-color: $theme-color !default;
$footer-height: $header-height * 1.05 !default;
$footer-text-color: lighten(invert($theme-color), 25%) !default;
$footer-background-color: darken($theme-color, 5%) !default;
$banner-height: 640px !default;
$banner-text-color: lighten($white-color, 0%) !default;
$banner-background: rgba(0,0,0,0.8) !default;
// Width of the content area
// $content-width: 920px !default;
$on-palm: 600px !default;
$on-laptop: 800px !default;
// Use media queries like this:
// @include media-query($on-palm) {
// .wrapper {
// padding-right: $spacing-unit / 2;
// padding-left: $spacing-unit / 2;
// }
// }
@mixin media-query($device) {
@media screen and (max-width: $device) {
@content;
}
}
@mixin relative-font-size($ratio) {
font-size: $base-font-size * $ratio;
}
// Import partials.
@import
"yat/base",
"yat/layout",
"yat/dark",
"misc/theme-toggle",
"misc/article-menu",
"misc/common-list",
"misc/google-translate",
"misc/gitment",
"misc/click-to-top"
;
/**
* Reset some basic elements
*/
body, h1, h2, h3, h4, h5, h6,
p, blockquote, pre, hr,
dl, dd, ol, ul, figure {
margin: 0;
padding: 0;
}
/**
* Basic styling
*/
body {
font-family: $base-font-family;
font-weight: $base-font-weight;
font-size: #{$base-font-size};
font-display: swap;
line-height: #{$base-line-height};
color: $text-color;
background-color: $background-color;
-webkit-text-size-adjust: 100%;
-webkit-font-feature-settings: "kern" 1;
-moz-font-feature-settings: "kern" 1;
-o-font-feature-settings: "kern" 1;
font-feature-settings: "kern" 1;
font-kerning: normal;
display: flex;
min-height: 100vh;
flex-direction: column;
}
/**
* Set `margin-bottom` to maintain vertical rhythm
*/
h1, h2, h3, h4, h5, h6,
p, blockquote, pre,
ul, ol, dl, figure,
%vertical-rhythm {
margin-bottom: $spacing-unit / 2;
}
/**
* `main` element
*/
main {
display: block; /* Default value of `display` of `main` element is 'inline' in IE 11. */
}
/**
* Images
*/
img {
max-width: 100%;
vertical-align: middle;
}
/**
* Figures
*/
figure > img {
display: block;
}
figcaption {
font-size: $small-font-size;
}
/**
* Lists
*/
ul, ol {
margin-left: $spacing-unit;
}
li {
> ul,
> ol {
margin-bottom: 0;
}
}
/**
* Headings
*/
h1, h2, h3, h4, h5, h6 {
font-weight: $base-font-weight * 1.5;
}
/**
* Links
*/
a {
color: $brand-color;
text-decoration: none;
&:hover {
text-decoration: underline;
}
.social-media-list &:hover {
text-decoration: none;
.username {
text-decoration: underline;
}
}
}
/**
* Blockquotes
*/
blockquote {
color: $grey-color;
border-left: 4px solid $grey-color-light;
padding-left: $spacing-unit / 2;
@include relative-font-size(1.125);
letter-spacing: -1px;
font-style: italic;
> :last-child {
margin-bottom: 0;
}
}
/**
* Code formatting
*/
pre,
code {
@include relative-font-size(0.9375);
color: $text-color;
}
*:not(pre) > code {
padding: 3px 6px;
border-radius: 3px;
background-color: #eee;
margin: 0 5px;
}
pre {
overflow-x: auto;
position: relative;
background-color: #f0f0f0;
> code {
display: inline-block;
padding: 20px!important;
background-color: transparent;
border: 0;
}
table, pre {
margin-bottom: 0;
.gutter, .code {
padding: 6px;
border: none;
}
}
}
/**
* Wrapper
*/
.wrapper {
max-width: $content-width;
margin: auto;
padding-right: $spacing-unit;
padding-left: $spacing-unit;
@extend %clearfix;
}
/**
* Clearfix
*/
%clearfix:after {
content: "";
display: table;
clear: both;
}
/**
* Tables
*/
table {
display: block;
margin-bottom: $spacing-unit;
width: 100%;
text-align: $table-text-align;
color: lighten($text-color, 5%);
border-collapse: collapse;
overflow: auto;
tr {
&:nth-child(even) {
background-color: lighten($grey-color-light, 6%);
}
}
th, td {
padding: ($spacing-unit / 3) ($spacing-unit / 2);
}
th {
background-color: lighten($grey-color-light, 3%);
border: 1px solid darken($grey-color-light, 4%);
border-bottom-color: darken($grey-color-light, 12%);
}
td {
border: 1px solid $grey-color-light;
}
}
/**
* Flex layout
*/
%flex {
display: flex;
}
%flex-1 {
flex: 1;
min-width: 0; /* <-- fix flexbox width with pre tags */
}
/**
* Flex sticky
*/
@mixin flex-sticky($top) {
position: sticky;
position: -moz-sticky; /* <-- fix sticky compatibility issue */
position: -ms-sticky;
position: -o-sticky;
position: -webkit-sticky;
align-self: flex-start; /* <-- fix the sticky not work issue */
transform: scale(0.9999); /* <-- fix the sticky x overflow issue */
top: $top;
}
/**
* Vertical center
*/
@mixin vertical-center($position) {
position: $position;
top: 50%;
transform: translateY(-50%);
}
/**
* Horizontal center
*/
@mixin horizontal-center($position) {
position: $position;
left: 50%;
transform: translateX(-50%);
}
/**
* Center background image
*/
@mixin center-image {
height: 100%;
max-width: 1000%;
background-size: cover;
background-position: center center;
overflow: hidden;
}
$dark-background-color: #0e0e0e !default;
$dark-text-color: #bbb !default;
html[data-theme="dark"] {
&[data-scroll-status='top'] {
header.site-header-transparent {
&.site-header {
@include media-query($on-laptop) {
.page-link {
color: #f8f8f8;
}
}
}
}
footer.site-footer {
.site-footer-inner {
border-top: solid 1px #2f2f2f !important;
transition: 0s;
}
}
}
body {
color: $dark-text-color;
background-color: $dark-background-color;
}
*:not(pre) > code {
color: $dark-text-color;
background-color: #454545;
}
blockquote {
border-left: 4px solid #484848;
}
table {
color: #9d9d9d;
th {
background-color: #050505;
}
tr:nth-child(even) {
background-color: #080808;
}
}
.site-header {
background-color: #090909;
.site-brand {
.site-brand-inner {
&, &:visited {
color: #f8f8f8;
}
}
}
.site-nav .page-link {
color: #f8f8f8;
}
.ct-language-dropdown {
color: #f8f8f8;
background-color: $dark-background-color;
box-shadow: 0 0 3px 1px #0000005b;
}
.ct-language-selected, .ct-language-dropdown li:hover {
background-color: #222 !important;
}
@include media-query($on-laptop) {
.menu-icon > svg {
fill: rgba($dark-text-color, 80%);
}
.site-nav input:checked ~ .trigger {
background-color: #090909;
}
}
}
.site-footer {
color: #fff;
background-color: #000;
}
.left-vsplit:before {
background-color: #9a9a9a;
}
.page-banner {
.page-banner-img {
& > *:first-child {
opacity: 0.718;
}
}
}
.pagination {
.post-link {
color: $dark-text-color;
}
.post-title {
a:visited:after {
background-color: $dark-background-color;
}
a:after {
color: $dark-background-color;
}
}
.post-list {
& > li:not(:last-child) {
border-bottom: 1px solid #545454;
}
}
.post-tags .post-tag:hover {
color: #d7d7d7;
}
}
.page-segments {
li {
a {
color: #ddd;
}
a:visited:after {
background-color: $dark-background-color;
}
a:after {
color: $dark-background-color;
}
}
}
.post {
.post-header {
border-bottom: 1px solid #555;
}
.post-content {
img:not(.emoji):not([raw]) {
background-color: #ffffff33;
}
}
}
.post-related {
& > *:first-child {
color: #d7d7d7;
}
a:visited:after {
background-color: $dark-background-color;
}
a:after {
color: $dark-background-color;
}
a:hover {
color: #aaa;
}
}
.common-list {
li {
border-bottom: solid 1px #40404088;
a {
color: #aaa;
}
a:hover {
background-color: #272727;
}
span {
background-color: #333;
}
}
}
.post-menu {
.post-menu-title {
color: #ddd;
}
.post-menu-content {
ul {
border-left: 1px solid #787878;
.active {
background-color: #2d2d2d;
border-left: 2px solid #aaa;
}
a {
color: $dark-text-color;
}
a:hover {
color: #fff !important;
}
}
}
}
}
/**
* Animation for transparent header
*/
html {
&[data-header-transparent] {
header.site-header {
position: fixed;
}
}
&[data-scroll-status='top'] {
header.site-header-transparent {
height: 0;
margin-top: 12px;
background-color: transparent;
transition: 0.1s height,background-color,box-shadow;
&.site-header {
.site-brand-inner, .page-link {
color: #fff;
transition: 0.1s color;
}
@include media-query($on-laptop) {
.page-link {
color: $header-text-color;
}
.menu-icon {
> svg {
fill: $white-color;
}
}
}
}
}
footer.site-footer {
color: unset;
background-color: transparent;
.site-footer-inner {
border-top: solid 1px #eee;
}
}
}
&[data-scroll-status='down'] {
header.site-header {
top: -$header-height;
}
.framework .sidebar {
top: 20px;
}
}
}
/**
* Site header
*/
.site-header {
background-color: $header-background-color;
height: $header-height;
width: 100%;
transition: height 0.2s, text-shadow 0.2s, top 0.2s;
box-shadow: 0 1px 0 0 rgba(0, 0, 0, .06);
// Positioning context for the mobile navigation icon
@include flex-sticky(0);
z-index: 1000;
& > .wrapper {
margin: 0 60px;
padding: 0;
max-width: 100%;
transition: 0.2s margin;
@include media-query(1024px) {
margin: 0 20px;
max-width: unset;
}
}
a {
text-decoration: none;
}
.site-header-inner {
position: relative;
}
}
.site-brand {
line-height: $header-height;
margin-right: 50px;
.site-brand-inner {
@include relative-font-size(1.125);
font-weight: $base-font-weight;
letter-spacing: -1px;
transition: 0.1s filter color;
&, &:visited {
color: $header-text-color;
}
.site-favicon {
display: inline-block;
height: $header-height / 1.5;
margin-right: 5px;
}
}
}
.site-nav {
@include relative-font-size(1.125);
line-height: $header-height;
position: absolute;
right: 0;
top: 0;
.nav-trigger {
display: none;
}
.menu-icon {
display: none;
}
.page-link {
line-height: $base-line-height;
color: $header-text-color;
transition: 0.1s ease-in-out;
// Gaps between nav items, but not on the last one
&:not(:last-child) {
margin-right: 24px;
&:hover {
text-decoration: underline;
}
}
}
@include media-query($on-laptop) {
position: absolute;
top: 0;
text-align: left;
label[for="nav-trigger"] {
display: block;
z-index: 2;
cursor: pointer;
}
.menu-icon {
display: block;
float: right;
text-align: center;
> svg {
fill: rgba($header-text-color, 80%);
transition: 0.1s fill;
}
}
input ~ .trigger {
clear: both;
display: none;
border-radius: 3px;
box-shadow: 1px 1px 1px 1px rgba(0, 0, 0, .06);
}
input:checked ~ .trigger {
display: block;
background: $header-background-color;
}
.page-link {
display: block;
padding: 5px 10px;
color: rgba($header-text-color, 80%);
margin: 0 25px;
}
}
}
/**
* Site footer
*/
.site-footer {
@include relative-font-size(1.0);
color: $footer-text-color;
background-color: $footer-background-color;
text-align: left;
transition: background-color 0.2s;
.site-footer-inner {
transition: border-top 0.2s;
padding: $spacing-unit * 1.8 0;
}
a {
$a-color: $brand-color;
color: $a-color;
&:hover {
color: lighten($a-color, 10%);
}
}
}
.copyleft {
display: inline-block;
transform: rotate(180deg);
}
/**
* Post header
*/
%post-header {
.post-header {
margin-bottom: $spacing-unit;
}
.post-title {
@include relative-font-size(2.625);
letter-spacing: -1px;
line-height: 1;
@include media-query($on-laptop) {
@include relative-font-size(2.25);
}
}
.post-tags {
padding-right: 150px;
.post-tag {
display: inline-block;
margin: 0 12px 0 0;
}
}
}
/**
* Page content
*/
.page-content {
@extend %flex-1; /* <-- Keep footer on the bottom */
-ms-flex: none; /* <-- Fix IE footer issue */
padding: $spacing-unit * 2 0;
padding-top: 72px;
}
.page-heading {
@include relative-font-size(2);
}
.post-list-heading {
@include relative-font-size(1.75);
}
/**
* Pagination page
*/
.pagination {
.post-list {
margin-left: 0;
list-style: none;
> li {
margin-bottom: $spacing-unit * 1.5;
padding-bottom: 30px;
&:not(:last-child) {
border-bottom: 1px solid #e3e3e3;
}
}
}
.post-title {
margin-bottom: $spacing-unit * 0.2;
transition: 0.2s all;
a {
text-decoration: none;
&:after {
content: 'NEW';
position: absolute;
margin-left: 8px;
margin-top: 3px;
padding: 0px 3px;
background-color: $brand-color;
color: #fff;
font-size: 10px;
font-weight: 600;
border-radius: 2px;
}
&:visited:after {
background-color: #fff;
}
}
}
.post-meta {
font-size: $base-font-size;
color: $grey-color;
margin-bottom: $spacing-unit * 0.5;
}
.post-link {
@include relative-font-size(1.65);
font-weight: $base-font-weight * 1.5;
color: #333;
}
.post-excerpt {
color: #777;
word-break: break-word;
overflow-wrap: break-word;
}
.post-tags .post-tag {
display: inline-block;
text-decoration: none;
border: 1px solid;
padding: 2px 4px;
border-radius: 2px;
transition: color 0.2s;
margin-bottom: 8px;
&:not(:last-child) {
margin-right: 8px;
}
&:hover {
color: #787878;
}
}
.paginator {
text-align: center;
& > .previous:before {
content: ' ';
border: solid #787878;
border-width: 0 2px 2px 0;
display: inline-block;
padding: 4px;
margin-right: 8px;
transform: rotate(135deg);
-webkit-transform: rotate(135deg);
}
& > .next:after {
content: ' ';
border: solid #787878;
border-width: 0 2px 2px 0;
display: inline-block;
padding: 4px;
margin-left: 8px;
transform: rotate(-45deg);
-webkit-transform: rotate(-45deg);
}
.previous span, .next span {
color: #b3b3b3;
}
.indicator {
padding: 0 15px;
}
}
}
/**
* Posts
*/
.post {
@extend %post-header;
.post-header {
margin: 50px auto 60px;
padding: 0 0 20px;
border-bottom: 1px solid #ebebeb;
.post-title {
margin-bottom: 6px;
}
.post-subtitle {
font-weight: lighter;
}
.post-meta {
color: #808080;
}
}
.post-content {
margin-bottom: $spacing-unit;
overflow-wrap: normal;
word-wrap: normal;
word-break: normal;
h2 {
@include relative-font-size(2);
@include media-query($on-laptop) {
@include relative-font-size(1.75);
}
}
h3 {
@include relative-font-size(1.625);
@include media-query($on-laptop) {
@include relative-font-size(1.375);
}
}
h4 {
@include relative-font-size(1.25);
@include media-query($on-laptop) {
@include relative-font-size(1.125);
}
}
img, svg, iframe {
margin-left: auto;
margin-right: auto;
}
img:not(.emoji), svg, iframe {
display: block;
}
h2, h3, h4, h5, h6 {
margin: 60px 0 19px;
}
p, hr {
margin-bottom: 24px;
}
hr {
height: 1px;
background-color: #ebebeb;
border: none;
}
}
.post-related {
&>*:first-child {
@include relative-font-size(1.425);
color: #333;
margin-bottom: 14px;
}
ul {
margin-left: 15px;
.post-link {
@include relative-font-size(1.075);
}
a {
color: #666;
&:hover {
color: #333;
}
&:after {
content: 'NEW';
position: absolute;
margin-left: 8px;
margin-top: 3px;
padding: 0px 3px;
background-color: $brand-color;
color: #fff;
font-size: 10px;
font-weight: 600;
border-radius: 2px;
}
&:visited:after {
background-color: #fff;
}
}
}
}
}
.post-comments {
padding-top: 25px;
}
/**
* Posts misc
*/
.post-nav {
display: flex;
justify-content: space-between;
margin: 72px 0 59px;
padding: 31px 0 0;
a {
@include relative-font-size(1.125);
line-height: 15px;
color: #666;
max-width: 50%;
}
.previous:before {
content: ' ';
border: solid #787878;
border-width: 0 2px 2px 0;
display: inline-block;
padding: 4px;
margin-right: 8px;
transform: rotate(135deg);
-webkit-transform: rotate(135deg);
}
.next:after {
content: ' ';
border: solid #787878;
border-width: 0 2px 2px 0;
display: inline-block;
padding: 4px;
margin-left: 8px;
transform: rotate(-45deg);
-webkit-transform: rotate(-45deg);
}
}
/**
* Archives page
*/
.page-archives {
.page-archives-list {
margin-left: 0;
list-style: none;
}
.archives-time {
@include relative-font-size(1.5);
&:not(:first-child) {
margin-top: 18px;
}
margin-bottom: 8px;
}
.post-meta {
font-size: $small-font-size;
color: $grey-color;
}
}
/**
* Page banner
*/
.page-banner {
display: block;
position: relative;
height: $banner-height;
background-color: $banner-background;
transition: height 0.2s;
.page-banner-img {
position: absolute;
width: 100%;
height: 100%;
overflow: hidden;
& > *:first-child {
@include center-image;
transition: 0.1s all ease-in-out;
}
& > video {
width: 100vw;
object-fit: cover;
}
& > img.img-placeholder {
display: none;
}
}
.wrapper {
height: 100%;
}
.page-banner-inner {
@include vertical-center(relative);
color: $banner-text-color;
padding: 10px 5px;
text-shadow: 1px 1px 2px #33333355;
& > *:first-child {
margin: 0;
> :nth-child(1) {
@include relative-font-size(3.9);
letter-spacing: -1px;
margin-bottom: 0.1em;
font-weight: normal;
transition: 0.2s all;
@include media-query($on-palm) {
@include relative-font-size(1.975);
}
}
> :nth-child(2) {
font-weight: lighter;
margin-bottom: 0.8em;
transition: 0.2s all;
@include media-query($on-palm) {
@include relative-font-size(1.175);
}
}
> :last-child {
margin-bottom: 0;
}
}
.post-subtitle {
@include relative-font-size(1.525);
color: #ffffffcc;
padding-right: 280px;
@include media-query($on-palm) {
padding-right: 0;
}
}
.post-meta {
color: #ffffffcc;
}
.left-vsplit:before {
background: #e3e3e388;
}
.post-tags {
color: #999;
padding-right: 280px;
@include media-query($on-palm) {
padding-right: 0;
}
.post-tag {
@include relative-font-size(1.125);
display: inline-block;
text-decoration: none;
margin: 9px 12px 0 0;
color: #fff;
&:hover {
text-decoration: underline;
}
}
}
}
@include media-query($on-palm) {
height: $banner-height / 1.5;
}
}
/**
* Layout and sidebar
*/
.framework {
@extend %flex;
.main {
@extend %flex-1;
}
.sidebar {
padding-left: 8px;
transition: top 0.2s, display 0.2s;
@include flex-sticky($header-height + 20px);
@include media-query($on-laptop) {
display: none;
}
}
}
/**
* Segments page
*/
.page-segments {
.page-segments-list {
margin-left: 0;
list-style: none;
}
.segment-name {
font-weight: $base-font-weight * 1.5;
margin-bottom: 8px;
position: relative;
@include relative-font-size(1.6);
&:not(:first-child) {
margin-top: 28px;
}
&:hover:before {
content: '#';
left: -1em;
position: absolute;
}
}
.post-meta {
font-size: $small-font-size;
color: $grey-color;
}
li a {
&.post-link {
margin-left: 5px;
}
color: #303030;
&:hover {
color: #000;
}
&:after {
content: 'NEW';
position: absolute;
margin-left: 8px;
margin-top: 3px;
padding: 0px 3px;
background-color: $brand-color;
color: #fff;
font-size: 10px;
font-weight: 600;
border-radius: 2px;
}
&:visited:after {
background-color: #fff;
}
}
}
.left-vsplit:before {
content: "";
display: inline-block;
width: 1px;
height: 10px;
margin: 0 10px;
background-color: #e3e3e3e3;
vertical-align: baseline;
}
---
layout: about
title: '关于'
weight: 10
---
<h2>名词解释</h2>
<h3>1 数据来源</h3>
<p>
数据来源:报告中分析了约5400头部开源项目近两年的Star、PR、Issue、Commit记录及两年来CSDN内容指数
</p>
<h3>2 头部开源项目</h3>
<p>
头部开源项目选择标准是:
</p>
<ul>
<li>GitHub头部 5000 项目</li>
<li>Apache基金会,Github Star 数 ≥ 1000 的项目,共计 123 个项目</li>
<li>CNCF基金会,Github Star 数 ≥ 1000 的项目,共计 394 个项目</li>
<li>Linux基金会,Github Star 数 ≥ 1000 的项目,共计 329 个项目</li>
<li>国内代码托管平台头部项目,Github Star ≥ 1000 的项目,共计 229 个项目</li>
</ul>
<p>以上项目汇总除重后,共得到本次统计的全部 5,394 个项目
<blockquote>由于本轮发布项目排行数据主要参考Github中event数据,目前在Github中没有数据的项目没有计算在内,(例如OpenHarmony, OpemEuler, MindSpore等)</blockquote>
</p>
<h3>3 用户贡献计算方法</h3>
<p>
个人开发者贡献排行榜算法说明:综合得分 = sum(开发者参与贡献项目的得分*开发者提交次数)
</p>
<h3>4 公司贡献计算方法</h3>
<p>
公司贡献排行榜算法说明:公司排行榜由贡献用户的邮箱域名汇总得到
</p>
\ No newline at end of file
---
layout: archives
title: '归档'
---
---
# Only the main Sass file needs front matter (the dashes are enough)
---
// Default theme colors
$theme-colors: (
"coolblack": #090a0b,
"spacegrey": #353535,
"snowwhite": #ffffff,
);
// Default brand colors
$brand-colors: (
"orangered": #ff5100,
"greatgold": #f2cb05,
"greenblue": #389092,
);
$theme-name: "{{ site.theme_color }}";
$brand-name: "{{ site.brand_color }}";
$theme-color: map-get($theme-colors, "snowwhite");
$brand-color: map-get($brand-colors, "orangered");
@if map-has-key($theme-colors, $theme-name) {
$theme-color: map-get($theme-colors, $theme-name);
} @else if str-index($theme-name, "#") == 1 {
$theme-color: {{ site.theme_color | default: '#ffffff' }};
}
@if map-has-key($brand-colors, $brand-name) {
$brand-color: map-get($brand-colors, $brand-name);
} @else if str-index($brand-name, "#") == 1 {
$brand-color: {{ site.brand_color | default: '#ff5100' }};
}
$content-width: {{ site.content_width | default: '920px' }};
@import "yat";
// Fix DOM matches function
if (!Element.prototype.matches) {
Element.prototype.matches =
Element.prototype.matchesSelector ||
Element.prototype.mozMatchesSelector ||
Element.prototype.msMatchesSelector ||
Element.prototype.oMatchesSelector ||
Element.prototype.webkitMatchesSelector ||
function(s) {
var matches = (this.document || this.ownerDocument).querySelectorAll(s),
i = matches.length;
while (--i >= 0 && matches.item(i) !== this) {}
return i > -1;
};
}
// Get Scroll position
function getScrollPos() {
var supportPageOffset = window.pageXOffset !== undefined;
var isCSS1Compat = ((document.compatMode || "") === "CSS1Compat");
var x = supportPageOffset ? window.pageXOffset : isCSS1Compat ? document.documentElement.scrollLeft : document.body.scrollLeft;
var y = supportPageOffset ? window.pageYOffset : isCSS1Compat ? document.documentElement.scrollTop : document.body.scrollTop;
return { x: x, y: y };
}
var _scrollTimer = [];
// Smooth scroll
function smoothScrollTo(y, time) {
time = time == undefined ? 500 : time;
var scrollPos = getScrollPos();
var count = 60;
var length = (y - scrollPos.y);
function easeInOut(k) {
return .5 * (Math.sin((k - .5) * Math.PI) + 1);
}
for (var i = _scrollTimer.length - 1; i >= 0; i--) {
clearTimeout(_scrollTimer[i]);
}
for (var i = 0; i <= count; i++) {
(function() {
var cur = i;
_scrollTimer[cur] = setTimeout(function() {
window.scrollTo(
scrollPos.x,
scrollPos.y + length * easeInOut(cur/count)
);
}, (time / count) * cur);
})();
}
}
---
layout: categories
title: '分类'
---
---
# Feel free to add content and custom Front Matter to this file.
# To modify the layout, see https://jekyllrb.com/docs/themes/#overriding-theme-defaults
layout: home
title: '首页'
banner: "/assets/images/banners/1024.jpeg"
---
# frozen_string_literal: true
Gem::Specification.new do |spec|
spec.name = "jekyll-theme-yat"
spec.version = "1.8.0"
spec.authors = ["jeffreytse"]
spec.email = ["jeffreytse.mail@gmail.com"]
spec.summary = "Yet another theme for elegant writers with modern flat style and beautiful night/dark mode."
spec.homepage = "https://github.com/jeffreytse/jekyll-theme-yat"
spec.license = "MIT"
spec.metadata["plugin_type"] = "theme"
spec.files = `git ls-files -z`.split("\x0").select do |f|
f.match(%r!^(assets|_data|_layouts|_includes|_sass|LICENSE|README)!i)
end
spec.add_development_dependency "bundler", ">= 1.6", "< 3.0"
spec.add_development_dependency "rake", ">= 12.0", "< 13.0"
spec.add_runtime_dependency "jekyll", "> 3.5", "< 5.0"
spec.add_runtime_dependency "jekyll-feed", "~> 0.9"
spec.add_runtime_dependency "jekyll-seo-tag", "~> 2.1"
spec.add_runtime_dependency "jekyll-sitemap", "~> 1.3"
spec.add_runtime_dependency "jekyll-paginate", "~> 1.1"
spec.add_runtime_dependency "jekyll-spaceship", "~> 0.2"
end
---
layout: tags
---
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册