diff --git a/.gitignore b/.gitignore index 45c1505..c8af976 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ _site .sass-cache .jekyll-metadata +.jekyll-cache \ No newline at end of file diff --git a/Gemfile b/Gemfile index 9d2f64d..5032f88 100644 --- a/Gemfile +++ b/Gemfile @@ -8,10 +8,10 @@ source "https://rubygems.org" # # This will help ensure the proper Jekyll version is running. # Happy Jekylling! -gem "jekyll", "~> 3.8.4" +gem "jekyll", "~> 4.2.0" # This is the default theme for new Jekyll sites. You may change this to anything you like. -gem "minima", "~> 2.0" +gem "minima", "~> 2.5.1" # If you want to use GitHub Pages, remove the "gem "jekyll"" above and # uncomment the line below. To upgrade, run `bundle update github-pages`. @@ -19,12 +19,14 @@ gem "minima", "~> 2.0" # If you have any plugins, put them here! group :jekyll_plugins do - gem "jekyll-feed", "~> 0.6" + gem "jekyll-feed", "~> 0.15.1" end # Windows does not include zoneinfo files, so bundle the tzinfo-data gem gem "tzinfo-data", platforms: [:mingw, :mswin, :x64_mingw, :jruby] # Performance-booster for watching directories on Windows -gem "wdm", "~> 0.1.0" if Gem.win_platform? +gem "wdm", "~> 0.1.1" if Gem.win_platform? + +gem "webrick", "~> 1.7" diff --git a/Gemfile.lock b/Gemfile.lock index a77bb6d..64d2234 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,46 +1,51 @@ GEM remote: https://rubygems.org/ specs: - addressable (2.7.0) + addressable (2.8.0) public_suffix (>= 2.0.2, < 5.0) colorator (1.1.0) - concurrent-ruby (1.1.8) + concurrent-ruby (1.1.9) em-websocket (0.5.2) eventmachine (>= 0.12.9) http_parser.rb (~> 0.6.0) eventmachine (1.2.7-x64-mingw32) - ffi (1.14.2-x64-mingw32) + ffi (1.15.3-x64-mingw32) forwardable-extended (2.6.0) http_parser.rb (0.6.0) - i18n (0.9.5) + i18n (1.8.10) concurrent-ruby (~> 1.0) - jekyll (3.8.7) + jekyll (4.2.0) addressable (~> 2.4) colorator (~> 1.0) em-websocket (~> 0.5) - i18n (~> 0.7) - jekyll-sass-converter (~> 1.0) + i18n (~> 1.0) + jekyll-sass-converter (~> 2.0) jekyll-watch (~> 2.0) - kramdown (= 2.3.1) + kramdown (~> 2.3) + kramdown-parser-gfm (~> 1.0) liquid (~> 4.0) - mercenary (~> 0.3.3) + mercenary (~> 0.4.0) pathutil (~> 0.9) - rouge (>= 1.7, < 4) + rouge (~> 3.0) safe_yaml (~> 1.0) + terminal-table (~> 2.0) jekyll-feed (0.15.1) jekyll (>= 3.7, < 5.0) - jekyll-sass-converter (1.5.2) - sass (~> 3.4) + jekyll-sass-converter (2.1.0) + sassc (> 2.0.1, < 3.0) jekyll-seo-tag (2.7.1) jekyll (>= 3.8, < 5.0) jekyll-watch (2.2.1) listen (~> 3.0) - kramdown (1.17.0) + kramdown (2.3.1) + rexml + kramdown-parser-gfm (1.1.0) + kramdown (~> 2.0) liquid (4.0.3) - listen (3.4.1) + listen (3.5.1) rb-fsevent (~> 0.10, >= 0.10.3) rb-inotify (~> 0.9, >= 0.9.10) - mercenary (0.3.6) + mercenary (0.4.0) minima (2.5.1) jekyll (>= 3.5, < 5.0) jekyll-feed (~> 0.9) @@ -48,31 +53,34 @@ GEM pathutil (0.16.2) forwardable-extended (~> 2.6) public_suffix (4.0.6) - rb-fsevent (0.10.4) + rb-fsevent (0.11.0) rb-inotify (0.10.1) ffi (~> 1.0) + rexml (3.2.5) rouge (3.26.0) safe_yaml (1.0.5) - sass (3.7.4) - sass-listen (~> 4.0.0) - sass-listen (4.0.0) - rb-fsevent (~> 0.9, >= 0.9.4) - rb-inotify (~> 0.9, >= 0.9.7) + sassc (2.4.0-x64-mingw32) + ffi (~> 1.9) + terminal-table (2.0.0) + unicode-display_width (~> 1.1, >= 1.1.1) tzinfo (2.0.4) concurrent-ruby (~> 1.0) tzinfo-data (1.2021.1) tzinfo (>= 1.0.0) + unicode-display_width (1.7.0) wdm (0.1.1) + webrick (1.7.0) PLATFORMS x64-mingw32 DEPENDENCIES - jekyll (~> 3.8.4) - jekyll-feed (~> 0.6) - minima (~> 2.0) + jekyll (~> 4.2.0) + jekyll-feed (~> 0.15.1) + minima (~> 2.5.1) tzinfo-data - wdm (~> 0.1.0) + wdm (~> 0.1.1) + webrick (~> 1.7) BUNDLED WITH - 2.2.1 + 2.2.32 diff --git a/README.md b/README.md new file mode 100644 index 0000000..3184aa5 --- /dev/null +++ b/README.md @@ -0,0 +1,206 @@ +# 超业余足球联赛网站生成器 +# Super Unprofessional League Website Generator + +By shrekshao狄学长 + +[EN](docs/EN.md) | [简体中文](#) + +[示例](https://super-unprofessional-league.github.io/super-unprofessional-league-website/) + +一个基于Jekyll的静态网站生成器,转为建造超业余足球联赛网站定制,适用于校园内赛事,社区联赛等。 + +![](docs/tournament-page.png) + +![](docs/team-page.png) + +![](docs/game-page.png) + +已支持以下功能: +* 多个赛季 + - 联赛(传统积分榜,积分等数据根据比赛信息自动计算) + - 杯赛(小组赛积分榜 + 淘汰赛树状图) +* 比赛页面 + - 比分 + - 各类信息: 日期, 点球决胜,弃权等 + - 比赛事件 + - 进球 + - 乌龙球 + - 点球 + - 红黄牌 + - 换人 + - 照片 + - 视频外链嵌入 +* 球员数据榜 + - 射手榜(进球数根据比赛信息自动计算) +* 队伍页面 + - 球员列表 + - 首发阵容 + - 照片 +* 语言翻译支持 +* 战报,新闻,通知等文章发布 + + + +## 快速开始 + +* 安装 [Jekyll](https://jekyllrb.com/docs/) (参考Jekyll官方文档) +* `bundle install` +* 开发状态下 `bundle exec jekyll serve` +* 生成网站 `bundle exec jekyll build` (`_site/`下) +* `_site/` 目录下 `git init`, push 到 github上或其他服务商来部署(参考 github page 文档等) + * 注意:因为项目使用了自定义Jekyll plugin所以无法使用github自带的自动生成 + + +## 添加你的联赛数据 + +所有比赛相关数据在 `_data/` 目录下 + +所有静态文件(照片等)置于 `assets` 目录下 + +### _data 数据结构示例 + +* _data + - seasons + - 2018-2019 + - config.json (可选,若无则默认为联赛模式) + - teams + * bayern.json + * dortmund.json + - games + * 2018-11-10-1.json + +### teams 队伍数据结构 + +```json +{ + "display_name": "多特蒙德", + "description": "blahblahblah...", + "logo": "bvb09.jpg", + "players": { + "starting": [ + { + "number": 1, + "name": "布尔基", + "img": "placeholder-player.jpg", + "locator": "GK", + "position": "门将" + } + ,{ + "number": 28, + "name": "维特塞尔", + "img": "placeholder-player.jpg", + "locator": "CDM", + "position": "中场" + } + ,{ + "number": 11, + "name": "罗伊斯", + "img": "placeholder-player.jpg", + "locator": "CAM", + "position": "中场" + } + ], + "subs": [ + { + "number": 9, + "name": "哈兰德", + "img": "placeholder-player.jpg", + "position": "前锋" + } + + ] + } +} +``` + +* 队伍文件名似乎暂时只支持ascii英文字符 +* 阵容位置缩写 (`GK`, `CM`, etc) 对应到css里预设的位置 ([在这里看全部可用位置缩写](https://github.com/super-unprofessional-league/super-unprofessional-league-website/blob/master/assets/css/custom-football-squad.css#L70)) + +![](docs/field-locator.png) + +### games 比赛数据结构 + +```json +{ + "date": "2018/11/10/9:30", + "type": "group-r1", + "schedule": false, + "home": { + "key": "dortmund", + "score": 3, + "events": [ + {"type": "yellow", "time": 29, "player": "Weigl"}, + {"type": "yellow", "time": 36, "player": "Akanji"}, + {"type": "off", "time": 46, "player": "Weigl"}, + {"type": "sub", "time": 46, "player": "Dahoud"}, + {"type": "penalty", "time": 49, "player": "Reus"}, + {"type": "goal", "time": 67, "player": "Reus"}, + {"type": "goal", "time": 73, "player": "Paco Alcacer"} + ] + }, + "away": { + "key": "bayern", + "score": 2, + "events": [ + {"type": "goal", "time": 26, "player": "Lewandowski"}, + {"type": "goal", "time": 52, "player": "Lewandowski"}, + {"type": "yellow", "time": 55, "player": "Ribery"} + ] + } +} +``` + +* `type` string若包含`group`则为小组赛阶段比赛 + +### config.json 联赛设置 + +```json +{ + "display_name": "健雄杯2013", + "type": "group + knockout", + "group_stage": { + "A": [ + "613111", + "610122", + "610121", + "610111" + ], + "B": [ + "611111", + "613121", + "610113", + "610112" + ] + }, + "knockout_stage": [ + [ + ["610131", "610111", "2013-10-21-1"], + + ["613111", "610112", "2013-10-20-1"], + + ["613131", "611131", ""], + + ["610132", "611111", "2013-10-15-1"] + ], + [ + ["610111", "613111", "2013-11-14-1"], + + ["611131", "610132", "2013-11-15-1"] + ], + [ + ["613111","611131", "2013-11-17-1"] + ] + ], + "winner": "613111", + "rules": "*大一球队直接进入淘汰赛\n*各小组前两名出线" +} +``` + +* 若无此文件则赛季默认为联赛 +* `type` + - `league` + - `group + knockout` +* 若为 `group + knockout` + * `group_stage` 为 `小组名` => `队伍文件名(无后缀)` + * `knockout_stage`每个数组轮次为2的幂次递减,... 16, 8, 4, 2, 1 + * `["主队文件名(无后缀)", "客队文件名(无后缀)", "比赛文件名(无后缀)"]` \ No newline at end of file diff --git a/_config.yml b/_config.yml index 196370a..1c1cf1f 100644 --- a/_config.yml +++ b/_config.yml @@ -13,12 +13,11 @@ # 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: NCCSF -author: 北加州华人足球联盟 +title: NCCSF北加足球生涯 +author: 狄学长 # email: sul@sul.com description: >- # this means to ignore newlines until "baseurl:" - 北加州华人足球联盟(Northern California Chinese Soccer Federation, aka NCCSF) 是由旧金山湾区华人球队共同发起成立的, 经美国联邦和加州政府认证的非盈利组织(501c.4 nonprofit organization)。 NCCSF 致力于发展华人社区群众足球运动,提高社区球员/球队数量及足球水平,促进社区球队/球员之间友好交流,从而达到提高足球运动在北加州/北美社区的普及度及增强华人体质的目标。 - 通过参与组织各类有有益社区的足球比赛及活动,NCCSF 力争为北加州华人社区足球队提供良好的后勤保障服务,为成员球队和广大足球爱好者打造一个资源共享的公共平台。 + NCCSF非官方战报赛果阵容,记录足球生活。战报倾向性取决于作者转会到哪个队踢 baseurl: "" # the subpath of your site url: "" # the base hostname & protocol for your site, e.g. http://example.com lang: zh diff --git a/_data/seasons/21w/config.json b/_data/seasons/21w/config.json new file mode 100644 index 0000000..b421e35 --- /dev/null +++ b/_data/seasons/21w/config.json @@ -0,0 +1,6 @@ +{ + "display_name": "21冬", + "description": "2021年冬季联赛", + "type": "league", + "rules": "*本次联赛共有16支球队参加,120场比赛。\n*9v9" +} \ No newline at end of file diff --git a/_data/seasons/21w/games/2021-12-12-0.json b/_data/seasons/21w/games/2021-12-12-0.json new file mode 100644 index 0000000..b984c35 --- /dev/null +++ b/_data/seasons/21w/games/2021-12-12-0.json @@ -0,0 +1,19 @@ +{ + "date": "2021-12-12 04:00PM", + "type": "#12", + "videos": [ + "" + ], + "home": { + "key": "GSF-U", + "score": 3, + "events": [ + ] + }, + "away": { + "key": "OverPower", + "score": 0, + "events": [ + ] + } +} \ No newline at end of file diff --git a/_data/seasons/21w/games/2021-12-12-1.json b/_data/seasons/21w/games/2021-12-12-1.json new file mode 100644 index 0000000..2cd35bc --- /dev/null +++ b/_data/seasons/21w/games/2021-12-12-1.json @@ -0,0 +1,20 @@ +{ + "date": "2021-12-12 06:00PM", + "type": "#12", + "videos": [ + "" + ,"" + ], + "home": { + "key": "THU", + "score": 4, + "events": [ + ] + }, + "away": { + "key": "GSF-C", + "score": 1, + "events": [ + ] + } +} \ No newline at end of file diff --git a/_data/seasons/21w/teams/CalBlue.json b/_data/seasons/21w/teams/CalBlue.json new file mode 100644 index 0000000..ccd7ff9 --- /dev/null +++ b/_data/seasons/21w/teams/CalBlue.json @@ -0,0 +1,12 @@ +{ + "display_name": "CalBlue加蓝", + "description": "CalBlue是一支有20年历史,活跃在湾区的老牌华人足球劲旅。", + "logo": "teams/CalBlue/logo.jpg", + "image": "teams/CalBlue/team.jpg", + "players": { + "starting": [ + ], + "subs": [ + ] + } +} \ No newline at end of file diff --git a/_data/seasons/21w/teams/GSF-C.json b/_data/seasons/21w/teams/GSF-C.json new file mode 100644 index 0000000..3235f90 --- /dev/null +++ b/_data/seasons/21w/teams/GSF-C.json @@ -0,0 +1,11 @@ +{ + "display_name": "GSF-C 社区队", + "description": "GSF = Google Soccer Field,亦或高帅富", + "logo": "teams/GSF/logo.jpg", + "players": { + "starting": [ + ], + "subs": [ + ] + } +} \ No newline at end of file diff --git a/_data/seasons/21w/teams/GSF-U.json b/_data/seasons/21w/teams/GSF-U.json new file mode 100644 index 0000000..04462c9 --- /dev/null +++ b/_data/seasons/21w/teams/GSF-U.json @@ -0,0 +1,11 @@ +{ + "display_name": "GSF-U 联队", + "description": "GSF = Google Soccer Field,亦或高帅富", + "logo": "teams/GSF/logo.jpg", + "players": { + "starting": [ + ], + "subs": [ + ] + } +} \ No newline at end of file diff --git a/_data/seasons/21w/teams/GSF-W.json b/_data/seasons/21w/teams/GSF-W.json new file mode 100644 index 0000000..9c26097 --- /dev/null +++ b/_data/seasons/21w/teams/GSF-W.json @@ -0,0 +1,11 @@ +{ + "display_name": "GSF-W 流浪者", + "description": "GSF = Google Soccer Field,亦或高帅富", + "logo": "teams/GSF/logo.jpg", + "players": { + "starting": [ + ], + "subs": [ + ] + } +} \ No newline at end of file diff --git a/_data/seasons/21w/teams/ICP.json b/_data/seasons/21w/teams/ICP.json new file mode 100644 index 0000000..19ceb15 --- /dev/null +++ b/_data/seasons/21w/teams/ICP.json @@ -0,0 +1,80 @@ +{ + "display_name": "ICP", + "description": "ICP成立于2017年,由一帮在Irvington Community Park租场踢PICKUP的朋友组成。第一次组队参加2017八人制联赛,喜获勇者组冠军。2018年与兄弟队联合组队参加北加足联西贡渔港足球杯长青组(40+),以黑马身份夺得长青组亚军。", + "logo": "teams/ICP/logo.png", + "image": "teams/ICP/team.jpg", + "players": { + "starting": [ + { + "number": 1, + "name": "名字", + "img": "teams/ICP/a/gk.jpg", + "position": "门将", + "locator": "GK" + } + ,{ + "number": 14, + "name": "名字", + "img": "teams/ICP/a/gk.jpg", + "position": "后卫", + "locator": "RCB" + } + ,{ + "number": 16, + "name": "名字", + "img": "teams/ICP/a/gk.jpg", + "position": "后卫", + "locator": "LB" + } + ,{ + "number": 55, + "name": "名字", + "img": "teams/ICP/a/gk.jpg", + "position": "后卫", + "locator": "RWB" + } + ,{ + "number": 4, + "name": "名字", + "img": "teams/ICP/a/gk.jpg", + "position": "中场", + "locator": "CDM" + } + ,{ + "number": 9, + "name": "名字", + "img": "teams/ICP/a/gk.jpg", + "position": "中场", + "locator": "LCM" + } + ,{ + "number": 10, + "name": "名字", + "img": "teams/ICP/a/gk.jpg", + "position": "前锋", + "locator": "LW" + } + ,{ + "number": 11, + "name": "名字", + "img": "teams/ICP/a/gk.jpg", + "position": "前锋", + "locator": "ST" + } + ], + "subs": [ + { + "number": 12, + "name": "名字", + "position": "前锋", + "locator": "LW" + } + ,{ + "number": 13, + "name": "名字", + "position": "前锋", + "locator": "ST" + } + ] + } +} \ No newline at end of file diff --git a/_data/seasons/21w/teams/OverPower.json b/_data/seasons/21w/teams/OverPower.json new file mode 100644 index 0000000..5ba6890 --- /dev/null +++ b/_data/seasons/21w/teams/OverPower.json @@ -0,0 +1,11 @@ +{ + "display_name": "OverPower加州风暴", + "description": "OverPower是一支由热爱足球的湾区华人青年组成的队伍,我们活跃于湾区各大足球比赛,成绩斐然,近三年来队伍不断壮大,成绩不断提高,成为北加成长最快的队伍。", + "logo": "teams/OverPower/logo.jpg", + "players": { + "starting": [ + ], + "subs": [ + ] + } +} \ No newline at end of file diff --git a/_data/seasons/21w/teams/THU.json b/_data/seasons/21w/teams/THU.json new file mode 100644 index 0000000..2591172 --- /dev/null +++ b/_data/seasons/21w/teams/THU.json @@ -0,0 +1,11 @@ +{ + "display_name": "清华老兵", + "description": "湾区清华老兵足球队是北美清华老兵足球队的加州湾区分队。母队北美清华老兵足球队已经有20年历史,一直是北美华人足球劲旅。", + "logo": "teams/THU/logo.jpg", + "players": { + "starting": [ + ], + "subs": [ + ] + } +} \ No newline at end of file diff --git a/_includes/header.html b/_includes/header.html index afe66f4..2e3ea69 100644 --- a/_includes/header.html +++ b/_includes/header.html @@ -1,33 +1,26 @@ diff --git a/_includes/squad.html b/_includes/squad.html index 09aae0c..4d5e6a9 100644 --- a/_includes/squad.html +++ b/_includes/squad.html @@ -1,6 +1,7 @@
+ {% if include.squad != nil %} {% for player in include.squad %} {% if player.locator != nil %}
@@ -9,5 +10,6 @@
{% endif %} {% endfor %} + {% endif %}
\ No newline at end of file diff --git a/_layouts/game.html b/_layouts/game.html index 56c8957..84fb061 100644 --- a/_layouts/game.html +++ b/_layouts/game.html @@ -56,6 +56,20 @@

+
+
+ {% if page.game.home.squad != nil %} + {% include squad.html squad=page.game.home.squad %} + {% endif %} +
+ +
+ {% if page.game.away.squad != nil %} + {% include squad.html squad=page.game.away.squad %} + {% endif %} +
+
+ {% if page.game.video %}
@@ -63,6 +77,15 @@

{% endif %} +{% if page.game.videos %} +{% for v in page.game.videos %} +
+
+ {{v | url_decode}} +
+
+{% endfor %} +{% endif %} {% if page.game.images %}
diff --git a/_layouts/goal_scorers.html b/_layouts/goal_scorers.html index 0e07b72..817aa8f 100644 --- a/_layouts/goal_scorers.html +++ b/_layouts/goal_scorers.html @@ -2,7 +2,7 @@ layout: default --- -{% include season_tabs.html name=page.display_name description=page.description %} +{% include season_tabs.html name=page.display_name %}
 

{% t goal_scorers %}

diff --git a/_layouts/team.html b/_layouts/team.html index b3bb8a9..cf28d10 100644 --- a/_layouts/team.html +++ b/_layouts/team.html @@ -76,7 +76,7 @@

-
+
{% include squad.html squad=page.team.players.starting %}
diff --git a/_plugins/league_generator.rb b/_plugins/league_generator.rb index 9706107..132d6e5 100644 --- a/_plugins/league_generator.rb +++ b/_plugins/league_generator.rb @@ -39,7 +39,25 @@ def initialize(site, base, dir, team_key, team, season_key, season, history_stat end class GamePage < Jekyll::Page - def initialize(site, base, dir, key, game) + def buildStartingSquad(squad, team_player_hash) + for i in 0..(squad.length-1) + s = squad[i] + l = s['locator'] + p = team_player_hash[s['name']] + if l != nil + squad[i] = { + 'name' => p['name'], + 'number' => p['number'], + 'img' => p['img'], + 'locator' => l + } + else + squad[i] = team_player_hash[s['name']] + end + end + end + + def initialize(site, base, dir, key, game, home_team, away_team) @site = site @base = base @dir = dir @@ -51,6 +69,22 @@ def initialize(site, base, dir, key, game) self.data['key'] = key self.data['game'] = game + + # build squad + if game['home']['squad'] != nil + if game['home']['squad'] == 'default' + game['home']['squad'] = home_team['players']['starting'] + else + self.buildStartingSquad(game['home']['squad'], home_team['player_hash']) + end + end + if game['away']['squad'] != nil + if game['away']['squad'] == 'default' + game['away']['squad'] = away_team['players']['starting'] + else + self.buildStartingSquad(game['away']['squad'], away_team['player_hash']) + end + end # self.data['home_team'] = home_team # self.data['away_team'] = away_team @@ -352,6 +386,19 @@ def generate(site) home_team = team_hash[game['home']['key']] away_team = team_hash[game['away']['key']] + if home_team['players'] == nil + home_team['players'] = { + "starting" => [], + "subs" => [] + } + end + if away_team['players'] == nil + away_team['players'] = { + "starting" => [], + "subs" => [] + } + end + home_team['games'] << p away_team['games'] << p @@ -392,7 +439,7 @@ def generate(site) end end - site.pages << GamePage.new(site, site.source, File.join('seasons', season[0], 'games', key), key, game) + site.pages << GamePage.new(site, site.source, File.join('seasons', season[0], 'games', key), key, game, home_team, away_team) end diff --git a/_posts/2021-07-10-league-rules.md b/_posts/2021-07-10-league-rules.md deleted file mode 100644 index f0e55d5..0000000 --- a/_posts/2021-07-10-league-rules.md +++ /dev/null @@ -1,76 +0,0 @@ ---- -layout: game_post -season_key: "21s" - -title: "2021年夏季联赛规则简版以及赛前赛后各队任务" -date: 2013-11-17 -categories: news ---- - -* 竞赛及决定名次办法 - 1. 本次联赛为友谊比赛,不计名次。 - 1. 本次联赛有16支球队,分为A,B,两个小组,组内单循环赛制。各组比赛在不同场地进行,上场比赛人数也有不同要求 - 1. A组采用9人制, 在 Irvington Community Park (以下简称ICP) 举行, 地址:41885 Blacow Rd, Fremont, CA 94538 - 1. B组采用8人制, 在 Newark Sportsfield Park(以下简称Newark)举行, 地址: 6800 Mowry Avenue, Newark, CA 94560 - 1. 比赛时间是90分钟,分上下半场各45分钟,中间休息10分钟 -* 参赛队员资格 - 1. 球员必须年满18周岁才能参加比赛 - 1. 每队参赛球员没有限制,无须在OLE上加入队员名单 -* 着装与装备要求 - 1. 上场队员必须带护腿板,穿长筒球袜,并完全覆盖护腿板,否则不允许上场比赛。 - 1. 上场球员不允许佩戴任何首饰戒指及其他佩戴物,除非有医生证明需要日常佩戴以维持身体健康之需要。不允许佩戴普通眼镜,只允许球类专用的运动眼镜。 - 1. 每个队员上场比赛的球衣要有号码且不能重复。当场比赛两个队员不能使用相同的球衣号码。 - 1. 组委会准备了不同颜色有号码的背心,如果一些参赛队短期内没有统一的有号码的队服,在比赛前可以向组委会申请借用带有号码的背心。 -* 上场队员资格审核 - 1. 本联赛为友谊比赛,每场比赛无须对上场队员资格进行审核。 -* 比赛弃权 - 1. 球队弃权的决定必须在比赛48小时之前(星期四晚12点前)通知组委会,否则弃权球队须交纳$50罚金给对手球队。 -* 不可抗力影响 - 1. 如果因为天气或场地等不可抗原因取消比赛,组委会不会再安排补赛。 - -### 比赛规则与特殊规定 -* **执行国际足联最新版本的《足球竞赛规则》,及以下特殊规定** - 1. A组采用9人制在 ICP 进行的比赛,执行国际足联最新版本的《足球竞赛规则》,(但禁止铲球) - 1. B组采用8人制在 Newark 进行的比赛,有以下特殊规定 - 1. B组采用8人制的比赛没有越位 - 1. 禁止以铲球的方式争抢球权,铲球队员会得到黄牌警告,甚至红牌罚下。守门员在禁区内有铲球的特权,在禁区外等同于普通球员,不能铲球。 - 1. 守门员用手拿球后,在球落地前不能直接用脚踢球,只能用手把球丢出,或在球着地后再踢,违反则对方发角球 - 1. 守门员二次触球的违例则对方发间接任意球,包括: 1、守门员把球放到地上后又抱起; 2、守门员把球向上或斜上方向抛起后又把球接住; 3、守门员把球扔到脚上踢起后又抓住。 - 1. 定位球:当一方发定位球时,无球方队员要退到距离罚球点6米以外。如果无球方队员故意在近距离阻碍对方快发任意球,则该无球方队员应被黄牌警告。 - 1. 点球: 队员在本方罚球区内 ,违反可判罚直接任意球的规定,无论当时球在何处,应判罚点球。点球离球门8米(从大禁区线上向球门方向跨一步的位置)。 - 1. 换人:不限人次。替补队员在中场线外就绪后向裁判提出换人及人数,在裁判批准后,场上队员跑步下场,替补队员才能上场。裁判有权否决无球权球队的换人申请。 - 1. 在比赛进行中未经裁判允许下,任何球员擅自进出场地,会被黄牌警告 - 1. 裁判员认为,如果队员草率地、鲁莽地或使用过分的力量在双方进行争抢或对方队员控制球时实施铲抢,被视为严重犯规,判给对方直接任意球,可根据犯规严重情况给予黄牌警告或红牌罚出场。 - 1. 犯规情节严重,或明显伤人的一律红牌,情节特别严重的要追加处罚 - 1. 场外队员只能在指定区域观看比赛,禁止站在场边。只有需要换上场的队员才能在中场线外等待 -* 红黄牌规定 - 1. 黄牌:黄牌罚立即下场等待五分钟,可换其他队员上场。守门员得到黄牌后不需离场。 - 1. 红牌:得到红牌的队员罚立即终止当场比赛,下一场比赛可以上场,不停赛,所在球队要被罚款$100,从压金中扣除。红牌犯规情节严重者要加罚。 -* 裁判权威 - 1. 裁判有绝对权威,禁止在任何情况下和裁判争执。场上场外任何队员辱骂裁判一律红牌,并停赛至少4场。情节特别严重者要加罚。 - 1. 场上球员对裁判判罚的意见只能通过队长与裁判交涉。对裁判判罚说三道四的队员,在口头警告无效后,要黄牌警告。 - 1. 不服从裁判判罚,(用言语或动作表示异议),藐视裁判权威的队员,直接黄牌警告。 - 1. 对裁判当场执法有意见,请通过球队队长向NCCSF组委会提交。 - 1. 严禁场外队员大声喧哗干扰指责裁判,如果在裁判提出2次正式警告后,仍屡禁不止,则裁判有权终止比赛,并判对方球队3:0胜。而且球队要被罚款$50,从压金中扣除。 -* 禁令 - 1. 严格禁止场内场外球员用任何言语或肢体动作辱骂他人,裁判视情况可以给黄牌警告或红牌罚下 - 1. 严格禁止打架闹事,挑起打架的队员直接禁止后续赛事并由NCCSF记录在案,情节严重的或有前科的终身禁止参加NCCSF组织的赛事。如果有违反体育道德行为禁赛本赛季余下所有比赛,如果余下比赛不满8场则禁赛8场 - 1. 如果违反体育道德行为情节特别严重的禁赛12个月或终生禁止参加NCCSF组织的所有比赛 - 1. 追加处罚自动带入足联组织的所有比赛 - 1. 人工草地场内禁止抽烟,如果有球场围栏内吸烟者将罚款$200,罚款由当事球队负责 -* 申诉与仲裁 - 1. 当场比赛结束后,比分,红黄牌纪录即为不可更改的最终结果。不在申诉范畴之内。 - 1. 申诉只适用于对违反体育道德行为所受到的追加处罚。 - 1. 球队如果对追加处罚有异议,可以缴纳$100申诉费后向赛事DRC申诉,申诉费只会在申诉成功后退回。 - -NCCSF保留最终解释权 - -### 各队比赛前后任务 - -* 赛前任务 - 1. 赛前交$20裁判费给裁判 - 1. A组上周拿球网的值班球队必须在比赛前提前把球网带回球场,并安装好。 - 1. B组第一场比赛各队要setup各自的球门 -* 赛后任务 - 1. 每场比赛结束后,参赛两队要清理场地垃圾。最后一场比赛结束后,参赛两队要负责清理整个场地的垃圾。如果由于场地垃圾未清理而遭到City的罚款,罚金由最后两支球队均摊,又押金中扣除 - 1. A组最后比赛的本周值班球队负责拆除球门球网,带回保管,并在下周比赛前提前到场地安装 \ No newline at end of file diff --git a/_posts/2021-12-12-r12-news.md b/_posts/2021-12-12-r12-news.md new file mode 100644 index 0000000..3b19d4a --- /dev/null +++ b/_posts/2021-12-12-r12-news.md @@ -0,0 +1,25 @@ +--- +layout: game_post +season_key: "21w" +game_key: "2021-12-12-0" + +title: "第十二轮GSF United 3:0 OP 战报" +categories: news +--- + + + + +2021年12月11日深夜,gsf联队网上会议室仍“灯火通明“, 队员们本着战略藐视,战术重视的态度热火朝天的讨论着第二天对阵op的各种细节。据“可靠”内部情报,op 拓球王将尽遣在墨联征战的主力来力战gsf联队来力保在联赛排名。而gsf 联队又面临着全场多面手小虹,巴西快马pedro以及在上一轮对阵hehe中一过五后送出妙传的托尼大腿的缺席,让本来就因伤而人员捉襟见肘的球队更是雪上加霜。然。。。并卵,会议最终达成以不变应万变的指导思想结束。 + +翌日午时,gsf获得重要情报,由于天气原因op主力球员尽数缺席,只能以残阵应战。下午四时,随着“守门员”的一声哨响,比赛正式开始了。双方都没有受到湿冷的阴雨或者人员紧缺影响而迅速进入到了状态之中,你来我往互有进攻,精彩纷呈。gsf联队后防佳捷,Colin和正年继续保持着一直以来让对方九十分钟不射的稳度和硬度。猜哥,中焱,宁球王疏导着球队的进攻,频频传出妙球和第一时间阻击对方的反击。Kevin和Renbo积极跑动,接应传球。Xuan总扣球大法炉火纯青穿梭于对方的后方。。 gsf联队将比赛节奏紧紧的控制在自己手里。然而,人算不如天算。当比赛进行到第七分钟时,gsf联队出现后场传球失误,op的前锋12号球员抢断得球长驱直入禁区,眼见对方球员正要提腿射门,防守队员拍马赶到将球解围出界。 + +言归正传,gsf将比分改写为1:0是当比赛进行到20分钟时,宁球王在己方大禁区线上接到对方的”传球“,快速过掉对方一名球员,迅速向前推进到对方半场时,抬头一看对方门户大开,疑似“空城计”,宁球王想起昨晚会议定制的以不变应万变的策略不为所惑,继续推进到对方大禁区,在对方多民球员的包夹下一脚逆足穿云箭射进了死角(Wenyan语)。赛后回放才发现“空城计”竟是对方门将在帮隔壁赛场捡球离开球门刚刚回到球门,而宁球王射门也充分利用了拓球王势能大的特点,射向反角而拓球王也是奈何鞭虽长却难及。 + +本场比赛的一次精彩配合发生在地30分钟,球在中场经过无数次“无效”传递之后来到了gsf右路,中焱传给站位中场空位的宁球王后,迅速插入禁区,而宁球王一脚传给已经在边路等待的Wenyan,Wenyan轻盈地用脚后跟做给了后排插上的中焱,中焱拿球后传向球门远角,可惜力道稍大球飞出底线。 + +Gsf在比赛进行到第60分钟左右将比赛改写为2:0。gsf获得右边角球,gsf球员充分实践了安排已久的战术,发球球员Bruce给了埋伏在禁区里的球员宁球王,Kevin,Wenyan以及中焱一个第n号进攻模式的指令,只见Kevin佯攻抢前点并带走两个防守球员并成功带偏对方门将,宁球王眼疾脚快跑向后门柱顶向了Bruce发出的漂亮的弧线球,头进了!!! + +Gsf在下半场25分钟继续扩大比分,对方从左路进攻受阻,球来到猜哥脚下,猜哥顺势将球传给Xuan总,Xuan总带球推进并吸引着对 方多名防守球员,猜哥迅速跑向右边空位,Xuan总冷静将球分给无人防守的猜哥,猜哥带球突破过掉对方1个,2个球员来到大禁区前,倚住对方球员一脚猜哥标志性大力射门,球应声入网,3:0。虽然留给op球队的时间不多了,3球落后的op并没有气馁,拓球王调兵遣将(场上球员轮转),发起了几波猛烈攻势,但遗憾的是都没有取得进球。 + +终场哨声响起,最后gsf联队以3:0战胜op稳稳的保住联赛前排排名,而op的拼搏不放弃的精神也赢得了gsf联队球员的尊重(拓球王也得以可以继续混迹于gsf社区)。正如张指导所说,凡是gsf 联队靠防守将对手进球限制在1球以下,而自己进球在1球及以上的比赛,基本都是gsf 联赢球了! \ No newline at end of file diff --git a/assets/img/teams/GSF/logo.jpg b/assets/img/teams/GSF/logo.jpg new file mode 100644 index 0000000..1a20376 Binary files /dev/null and b/assets/img/teams/GSF/logo.jpg differ diff --git a/assets/img/teams/THU/logo.jpg b/assets/img/teams/THU/logo.jpg new file mode 100644 index 0000000..9122ca2 Binary files /dev/null and b/assets/img/teams/THU/logo.jpg differ diff --git a/docs/EN.md b/docs/EN.md new file mode 100644 index 0000000..3d1458f --- /dev/null +++ b/docs/EN.md @@ -0,0 +1,210 @@ +# Super Unprofessional League Website Generator + +By shrekshao狄学长 + +[EN](#) | [简体中文](../README.md) + +[Demo](https://super-unprofessional-league.github.io/super-unprofessional-league-website/) (in Chinese) + +A Jekyll based static site generator for website of a unprofessional league. + +![](tournament-page.png) + +![](team-page.png) + +![](game-page.png) + +Features include: +* Multiple seasons + - League (traditional table, with data auto calculated from game data) + - Tournament (group stage table + knockout stage bracket) +* Game + - score + - info: date, round, etc. + - events + - goal + - penalty + - yellow card + - red card + - sub + - pictures + - video embed code +* Player stats table + - goal scorer (goals auto calculated from game data) +* Team page + - Starting and sub player list + - Formation of starting squad + - Pictures +* Language translation support +* News post + + +It is suitable for college and community league since it can be hosted free on a number of place. + +## Getting Started (TODO: Refine) + +* install [Jekyll](https://jekyllrb.com/docs/) (More basic tutorials follow Jekyll) +* `bundle install` +* generate the site by running `bundle exec jekyll serve` during development. +* build the site by running `bundle exec jekyll build` before publish. +* init git in `_site` folder, push to the `gh_page` branch on github to host + * github cannot automatically built since we use customized jekyll plugin. + + +## Add your data + +All league data (matches, squad, etc.) goes under `_data` folder. All static assets (photos, images) better goes under `assets`. + +### _data folder structures + +* _data + - seasons + - 2018-2019 + - config.json (optional, default to League table style) + - teams + * bayern.json + * dortmund.json + - games + * 2018-11-10-1.json + +### Team json file example + +```json +{ + "key": "dortmund", + "display_name": "Borussia Dortmund", + "description": "blahblahblah...", + "logo": "bvb09.jpg", + "table": { + "games_played": 20, + "wins": 15, + "draws": 4, + "loses": 1, + "goals_for": 51, + "goals_against": 20, + "points": 49 + }, + "players": { + "starting": [ + { + "number": 1, + "name": "Roman Burki", + "img": "placeholder-player.jpg", + "locator": "GK", + "position": "GoalKeeper" + } + ,{ + "number": 28, + "name": "Axel Witsel", + "img": "placeholder-player.jpg", + "locator": "CDM", + "position": "Midfielder" + } + ,{ + "number": 11, + "name": "Marco Reus", + "img": "placeholder-player.jpg", + "locator": "CAM", + "position": "Forward" + } + ], + "subs": [ + { + "number": 22, + "name": "Christian Pulisic", + "img": "placeholder-player.jpg", + "position": "Midfielder" + } + + ] + } +} +``` + +* squad position (`GK`, `CM`, etc) abbreviations are correspond to predefined positions in css (take a look to see the full list [here](https://github.com/super-unprofessional-league/super-unprofessional-league-website/blob/master/assets/css/custom-football-squad.css#L70)) + +![](field-locator.png) + +### Game json file example + +```json +{ + "date": "2018/11/10/9:30", + "type": "round-11", + "home": { + "key": "dortmund", + "score": 3, + "events": [ + {"type": "yellow", "time": 29, "player": "Weigl"}, + {"type": "yellow", "time": 36, "player": "Akanji"}, + {"type": "off", "time": 46, "player": "Weigl"}, + {"type": "sub", "time": 46, "player": "Dahoud"}, + {"type": "penalty", "time": 49, "player": "Reus"}, + {"type": "goal", "time": 67, "player": "Reus"}, + {"type": "goal", "time": 73, "player": "Paco Alcacer"} + ] + }, + "away": { + "key": "bayern", + "score": 2, + "events": [ + {"type": "goal", "time": 26, "player": "Lewandowski"}, + {"type": "goal", "time": 52, "player": "Lewandowski"}, + {"type": "yellow", "time": 55, "player": "Ribery"} + ] + } +} +``` + +### config.json 联赛设置 + +```json +{ + "display_name": "2013", + "type": "group + knockout", + "group_stage": { + "A": [ + "613111", + "610122", + "610121", + "610111" + ], + "B": [ + "611111", + "613121", + "610113", + "610112" + ] + }, + "knockout_stage": [ + [ + ["610131", "610111", "2013-10-21-1"], + + ["613111", "610112", "2013-10-20-1"], + + ["613131", "611131", ""], + + ["610132", "611111", "2013-10-15-1"] + ], + [ + ["610111", "613111", "2013-11-14-1"], + + ["611131", "610132", "2013-11-15-1"] + ], + [ + ["613111","611131", "2013-11-17-1"] + ] + ], + "winner": "613111", + "rules": "*hahahah\n*hahha" +} +``` + +* Season defaults to League type if this file doesn't exist +* `type` + - `league` + - `group + knockout` +* if `type = "group + knockout"` + * `group_stage` is `group name` => `team file name (without ext)` + * `knockout_stage` element length is power of 2,... 16, 8, 4, 2, 1 + * `["home team file name (without ext)", "away team file name (without ext)", "game file name (without ext)"]` \ No newline at end of file diff --git a/docs/field-locator.png b/docs/field-locator.png new file mode 100644 index 0000000..b0ea673 Binary files /dev/null and b/docs/field-locator.png differ diff --git a/docs/game-page.png b/docs/game-page.png new file mode 100644 index 0000000..66d39d5 Binary files /dev/null and b/docs/game-page.png differ diff --git a/docs/team-page.png b/docs/team-page.png new file mode 100644 index 0000000..6734589 Binary files /dev/null and b/docs/team-page.png differ diff --git a/docs/tournament-page.png b/docs/tournament-page.png new file mode 100644 index 0000000..b893610 Binary files /dev/null and b/docs/tournament-page.png differ