a few additions from backlog and working on scripts
This commit is contained in:
parent
49424eb857
commit
4fab32b287
7
.gitignore
vendored
7
.gitignore
vendored
@ -1,6 +1,5 @@
|
||||
/.idea
|
||||
/tools/archive/**
|
||||
/tools/conversion/**
|
||||
/tools/git_repositories.json
|
||||
__pycache__
|
||||
/is_already_included.txt
|
||||
/local.properties
|
||||
/tools/archive/**
|
||||
/tools/lgw-import
|
||||
|
@ -3,11 +3,11 @@
|
||||
**[Dynamic HTML table](https://trilarion.github.io/opensourcegames/)** of the entries / Development **[Blog](https://trilarion.blogspot.com/search/label/osgames)** / **[Statistics](statistics.md#statistics)**
|
||||
|
||||
[comment]: # (start of autogenerated content, do not edit)
|
||||
**[All entries](games/tocs/_all.md#All)** (973)
|
||||
**[All entries](games/tocs/_all.md#All)** (976)
|
||||
|
||||
By category: **[Action](games/tocs/_action.md#action)** (182), **[Adventure](games/tocs/_adventure.md#adventure)** (27), **[Arcade](games/tocs/_arcade.md#arcade)** (56), **[Board game](games/tocs/_board-game.md#board-game)** (9), **[Card game](games/tocs/_card-game.md#card-game)** (1), **[Educational](games/tocs/_educational.md#educational)** (5), **[Framework](games/tocs/_framework.md#framework)** (61), **[Game engine](games/tocs/_game-engine.md#game-engine)** (43), **[Library](games/tocs/_library.md#library)** (22), **[Music](games/tocs/_music.md#music)** (6), **[Platform](games/tocs/_platform.md#platform)** (32), **[Puzzle](games/tocs/_puzzle.md#puzzle)** (79), **[Remake](games/tocs/_remake.md#remake)** (448), **[Role playing](games/tocs/_role-playing.md#role-playing)** (142), **[Simulation](games/tocs/_simulation.md#simulation)** (72), **[Sports](games/tocs/_sports.md#sports)** (15), **[Strategy](games/tocs/_strategy.md#strategy)** (213), **[Tool](games/tocs/_tool.md#tool)** (17), **[Visual novel](games/tocs/_visual-novel.md#visual-novel)** (4)
|
||||
By category: **[Action](games/tocs/_action.md#action)** (182), **[Adventure](games/tocs/_adventure.md#adventure)** (27), **[Arcade](games/tocs/_arcade.md#arcade)** (56), **[Board game](games/tocs/_board-game.md#board-game)** (9), **[Card game](games/tocs/_card-game.md#card-game)** (1), **[Educational](games/tocs/_educational.md#educational)** (5), **[Framework](games/tocs/_framework.md#framework)** (62), **[Game engine](games/tocs/_game-engine.md#game-engine)** (45), **[Library](games/tocs/_library.md#library)** (22), **[Music](games/tocs/_music.md#music)** (6), **[Platform](games/tocs/_platform.md#platform)** (32), **[Puzzle](games/tocs/_puzzle.md#puzzle)** (79), **[Remake](games/tocs/_remake.md#remake)** (450), **[Role playing](games/tocs/_role-playing.md#role-playing)** (142), **[Simulation](games/tocs/_simulation.md#simulation)** (72), **[Sports](games/tocs/_sports.md#sports)** (15), **[Strategy](games/tocs/_strategy.md#strategy)** (213), **[Tool](games/tocs/_tool.md#tool)** (17), **[Visual novel](games/tocs/_visual-novel.md#visual-novel)** (4)
|
||||
|
||||
By platform: **[Windows](games/tocs/_windows.md#windows)** (234), **[Linux](games/tocs/_linux.md#linux)** (217), **[macOS](games/tocs/_macos.md#macos)** (131), **[Android](games/tocs/_android.md#android)** (34), **[iOS](games/tocs/_ios.md#ios)** (4), **[Web](games/tocs/_web.md#web)** (41)
|
||||
By platform: **[Windows](games/tocs/_windows.md#windows)** (236), **[Linux](games/tocs/_linux.md#linux)** (218), **[macOS](games/tocs/_macos.md#macos)** (132), **[Android](games/tocs/_android.md#android)** (34), **[iOS](games/tocs/_ios.md#ios)** (4), **[Web](games/tocs/_web.md#web)** (41)
|
||||
|
||||
[comment]: # (end of autogenerated content)
|
||||
|
||||
|
@ -1696,6 +1696,14 @@
|
||||
"role playing, singleplayer",
|
||||
"<a href=\"https://git.code.sf.net/p/dnt/code\">Source</a> - C++ - GPL-3.0"
|
||||
],
|
||||
[
|
||||
"Do It Yourself Doom With SDL (<a href=\"https://github.com/amroibrahim/DIYDoom\">home</a>, <a href=\"https://github.com/Trilarion/opensourcegames/blob/master/games/do_it_yourself_doom_with_sdl.md\">entry</a>)",
|
||||
"A DOOM clone engine.",
|
||||
"",
|
||||
"beta / active",
|
||||
"game engine, inspired by DOOM, remake",
|
||||
"<a href=\"https://github.com/amroibrahim/DIYDoom.git\">Source</a> - C++ - MIT"
|
||||
],
|
||||
[
|
||||
"Domination (<a href=\"http://domination.sourceforge.net/\">home</a>, <a href=\"https://github.com/Trilarion/opensourcegames/blob/master/games/domination.md\">entry</a>)",
|
||||
"Is a bit like the well known board game of Risk or RisiKo.",
|
||||
@ -2208,6 +2216,14 @@
|
||||
"game engine, clone, framework, inspired by Diablo",
|
||||
"<a href=\"https://github.com/clintbellanger/flare-engine.git\">Source</a> - C++, Java - GPL-3.0"
|
||||
],
|
||||
[
|
||||
"Flex Engine (<a href=\"https://ajweeks.com/flex-engine/\">home</a>, <a href=\"https://github.com/Trilarion/opensourcegames/blob/master/games/flex_engine.md\">entry</a>)",
|
||||
"Game engine.",
|
||||
"",
|
||||
"beta / active",
|
||||
"framework",
|
||||
"<a href=\"https://github.com/ajweeks/FlexEngine.git\">Source</a> - C++ - MIT"
|
||||
],
|
||||
[
|
||||
"FlightGear (<a href=\"https://www.flightgear.org/\">home</a>, <a href=\"https://github.com/Trilarion/opensourcegames/blob/master/games/flightgear.md\">entry</a>)",
|
||||
"Flight simulator developed since 1997.",
|
||||
@ -4265,7 +4281,7 @@
|
||||
"<a href=\"https://git.octaforge.org/OctaForge/OctaCore.git\">Source</a> - C++ - Custom"
|
||||
],
|
||||
[
|
||||
"Odamex (<a href=\"https://web.archive.org/web/20190516124821/http://www.odamex.net/\">home</a>, <a href=\"https://github.com/Trilarion/opensourcegames/blob/master/games/odamex.md\">entry</a>)",
|
||||
"Odamex (<a href=\"https://odamex.net/\">home</a>, <a href=\"https://github.com/Trilarion/opensourcegames/blob/master/games/odamex.md\">entry</a>)",
|
||||
"Remake of Doom, Doom II, Heretic, Hexen.",
|
||||
"",
|
||||
"beta / active",
|
||||
@ -4896,6 +4912,14 @@
|
||||
"remake, commercial content, inspired by Star Wars Episode I: Racer, requires original content",
|
||||
"<a href=\"https://github.com/OpenSWE1R/openswe1r.git\">Source</a> - C, C++ - GPL-2.0"
|
||||
],
|
||||
[
|
||||
"OpenTESArena (<a href=\"https://github.com/afritz1/OpenTESArena\">home</a>, <a href=\"https://github.com/Trilarion/opensourcegames/blob/master/games/opentesarena.md\">entry</a>)",
|
||||
"Re-implementation of The Elder Scrolls: Arena.",
|
||||
"",
|
||||
"beta / active",
|
||||
"game engine, commercial content, inspired by The Elder Scrolls: Arena, remake, requires original content",
|
||||
"<a href=\"https://github.com/afritz1/OpenTESArena.git\">Source</a> - C++ - MIT"
|
||||
],
|
||||
[
|
||||
"OpenTitus (<a href=\"http://opentitus.sourceforge.net\">home</a>, <a href=\"https://github.com/Trilarion/opensourcegames/blob/master/games/opentitus.md\">entry</a>)",
|
||||
"Remake of Titus the Fox.",
|
||||
@ -6337,7 +6361,7 @@
|
||||
"<a href=\"https://git.code.sf.net/p/arianne/stendhal\">Source</a> - Java - GPL-2.0"
|
||||
],
|
||||
[
|
||||
"StepMania (<a href=\"https://web.archive.org/web/20190605085429/https://www.stepmania.com/\">home</a>, <a href=\"https://github.com/Trilarion/opensourcegames/blob/master/games/stepmania.md\">entry</a>)",
|
||||
"StepMania (<a href=\"https://www.stepmania.com/\">home</a>, <a href=\"https://github.com/Trilarion/opensourcegames/blob/master/games/stepmania.md\">entry</a>)",
|
||||
"Dance and rhythm game.",
|
||||
"<a href=\"https://sourceforge.net/projects/stepmania/files/\">Link</a>",
|
||||
"mature / active",
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
_Remake of Outrun._
|
||||
|
||||
- Home: https://github.com/djyt/cannonball/wiki
|
||||
- Home: https://github.com/djyt/cannonball/wiki, http://reassembler.blogspot.com/
|
||||
- State: beta
|
||||
- Download: https://github.com/djyt/cannonball/wiki#downloads
|
||||
- Keywords: action, commercial content, inspired by Outrun, remake
|
||||
|
16
games/do_it_yourself_doom_with_sdl.md
Normal file
16
games/do_it_yourself_doom_with_sdl.md
Normal file
@ -0,0 +1,16 @@
|
||||
# Do It Yourself Doom With SDL
|
||||
|
||||
_A DOOM clone engine._
|
||||
|
||||
- Home: https://github.com/amroibrahim/DIYDoom
|
||||
- State: beta
|
||||
- Platform: Windows
|
||||
- Keywords: game engine, inspired by DOOM, remake
|
||||
- Code repository: https://github.com/amroibrahim/DIYDoom.git
|
||||
- Code language: C++
|
||||
- Code license: MIT
|
||||
- Code dependencies: SDL2
|
||||
|
||||
## Building
|
||||
|
||||
- Build system: VisualStudio
|
@ -2,7 +2,7 @@
|
||||
|
||||
_Remake of Enduro._
|
||||
|
||||
- Home: https://rafaelcastrocouto.github.io/enduro/
|
||||
- Home: https://rafaelcastrocouto.github.io/enduro/, https://racascou.itch.io/enduro
|
||||
- State: mature
|
||||
- Play: https://rafaelcastrocouto.github.io/enduro/
|
||||
- Keywords: remake, inspired by Enduro, open content
|
||||
|
13
games/flex_engine.md
Normal file
13
games/flex_engine.md
Normal file
@ -0,0 +1,13 @@
|
||||
# Flex Engine
|
||||
|
||||
_Game engine._
|
||||
|
||||
- Home: https://ajweeks.com/flex-engine/
|
||||
- State: beta
|
||||
- Keywords: framework
|
||||
- Code repository: https://github.com/ajweeks/FlexEngine.git
|
||||
- Code language: C++
|
||||
- Code license: MIT
|
||||
|
||||
## Building
|
||||
|
@ -10,5 +10,7 @@ _Web-based version of the board game Settlers of Catan written in Java._
|
||||
- Code language: Java
|
||||
- Code license: GPL-3.0
|
||||
|
||||
See also http://www.settlers-android-clone.com/
|
||||
|
||||
## Building
|
||||
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
_Remake of Doom, Doom II, Heretic, Hexen._
|
||||
|
||||
- Home: https://web.archive.org/web/20190516124821/http://www.odamex.net/
|
||||
- Home: https://odamex.net/
|
||||
- State: beta
|
||||
- Keywords: game engine, inspired by Doom + Doom II + Heretic + Hexen, remake, requires original content, shooter
|
||||
- Code repository: https://github.com/odamex/odamex.git
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
_Clone of Command & Conquer: Generals._
|
||||
|
||||
- Home: https://opensage.github.io/
|
||||
- Home: https://opensage.github.io/, http://timjones.io/blog/tags/opensage/
|
||||
- State: beta
|
||||
- Download: https://github.com/OpenSAGE/OpenSAGE/releases
|
||||
- Platform: Windows, Linux, macOS
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
_Remake of Ace of Spades._
|
||||
|
||||
- Home: http://openspades.yvt.jp/
|
||||
- Home: http://openspades.yvt.jp/, https://sites.google.com/a/yvt.jp/openspades/
|
||||
- Media: https://en.wikipedia.org/wiki/Ace_of_Spades_(video_game)
|
||||
- State: beta
|
||||
- Download: https://github.com/yvt/openspades/releases
|
||||
|
16
games/opentesarena.md
Normal file
16
games/opentesarena.md
Normal file
@ -0,0 +1,16 @@
|
||||
# OpenTESArena
|
||||
|
||||
_Re-implementation of The Elder Scrolls: Arena._
|
||||
|
||||
- Home: https://github.com/afritz1/OpenTESArena
|
||||
- State: beta
|
||||
- Platform: Windows, Linux, macOS
|
||||
- Keywords: game engine, commercial content, inspired by The Elder Scrolls: Arena, remake, requires original content
|
||||
- Code repository: https://github.com/afritz1/OpenTESArena.git
|
||||
- Code language: C++
|
||||
- Code license: MIT
|
||||
- Code dependencies: OpenAL, SDL2, WildMidi
|
||||
|
||||
## Building
|
||||
|
||||
- Build system: CMake
|
@ -2,7 +2,7 @@
|
||||
|
||||
_Dance and rhythm game._
|
||||
|
||||
- Home: https://web.archive.org/web/20190605085429/https://www.stepmania.com/, https://sourceforge.net/projects/stepmania/
|
||||
- Home: https://www.stepmania.com/, https://sourceforge.net/projects/stepmania/
|
||||
- State: mature
|
||||
- Download: https://sourceforge.net/projects/stepmania/files/
|
||||
- Platform: Windows
|
||||
|
@ -212,6 +212,7 @@
|
||||
- **[Digger Remastered](../digger_remastered.md)** (C, GPL-2.0, mature, inactive since 2004)
|
||||
- **[Digital: A Love Story](../digital_a_love_story.md)** (Ren'py, CC-BY-NC-SA, mature)
|
||||
- **[DNT](../dnt.md)** (C++, GPL-3.0, beta, inactive since 2016)
|
||||
- **[Do It Yourself Doom With SDL](../do_it_yourself_doom_with_sdl.md)** (C++, MIT, beta)
|
||||
- **[Domination](../domination.md)** (Java, GPL-3.0, mature)
|
||||
- **[Doom Legacy](../doom_legacy.md)** (C++, GPL-2.0, mature)
|
||||
- **[DOOM Retro](../doom_retro.md)** (C, C++, GPL-3.0, mature)
|
||||
@ -276,6 +277,7 @@
|
||||
- **[First Strike](../first_strike.md)** (Java, MIT, mature)
|
||||
- **[Fish Fillets - Next Generation](../fish_fillets-next_generation.md)** (C++, GPL-2.0, mature)
|
||||
- **[Flare](../flare.md)** (C++, Java, GPL-3.0, mature)
|
||||
- **[Flex Engine](../flex_engine.md)** (C++, MIT, beta)
|
||||
- **[FlightGear](../flightgear.md)** (C++, GPL-2.0, mature)
|
||||
- **[Flixel](../flixel.md)** (ActionScript, MIT, mature)
|
||||
- **[Fluid Table Tennis](../fluid_table_tennis.md)** (JavaScript, MIT, mature, inactive since 2013)
|
||||
@ -612,6 +614,7 @@
|
||||
- **[OpenSR](../opensr.md)** (C++, GPL-3.0, beta, inactive since 2017)
|
||||
- **[OpenSSL](../openssl.md)** (C, Custom, mature)
|
||||
- **[OpenSWE1R](../openswe1r.md)** (C, C++, GPL-2.0, beta)
|
||||
- **[OpenTESArena](../opentesarena.md)** (C++, MIT, beta)
|
||||
- **[OpenTitus](../opentitus.md)** (C, GPL-3.0, beta, inactive since 2014)
|
||||
- **[OpenTomb](../opentomb.md)** (C, C++, Lua, LGPL-3.0, beta)
|
||||
- **[OpenTriad](../opentriad.md)** (Java, GPL-3.0, beta, inactive since 2017)
|
||||
|
@ -15,6 +15,7 @@
|
||||
- **[ENIGMA (development environment)](../enigma_development_environment.md)** (C++, C, GPL-3.0, mature)
|
||||
- **[F.LF](../flf.md)** (JavaScript, ?, mature)
|
||||
- **[Flare](../flare.md)** (C++, Java, GPL-3.0, mature)
|
||||
- **[Flex Engine](../flex_engine.md)** (C++, MIT, beta)
|
||||
- **[Flixel](../flixel.md)** (ActionScript, MIT, mature)
|
||||
- **[GemRB](../gemrb.md)** (C++, Python, GPL-2.0, mature)
|
||||
- **[Godot](../godot.md)** (C, C++, MIT, mature)
|
||||
|
@ -4,6 +4,7 @@
|
||||
- **[Castle Game Engine](../castle_game_engine.md)** (Pascal, LGPL-2.0, mature)
|
||||
- **[DelverEngine](../delverengine.md)** (Java, Custom, beta)
|
||||
- **[DesktopAdventures](../desktopadventures.md)** (C, LGPL-2.1, beta)
|
||||
- **[Do It Yourself Doom With SDL](../do_it_yourself_doom_with_sdl.md)** (C++, MIT, beta)
|
||||
- **[erampage](../erampage.md)** (C, GPL-2.0, beta, inactive since 2015)
|
||||
- **[Flare](../flare.md)** (C++, Java, GPL-3.0, mature)
|
||||
- **[Free in the Dark (engine)](../free_in_the_dark_engine.md)** (C, C++, GPL-2.0, beta)
|
||||
@ -26,6 +27,7 @@
|
||||
- **[OpenNFS](../opennfs.md)** (C, C++, MIT, beta)
|
||||
- **[OpenRW](../openrw.md)** (C, C++, GPL-3.0, beta)
|
||||
- **[OpenSAGE](../opensage.md)** (C#, LGPL-3.0, beta)
|
||||
- **[OpenTESArena](../opentesarena.md)** (C++, MIT, beta)
|
||||
- **[OpenTomb](../opentomb.md)** (C, C++, Lua, LGPL-3.0, beta)
|
||||
- **[PainTown](../paintown.md)** (C++, Java, Python, 3-clause BSD, mature)
|
||||
- **[Pentagram](../pentagram.md)** (C++, GPL-2.0, beta, inactive since 2018)
|
||||
|
@ -132,6 +132,7 @@
|
||||
- **[OpenRCT2](../openrct2.md)** (C++, GPL-3.0, mature)
|
||||
- **[OpenRW](../openrw.md)** (C, C++, GPL-3.0, beta)
|
||||
- **[OpenSAGE](../opensage.md)** (C#, LGPL-3.0, beta)
|
||||
- **[OpenTESArena](../opentesarena.md)** (C++, MIT, beta)
|
||||
- **[OPMon](../opmon.md)** (C++, GPL-3.0, beta)
|
||||
- **[PainTown](../paintown.md)** (C++, Java, Python, 3-clause BSD, mature)
|
||||
- **[Pang Zero](../pang_zero.md)** (Perl, GPL-2.0, beta, inactive since 2007)
|
||||
|
@ -87,6 +87,7 @@
|
||||
- **[OpenRW](../openrw.md)** (C, C++, GPL-3.0, beta)
|
||||
- **[OpenSAGE](../opensage.md)** (C#, LGPL-3.0, beta)
|
||||
- **[OpenSpades](../openspades.md)** (C, C++, AngelScript, GPL-3.0, beta)
|
||||
- **[OpenTESArena](../opentesarena.md)** (C++, MIT, beta)
|
||||
- **[OPMon](../opmon.md)** (C++, GPL-3.0, beta)
|
||||
- **[PainTown](../paintown.md)** (C++, Java, Python, 3-clause BSD, mature)
|
||||
- **[Pentagram](../pentagram.md)** (C++, GPL-2.0, beta, inactive since 2018)
|
||||
|
@ -77,6 +77,7 @@
|
||||
- **[dhewm3](../dhewm3.md)** (C, C++, GPL-3.0, mature)
|
||||
- **[Digbuild](../digbuild.md)** (C, C++, GPL-2.0, beta, inactive since 2011)
|
||||
- **[Digger Remastered](../digger_remastered.md)** (C, GPL-2.0, mature, inactive since 2004)
|
||||
- **[Do It Yourself Doom With SDL](../do_it_yourself_doom_with_sdl.md)** (C++, MIT, beta)
|
||||
- **[Doom Legacy](../doom_legacy.md)** (C++, GPL-2.0, mature)
|
||||
- **[DOOM Retro](../doom_retro.md)** (C, C++, GPL-3.0, mature)
|
||||
- **[DOOM-iOS](../doom-ios.md)** (C++, GPL-2.0, mature, inactive since 2012)
|
||||
@ -279,6 +280,7 @@
|
||||
- **[OpenSpades](../openspades.md)** (C, C++, AngelScript, GPL-3.0, beta)
|
||||
- **[OpenSR](../opensr.md)** (C++, GPL-3.0, beta, inactive since 2017)
|
||||
- **[OpenSWE1R](../openswe1r.md)** (C, C++, GPL-2.0, beta)
|
||||
- **[OpenTESArena](../opentesarena.md)** (C++, MIT, beta)
|
||||
- **[OpenTitus](../opentitus.md)** (C, GPL-3.0, beta, inactive since 2014)
|
||||
- **[OpenTomb](../opentomb.md)** (C, C++, Lua, LGPL-3.0, beta)
|
||||
- **[OpenTriad](../opentriad.md)** (Java, GPL-3.0, beta, inactive since 2017)
|
||||
|
@ -47,6 +47,7 @@
|
||||
- **[DeSmuME](../desmume.md)** (C, C++, GPL-2.0, mature, inactive since 2015)
|
||||
- **[dhewm3](../dhewm3.md)** (C, C++, GPL-3.0, mature)
|
||||
- **[Digital: A Love Story](../digital_a_love_story.md)** (Ren'py, CC-BY-NC-SA, mature)
|
||||
- **[Do It Yourself Doom With SDL](../do_it_yourself_doom_with_sdl.md)** (C++, MIT, beta)
|
||||
- **[Domination](../domination.md)** (Java, GPL-3.0, mature)
|
||||
- **[Doom Legacy](../doom_legacy.md)** (C++, GPL-2.0, mature)
|
||||
- **[DOOM Retro](../doom_retro.md)** (C, C++, GPL-3.0, mature)
|
||||
@ -147,6 +148,7 @@
|
||||
- **[OpenRW](../openrw.md)** (C, C++, GPL-3.0, beta)
|
||||
- **[OpenSAGE](../opensage.md)** (C#, LGPL-3.0, beta)
|
||||
- **[OpenSpades](../openspades.md)** (C, C++, AngelScript, GPL-3.0, beta)
|
||||
- **[OpenTESArena](../opentesarena.md)** (C++, MIT, beta)
|
||||
- **[OpenTomb](../opentomb.md)** (C, C++, Lua, LGPL-3.0, beta)
|
||||
- **[OpenTyrian](../opentyrian.md)** (C, GPL-2.0, beta, inactive since 2018)
|
||||
- **[OPMon](../opmon.md)** (C++, GPL-3.0, beta)
|
||||
|
@ -1,13 +1,13 @@
|
||||
[comment]: # (autogenerated content, do not edit)
|
||||
# Statistics
|
||||
|
||||
analyzed 973 entries on 2019-09-13 12:10:23
|
||||
analyzed 976 entries on 2019-09-16 12:36:29
|
||||
|
||||
## State
|
||||
|
||||
- mature: 556 (57.1%)
|
||||
- beta: 415 (42.7%)
|
||||
- inactive: 481 (49.4%)
|
||||
- mature: 556 (57.0%)
|
||||
- beta: 418 (42.8%)
|
||||
- inactive: 481 (49.3%)
|
||||
|
||||
##### Inactive State
|
||||
|
||||
@ -17,15 +17,15 @@ Spludlow Tetris (XX), WarMUX (XX), Orbit-Hopper (2019), Bastet (2018), GoldenEye
|
||||
|
||||
##### Language frequency
|
||||
|
||||
- C++ (36.0%)
|
||||
- C (24.6%)
|
||||
- C++ (36.2%)
|
||||
- C (24.5%)
|
||||
- Java (8.1%)
|
||||
- Python (7.2%)
|
||||
- JavaScript (6.1%)
|
||||
- Lua (4.7%)
|
||||
- C# (2.8%)
|
||||
- Pascal (1.7%)
|
||||
- PHP (1.4%)
|
||||
- PHP (1.3%)
|
||||
- Assembly (0.6%)
|
||||
- Objective-C (0.6%)
|
||||
- TypeScript (0.6%)
|
||||
@ -76,9 +76,9 @@ Spludlow Tetris (XX), WarMUX (XX), Orbit-Hopper (2019), Bastet (2018), GoldenEye
|
||||
|
||||
##### Licenses frequency
|
||||
|
||||
- GPL-2.0 (37.3%)
|
||||
- GPL-2.0 (37.2%)
|
||||
- GPL-3.0 (25.6%)
|
||||
- MIT (13.7%)
|
||||
- MIT (13.9%)
|
||||
- Custom (3.5%)
|
||||
- Apache-2.0 (2.4%)
|
||||
- zlib (2.1%)
|
||||
@ -133,9 +133,9 @@ Spludlow Tetris (XX), WarMUX (XX), Orbit-Hopper (2019), Bastet (2018), GoldenEye
|
||||
- remake (18.2%)
|
||||
- strategy (8.6%)
|
||||
- action (7.4%)
|
||||
- role playing (5.8%)
|
||||
- role playing (5.7%)
|
||||
- clone (5.3%)
|
||||
- requires original content (4.5%)
|
||||
- requires original content (4.6%)
|
||||
- commercial content (4.1%)
|
||||
- open content (3.3%)
|
||||
- puzzle (3.2%)
|
||||
@ -143,7 +143,7 @@ Spludlow Tetris (XX), WarMUX (XX), Orbit-Hopper (2019), Bastet (2018), GoldenEye
|
||||
- shooter (2.8%)
|
||||
- framework (2.5%)
|
||||
- arcade (2.3%)
|
||||
- game engine (1.7%)
|
||||
- game engine (1.8%)
|
||||
- turn-based (1.4%)
|
||||
- platform (1.3%)
|
||||
- real time (1.3%)
|
||||
@ -213,8 +213,8 @@ Spludlow Tetris (XX), WarMUX (XX), Orbit-Hopper (2019), Bastet (2018), GoldenEye
|
||||
- snake-like (0.1%)
|
||||
- soccer (0.1%)
|
||||
- text (0.1%)
|
||||
- 4d (0.0%)
|
||||
- 4D (0.0%)
|
||||
- 4d (0.0%)
|
||||
- action-rpg (0.0%)
|
||||
- action/adventure (0.0%)
|
||||
- ardade (0.0%)
|
||||
@ -298,7 +298,7 @@ Spludlow Tetris (XX), WarMUX (XX), Orbit-Hopper (2019), Bastet (2018), GoldenEye
|
||||
|
||||
## Entries without download or play fields
|
||||
|
||||
362: 3D Pong, 3Dc, 4D Maze Game, 4D-TRIS, 54321, ACM, Adanaxis, Advanced Strategic Command, AI Wars, Airstrike, alive, Amphetamine, Anagramarama, Ancient Beast, Angry Birds in Python, Antares, Apricots, aquastax, Armor Alley, ativayeban, Atomix, Atrinik, Ball and Paddle, Ball And Wall, Ballerburg SDL, Barony, Bastet, Battle City, Battleround, Battles of Antargis, Beat Harvester, Berusky II, BitRiot, BlakedAwesomenaughts, Bombic2, Bombman, BOOM: Remake, bratwurst, Breakout-VR, Bridge Command, BrowserQuest, Bt Builder, c64-nuclearreaction, Cabbages and Kings, Castle Game Engine, Castle of the Winds in Elm, Cataclysm, CatacombSDL, CaveExpress, CavePacker, cc94, CCCP, chainreaction, Chocolate Duke3D, Choria, Chronoshift, Civilization: Call To Power 2 Source Project, CivOne, Classic Blades of Exile, coab, Colossal Cave Adventure, CommandoJS, Core War, Craft, CrappyBird, CrystalQuest, Cubosphere, D2X-XL, Dark Destiny, Dash Engine, Data Storm, Dawn, Deathchase 3D, DelverEngine, DemiGod, DesktopAdventures, Devilution, DevilutionX, DGEngine, diablo-js, Digbuild, Digital: A Love Story, Doomsday, Dragon Hunt, Duke3D, Dune 2 - The Maker, Dungeon Monkey Eternal, Dungeon Quest, Ecksdee, Endgame: Singularity, EnTT Pacman, EPOH, erampage, EternalWinterWars, Evil Cult, F.LF, Fallen Spire, Falling Time, Fanwor, FAR Colony, fonline, FQuake3, Free in the Dark (engine), freeablo, freeaoe, FreeBlocks, Freeciv-web, FreeFalcon, freegish, Freekick 3, Freeminer, FreeRCT, FreeSiege, Freestars, Frets on Fire X, Friking Shark, Fujo, GalaxyMage Redux, GameLV, ges-code, Gigalomania, glPortal, Gnomescroll, Goblin Camp, GoldenEye: Source, Gorc, Gorillas, Gorillas-rs, Greenius' Civil War, Griefly, Grobots, H-Craft Championship, Hardwar, HarfBuzz, Harris, Hematite, Heroes of Wesnoth, Hex Game, Hextris, Hexwar, Hocoslamfy, Hovertank3D, HTML5 Pacman, Iceball, Inexor, IO Reboot, Iris2, Jagged Alliance 2 Stracciatella, javascript-E.T., Jazz² Resurrection, JediOutcastLinux, Jet-Story, jewelthief, JiGS Interactive Game System, Julius, Jump'n'Bump, Just another Tetris™ clone, KAtomic, Keen Dreams, KGoldrunner, Kingdoms, KittenMaxit, KnightOfWor, ladder, Land of Fire, LastTry, Lemmings.ts, Lemmini, LGeneral, libpng, Lincity, Lionheart Remake, Lips of Suna, Lix, LordsAWar!, lttp-phaser, LÖVE, M.E.W.L., Marblez, Mario Objects, MechCommander 2 Omnitech, Mercenary Commander, Meritous, Micropolis, micropolisJS, MineCraft-One-Week-Challenge, Minesweeper (in C), Mininim, Mirror Magic, mk.js, mkxp, Monsters and Mushrooms, Morpheus Web Remake, movbizz, Mr.Boom, NBlood, Netacka, NFSIISE, Nuncabola, Nuvie, NXEngine-evo, Octaforge, Odamex, Omnispeak, One Way To Go, Open AL Soft, Open Creatures, Open Cube, Open Fodder, Open Hexagon, Open Jumpgate, Open Legend RPG, Open Panzer, Open RSC, Open Soccer Star, Open Zelda, openage, OpenC1, OpenClaw, OpenCrystalCaves, OpenDominion, openDOW, OpenFire, OpenGL Test Drive Remake, OpenLiero, OpenMC2, OpenMoM, OpenNFS, OpenNotrium, OpenRW, OpenSC2K, OpenSkyscraper, OpenSoccer, OpenSR, OpenSWE1R, OpenTriad, OPMon, Orbit-Hopper, Orbium, orona, Ostrich Riders, Our Personal Space, Outpost HD, Panel Attack, Paper Isaac, Pathological, Pax Britannica, Polis, POSTAL 1 Open Source, Powerslide remake, pq2, Prescription Wars, Pthreads-win32, pyORPG, RacerJS, Ragel, ransack, RBDOOM-3-BFG, Reflection Keen, ReQbert, Return of Dr. Destructo, Rigs of Rods, Riiablo, Rise of the Triad for Linux, rock-raiders-remake, Roguish, Room for Change, rpge, Scorched Moon, Scrabble3D, SDLPoP, sensitive-js, Sentient Storage, shadow-of-the-beast-html5, Shadowgrounds, Siege of Avalon : Open Source, Simple-Solitaire, Sine, Sintel The Game, Skifree-HTML5-clone, Slime Volleyball, Slot-Racers, Smash, snake, Song of Albion, Source of Tales, Sourcehold, Space Harrier Clone, Space Nerds In Space, Space Station 13, splexhd, Spring: 1944, SS13 Remake, Star Ruler 2, star-control2, Star-Wars-III, starshatter-open, Stendhal, Strife: Veteran Edition, sundog, Supaxl, super-methane-brothers-gx, SuperFoulEgg, SWP, Tank: Zone of Death, Tanks of Freedom, Tapir, Tenes Empanadas Graciela, Terasology, terrarium, Tetris (in C and NCURSES), The Powder Toy, thiefcatcher, Thyme, Tile World, Tiny Wings, TOMB5, Torrega Race, Total Annihilation 3D, Train, Trinity Reign, TrueCraft, TTDPatch, Tumbly Towers, Turious, Turn of War, TurokEX, TVTower, twin-e, TwinEngine, Tyrian Remake, TyrQuake, UA_source, UFO2000, UlDunAd, uMario, UnCiv, uninvited, VCMI, VDrift, Veloren, WallBall, War Of Kingdom, warcraft-remake, Wario-Land-3, WarMUX, Waste's Edge, WebFun, Wizznic!, wkbre, WWW, Xenowar, XorCurses, XSera, XZ Utils, Yamagi Quake II, yaml-cpp, Zatacka X, Zelda: Mystery of Solarus DX, Zetawar, zlib, zorkClone
|
||||
365: 3D Pong, 3Dc, 4D Maze Game, 4D-TRIS, 54321, ACM, Adanaxis, Advanced Strategic Command, AI Wars, Airstrike, alive, Amphetamine, Anagramarama, Ancient Beast, Angry Birds in Python, Antares, Apricots, aquastax, Armor Alley, ativayeban, Atomix, Atrinik, Ball and Paddle, Ball And Wall, Ballerburg SDL, Barony, Bastet, Battle City, Battleround, Battles of Antargis, Beat Harvester, Berusky II, BitRiot, BlakedAwesomenaughts, Bombic2, Bombman, BOOM: Remake, bratwurst, Breakout-VR, Bridge Command, BrowserQuest, Bt Builder, c64-nuclearreaction, Cabbages and Kings, Castle Game Engine, Castle of the Winds in Elm, Cataclysm, CatacombSDL, CaveExpress, CavePacker, cc94, CCCP, chainreaction, Chocolate Duke3D, Choria, Chronoshift, Civilization: Call To Power 2 Source Project, CivOne, Classic Blades of Exile, coab, Colossal Cave Adventure, CommandoJS, Core War, Craft, CrappyBird, CrystalQuest, Cubosphere, D2X-XL, Dark Destiny, Dash Engine, Data Storm, Dawn, Deathchase 3D, DelverEngine, DemiGod, DesktopAdventures, Devilution, DevilutionX, DGEngine, diablo-js, Digbuild, Digital: A Love Story, Do It Yourself Doom With SDL, Doomsday, Dragon Hunt, Duke3D, Dune 2 - The Maker, Dungeon Monkey Eternal, Dungeon Quest, Ecksdee, Endgame: Singularity, EnTT Pacman, EPOH, erampage, EternalWinterWars, Evil Cult, F.LF, Fallen Spire, Falling Time, Fanwor, FAR Colony, Flex Engine, fonline, FQuake3, Free in the Dark (engine), freeablo, freeaoe, FreeBlocks, Freeciv-web, FreeFalcon, freegish, Freekick 3, Freeminer, FreeRCT, FreeSiege, Freestars, Frets on Fire X, Friking Shark, Fujo, GalaxyMage Redux, GameLV, ges-code, Gigalomania, glPortal, Gnomescroll, Goblin Camp, GoldenEye: Source, Gorc, Gorillas, Gorillas-rs, Greenius' Civil War, Griefly, Grobots, H-Craft Championship, Hardwar, HarfBuzz, Harris, Hematite, Heroes of Wesnoth, Hex Game, Hextris, Hexwar, Hocoslamfy, Hovertank3D, HTML5 Pacman, Iceball, Inexor, IO Reboot, Iris2, Jagged Alliance 2 Stracciatella, javascript-E.T., Jazz² Resurrection, JediOutcastLinux, Jet-Story, jewelthief, JiGS Interactive Game System, Julius, Jump'n'Bump, Just another Tetris™ clone, KAtomic, Keen Dreams, KGoldrunner, Kingdoms, KittenMaxit, KnightOfWor, ladder, Land of Fire, LastTry, Lemmings.ts, Lemmini, LGeneral, libpng, Lincity, Lionheart Remake, Lips of Suna, Lix, LordsAWar!, lttp-phaser, LÖVE, M.E.W.L., Marblez, Mario Objects, MechCommander 2 Omnitech, Mercenary Commander, Meritous, Micropolis, micropolisJS, MineCraft-One-Week-Challenge, Minesweeper (in C), Mininim, Mirror Magic, mk.js, mkxp, Monsters and Mushrooms, Morpheus Web Remake, movbizz, Mr.Boom, NBlood, Netacka, NFSIISE, Nuncabola, Nuvie, NXEngine-evo, Octaforge, Odamex, Omnispeak, One Way To Go, Open AL Soft, Open Creatures, Open Cube, Open Fodder, Open Hexagon, Open Jumpgate, Open Legend RPG, Open Panzer, Open RSC, Open Soccer Star, Open Zelda, openage, OpenC1, OpenClaw, OpenCrystalCaves, OpenDominion, openDOW, OpenFire, OpenGL Test Drive Remake, OpenLiero, OpenMC2, OpenMoM, OpenNFS, OpenNotrium, OpenRW, OpenSC2K, OpenSkyscraper, OpenSoccer, OpenSR, OpenSWE1R, OpenTESArena, OpenTriad, OPMon, Orbit-Hopper, Orbium, orona, Ostrich Riders, Our Personal Space, Outpost HD, Panel Attack, Paper Isaac, Pathological, Pax Britannica, Polis, POSTAL 1 Open Source, Powerslide remake, pq2, Prescription Wars, Pthreads-win32, pyORPG, RacerJS, Ragel, ransack, RBDOOM-3-BFG, Reflection Keen, ReQbert, Return of Dr. Destructo, Rigs of Rods, Riiablo, Rise of the Triad for Linux, rock-raiders-remake, Roguish, Room for Change, rpge, Scorched Moon, Scrabble3D, SDLPoP, sensitive-js, Sentient Storage, shadow-of-the-beast-html5, Shadowgrounds, Siege of Avalon : Open Source, Simple-Solitaire, Sine, Sintel The Game, Skifree-HTML5-clone, Slime Volleyball, Slot-Racers, Smash, snake, Song of Albion, Source of Tales, Sourcehold, Space Harrier Clone, Space Nerds In Space, Space Station 13, splexhd, Spring: 1944, SS13 Remake, Star Ruler 2, star-control2, Star-Wars-III, starshatter-open, Stendhal, Strife: Veteran Edition, sundog, Supaxl, super-methane-brothers-gx, SuperFoulEgg, SWP, Tank: Zone of Death, Tanks of Freedom, Tapir, Tenes Empanadas Graciela, Terasology, terrarium, Tetris (in C and NCURSES), The Powder Toy, thiefcatcher, Thyme, Tile World, Tiny Wings, TOMB5, Torrega Race, Total Annihilation 3D, Train, Trinity Reign, TrueCraft, TTDPatch, Tumbly Towers, Turious, Turn of War, TurokEX, TVTower, twin-e, TwinEngine, Tyrian Remake, TyrQuake, UA_source, UFO2000, UlDunAd, uMario, UnCiv, uninvited, VCMI, VDrift, Veloren, WallBall, War Of Kingdom, warcraft-remake, Wario-Land-3, WarMUX, Waste's Edge, WebFun, Wizznic!, wkbre, WWW, Xenowar, XorCurses, XSera, XZ Utils, Yamagi Quake II, yaml-cpp, Zatacka X, Zelda: Mystery of Solarus DX, Zetawar, zlib, zorkClone
|
||||
|
||||
## Entries with a code repository not on a popular site
|
||||
|
||||
@ -306,17 +306,17 @@ Spludlow Tetris (XX), WarMUX (XX), Orbit-Hopper (2019), Bastet (2018), GoldenEye
|
||||
|
||||
## Code dependencies
|
||||
|
||||
With code dependency field 317 (32.6%)
|
||||
With code dependency field 319 (32.7%)
|
||||
|
||||
##### Code dependencies frequency
|
||||
|
||||
- SDL (18.9%)
|
||||
- SDL2 (10.2%)
|
||||
- pygame (8.1%)
|
||||
- SDL (18.7%)
|
||||
- SDL2 (10.5%)
|
||||
- pygame (8.0%)
|
||||
- OpenGL (4.2%)
|
||||
- SFML (3.0%)
|
||||
- SFML (2.9%)
|
||||
- Allegro (2.5%)
|
||||
- OpenAL (1.9%)
|
||||
- OpenAL (2.1%)
|
||||
- libGDX (1.5%)
|
||||
- numpy (1.5%)
|
||||
- pillow (1.5%)
|
||||
@ -424,8 +424,8 @@ With code dependency field 317 (32.6%)
|
||||
- py2exe (0.2%)
|
||||
- PyAMF (0.2%)
|
||||
- pycairo (0.2%)
|
||||
- PyGame (0.2%)
|
||||
- Pygame (0.2%)
|
||||
- PyGame (0.2%)
|
||||
- pygobject (0.2%)
|
||||
- PyLab (0.2%)
|
||||
- pymunk (0.2%)
|
||||
@ -458,9 +458,10 @@ With code dependency field 317 (32.6%)
|
||||
- Tween.js (0.2%)
|
||||
- utfcpp (0.2%)
|
||||
- VDrift Engine (0.2%)
|
||||
- vorbis (0.2%)
|
||||
- Vorbis (0.2%)
|
||||
- vorbis (0.2%)
|
||||
- Vulkan (0.2%)
|
||||
- WildMidi (0.2%)
|
||||
- Xaw3d (0.2%)
|
||||
- Xpm lib (0.2%)
|
||||
- yaml (0.2%)
|
||||
@ -468,42 +469,43 @@ With code dependency field 317 (32.6%)
|
||||
|
||||
## Build systems
|
||||
|
||||
Build systems information available for 31.3% of all projects.
|
||||
Build systems information available for 31.5% of all projects.
|
||||
|
||||
##### Build systems frequency (305)
|
||||
##### Build systems frequency (307)
|
||||
|
||||
- CMake (56.1%)
|
||||
- Make (18.4%)
|
||||
- Autoconf (10.8%)
|
||||
- CMake (56.0%)
|
||||
- Make (18.2%)
|
||||
- Autoconf (10.7%)
|
||||
- Gradle (3.3%)
|
||||
- Scons (3.0%)
|
||||
- Scons (2.9%)
|
||||
- Maven (2.3%)
|
||||
- setup.py (2.3%)
|
||||
- Custom (1.0%)
|
||||
- Ant (0.7%)
|
||||
- Lazarus project (0.3%)
|
||||
- meson (0.3%)
|
||||
- Meson (0.3%)
|
||||
- meson (0.3%)
|
||||
- py2exe (0.3%)
|
||||
- QMake (0.3%)
|
||||
- Rake (0.3%)
|
||||
- VisualStudio (0.3%)
|
||||
- Xcode project (0.3%)
|
||||
|
||||
##### C and C++ projects without build system information (367)
|
||||
##### C and C++ projects without build system information (368)
|
||||
|
||||
2H4U, 3D Pong, 3Dc, 54321, Abuse, ACM, Adanaxis, Afternoon Stalker, Airstrike, Aklabeth, Aleph One, alive, Amphetamine, Anagramarama, Angband, Antares, Armagetron Advanced, Armies, ativayeban, Atlantis, Atomic Tanks, Atomiks, Atomix, Attal: Lords of doom, AutoREALM, Avanor, Ball and Paddle, Barony, Batrachians, Battle City, Battle Tanks, Battles of Antargis, Between, Biniax, Birth of the Empires, Blobby Volley 2, Blobwars: Metal Blob Solid, BlockOut II, Bombermaaan, Bombic, Bombic2, Boost (C++ Libraries), Bos Wars, Boson, Bridge Command, BRIQUOLO, Brutal Chess, Bt Builder, BurgerSpace, c64-nuclearreaction, Cadaver, Cat Mother Dead Justice, Cataclysm, Catch Challenger, cc94, CCCP, Circus Linux!, Civilization: Call To Power 2 Source Project, Classic Blades of Exile, Clonepoint, Colonization too, Conquests, Core War, Cosmosmash, Crossfire, Crown and Cutlass, Crypto++, Cytadela, D2X-XL, Daimonin, Danger from the Deep, Dark Oberon, DarkPlaces, Data Storm, Dave Gnukem, Dawn, Deathchase 3D, Defendguin, Deliantra, DeSmuME, Digger Remastered, Doom Legacy, DOOM-iOS, Duel Commander, Duke3D, Duke3d_w32, Dune Dynasty, Dune Legacy, Dungeon Craft, Dungeon Crawl Stone Soup, Dungeon Mapper, DXX-Rebirth, Ecksdee, EDuke32, Endless Sky, ENIGMA (development environment), EnTT Pacman, Epiar, erampage, Erebus, Eternal Lands, Evol Online, Exult, ezQuake, F-1 Spirit, Fall of Imiryn, Fanwor, Forsaken, Free Heroes 2, Free in the Dark (engine), Free Space Colonization, Freeciv Alpha Centauri project, FreeFalcon, Freekick 3, Freeminer, Freenukum Jump'n Run, FreePrince, FreeRails, Freestars, Galaxy Forces V2, GalaxyNG, GameLV, GDash, Gee Whiz, Gigalomania, Globulation 2, GLtron, GM Tools, Gnomescroll, GNU FreeDink, Goblin Camp, Goblin Hack, Golly, GPL Arcade Volleyball, Greenius' Civil War, Grit Game Engine, Grobots, GUSANOS, Gusty's Serpents, H-Craft Championship, H-World, Hammer of Thyrion, Harris, Haxima, Heart of the Alien, Heroes of Wesnoth, Hex Game, HolySpirit, Hovertank3D, I Have No Tomatoes, ICBM3D, Ice Breaker, Inexor, Irrlicht Engine, Iter Vehemens ad Necem, Jagged Alliance 2 Stracciatella, Jet-Story, JFDuke3D, JonoF's Shadow Warrior Port (JFSW), Jump'n'Bump, KAtomic, Keen Dreams, KGoldrunner, kiki the nano bot, Knights, KQ Lives, Krystal Drop, l-echo, Labyrinth of Worlds, LGames, LGeneral, libGDX, libpng, Libxml2, Lightweight Java Game Library, Lincity, LinCity-NG, Linley's Dungeon Crawl, Linwarrior 3D, Lips of Suna, Lix, Lua, Lumix Engine, LZMA SDK, M.E.W.L., Machinations, Mars, Land of No Mercy, Maxit, MechCommander 2 Omnitech, Mega Mario, Meridian 59, Meritous, Microracers, MineCraft-One-Week-Challenge, Minesweeper (in C), Mirror Magic, Moria, Mr.Boom, Naev, NBlood, NetHack, NetPanzer, Netrek, Neverball, Nexuiz, NFSIISE, Nighthawk, NLarn, Oolite, Open AL, Open Fodder, Open Hexagon, Open Horizon, Open Jumpgate, Open Meridian, Open Rodent's Revenge, Open RPG Maker, Open Syobon Action, Open Yahtzee, Open Zelda, openage, OpenArena, OpenCity, OpenCrystalCaves, OpenDUNE, OpenDungeons, OpenFire, OpenGGS, OpenGL Test Drive Remake, Openglad, OpenHoMM, OpenLara, OpenLiero, OpenMC2, OpenMortal, OpenMW, OpenNFS, OpenNotrium, OpenSSL, OpenTitus, OpenTyrian, Operation Citadel, Orbit-Hopper, Orx, Other-Life, Panda 3D, Pax Britannica, Phantasy Star Rebirth, Pioneers, Pizza Business, pkg-config, PlaneShift, PokerTH, POSTAL 1 Open Source, pq2, PrBoom+, Project Carrot, ProQuake 4, Pthreads-win32, pycraft, pygame, Qt, QuakeSpasm, Ragel, RBDOOM-3-BFG, Red Eclipse, Reflection Keen, REGoth, ResidualVM, Return to the Roots, Rise of the Triad for Linux, Rockbot, Rocks'n'Diamonds, Rogue Clone IV, Rolisteam, S.C.O.U.R.G.E., sandbox Game Maker, Scorched3D, SDL Asylum, SDL Bomber, SDL Game Engine 2D, SDL Sopwith, Secret Maryo Chronicles, Sengoku: Warring States of Japan, Seven Kingdoms: Ancient Adversaries, sfall, Shockolate, Simutrans, Sine, SLADE, SLASH'EM, Slime Volleyball, Smash Battle, Song of Albion, Sopwith 3, Space Harrier Clone, SpaceZero, splexhd, Star Ruler 2, star-control2, StarBlastrix, starshatter-open, Strife: Veteran Edition, Stunt Car Racer Remake, Summoning Wars, sundog, Super Methane Brothers, SuperFoulEgg, SuperTux, SuperTuxKart, SWIG, Syndicate Wars Port, T-Bots, Tales of Maj'Eyal, Tank: Zone of Death, Tapir, Tenes Empanadas Graciela, The Clans, The Endless Dungeons, The Epic of Heroes, The Legend of Edgar, The Powder Toy, The Secret Chronicles of Dr. M., Theme Park Builder 3D CAD, Thousand Parsec, Thrust, Tile World, TinTin++, Tiny Wings, Toppler, TORCS, The Open Racing Car Simulator, Trackballs, Transfusion, Tremulous, TTDPatch, Turious, TurokEX, Tux Racer, twin-e, UFO2000, Underworld Adventures, UnNetHack, VCMI, Vega Strike, War Of Kingdom, Wargamer, Wargus, WarMUX, Witch Blast, Wizznic!, Wolfpack Empire, WorldForge, wxWidgets, X-Moto, XArchon, Xconq, xdigger, xDuke, Xenowar, Xonotic, XPilot, XPilot NG, XScavenger, XSera, XZ Utils, ZAngband, Zod Engine
|
||||
2H4U, 3D Pong, 3Dc, 54321, Abuse, ACM, Adanaxis, Afternoon Stalker, Airstrike, Aklabeth, Aleph One, alive, Amphetamine, Anagramarama, Angband, Antares, Armagetron Advanced, Armies, ativayeban, Atlantis, Atomic Tanks, Atomiks, Atomix, Attal: Lords of doom, AutoREALM, Avanor, Ball and Paddle, Barony, Batrachians, Battle City, Battle Tanks, Battles of Antargis, Between, Biniax, Birth of the Empires, Blobby Volley 2, Blobwars: Metal Blob Solid, BlockOut II, Bombermaaan, Bombic, Bombic2, Boost (C++ Libraries), Bos Wars, Boson, Bridge Command, BRIQUOLO, Brutal Chess, Bt Builder, BurgerSpace, c64-nuclearreaction, Cadaver, Cat Mother Dead Justice, Cataclysm, Catch Challenger, cc94, CCCP, Circus Linux!, Civilization: Call To Power 2 Source Project, Classic Blades of Exile, Clonepoint, Colonization too, Conquests, Core War, Cosmosmash, Crossfire, Crown and Cutlass, Crypto++, Cytadela, D2X-XL, Daimonin, Danger from the Deep, Dark Oberon, DarkPlaces, Data Storm, Dave Gnukem, Dawn, Deathchase 3D, Defendguin, Deliantra, DeSmuME, Digger Remastered, Doom Legacy, DOOM-iOS, Duel Commander, Duke3D, Duke3d_w32, Dune Dynasty, Dune Legacy, Dungeon Craft, Dungeon Crawl Stone Soup, Dungeon Mapper, DXX-Rebirth, Ecksdee, EDuke32, Endless Sky, ENIGMA (development environment), EnTT Pacman, Epiar, erampage, Erebus, Eternal Lands, Evol Online, Exult, ezQuake, F-1 Spirit, Fall of Imiryn, Fanwor, Flex Engine, Forsaken, Free Heroes 2, Free in the Dark (engine), Free Space Colonization, Freeciv Alpha Centauri project, FreeFalcon, Freekick 3, Freeminer, Freenukum Jump'n Run, FreePrince, FreeRails, Freestars, Galaxy Forces V2, GalaxyNG, GameLV, GDash, Gee Whiz, Gigalomania, Globulation 2, GLtron, GM Tools, Gnomescroll, GNU FreeDink, Goblin Camp, Goblin Hack, Golly, GPL Arcade Volleyball, Greenius' Civil War, Grit Game Engine, Grobots, GUSANOS, Gusty's Serpents, H-Craft Championship, H-World, Hammer of Thyrion, Harris, Haxima, Heart of the Alien, Heroes of Wesnoth, Hex Game, HolySpirit, Hovertank3D, I Have No Tomatoes, ICBM3D, Ice Breaker, Inexor, Irrlicht Engine, Iter Vehemens ad Necem, Jagged Alliance 2 Stracciatella, Jet-Story, JFDuke3D, JonoF's Shadow Warrior Port (JFSW), Jump'n'Bump, KAtomic, Keen Dreams, KGoldrunner, kiki the nano bot, Knights, KQ Lives, Krystal Drop, l-echo, Labyrinth of Worlds, LGames, LGeneral, libGDX, libpng, Libxml2, Lightweight Java Game Library, Lincity, LinCity-NG, Linley's Dungeon Crawl, Linwarrior 3D, Lips of Suna, Lix, Lua, Lumix Engine, LZMA SDK, M.E.W.L., Machinations, Mars, Land of No Mercy, Maxit, MechCommander 2 Omnitech, Mega Mario, Meridian 59, Meritous, Microracers, MineCraft-One-Week-Challenge, Minesweeper (in C), Mirror Magic, Moria, Mr.Boom, Naev, NBlood, NetHack, NetPanzer, Netrek, Neverball, Nexuiz, NFSIISE, Nighthawk, NLarn, Oolite, Open AL, Open Fodder, Open Hexagon, Open Horizon, Open Jumpgate, Open Meridian, Open Rodent's Revenge, Open RPG Maker, Open Syobon Action, Open Yahtzee, Open Zelda, openage, OpenArena, OpenCity, OpenCrystalCaves, OpenDUNE, OpenDungeons, OpenFire, OpenGGS, OpenGL Test Drive Remake, Openglad, OpenHoMM, OpenLara, OpenLiero, OpenMC2, OpenMortal, OpenMW, OpenNFS, OpenNotrium, OpenSSL, OpenTitus, OpenTyrian, Operation Citadel, Orbit-Hopper, Orx, Other-Life, Panda 3D, Pax Britannica, Phantasy Star Rebirth, Pioneers, Pizza Business, pkg-config, PlaneShift, PokerTH, POSTAL 1 Open Source, pq2, PrBoom+, Project Carrot, ProQuake 4, Pthreads-win32, pycraft, pygame, Qt, QuakeSpasm, Ragel, RBDOOM-3-BFG, Red Eclipse, Reflection Keen, REGoth, ResidualVM, Return to the Roots, Rise of the Triad for Linux, Rockbot, Rocks'n'Diamonds, Rogue Clone IV, Rolisteam, S.C.O.U.R.G.E., sandbox Game Maker, Scorched3D, SDL Asylum, SDL Bomber, SDL Game Engine 2D, SDL Sopwith, Secret Maryo Chronicles, Sengoku: Warring States of Japan, Seven Kingdoms: Ancient Adversaries, sfall, Shockolate, Simutrans, Sine, SLADE, SLASH'EM, Slime Volleyball, Smash Battle, Song of Albion, Sopwith 3, Space Harrier Clone, SpaceZero, splexhd, Star Ruler 2, star-control2, StarBlastrix, starshatter-open, Strife: Veteran Edition, Stunt Car Racer Remake, Summoning Wars, sundog, Super Methane Brothers, SuperFoulEgg, SuperTux, SuperTuxKart, SWIG, Syndicate Wars Port, T-Bots, Tales of Maj'Eyal, Tank: Zone of Death, Tapir, Tenes Empanadas Graciela, The Clans, The Endless Dungeons, The Epic of Heroes, The Legend of Edgar, The Powder Toy, The Secret Chronicles of Dr. M., Theme Park Builder 3D CAD, Thousand Parsec, Thrust, Tile World, TinTin++, Tiny Wings, Toppler, TORCS, The Open Racing Car Simulator, Trackballs, Transfusion, Tremulous, TTDPatch, Turious, TurokEX, Tux Racer, twin-e, UFO2000, Underworld Adventures, UnNetHack, VCMI, Vega Strike, War Of Kingdom, Wargamer, Wargus, WarMUX, Witch Blast, Wizznic!, Wolfpack Empire, WorldForge, wxWidgets, X-Moto, XArchon, Xconq, xdigger, xDuke, Xenowar, Xonotic, XPilot, XPilot NG, XScavenger, XSera, XZ Utils, ZAngband, Zod Engine
|
||||
|
||||
##### C and C++ projects with a build system different from CMake (170)
|
||||
##### C and C++ projects with a build system different from CMake (171)
|
||||
|
||||
Allegro, Annchienta, Arx Libertatis, AstroMenace, Atrinik, Ballerburg SDL, BitRiot, Blender game engine, Block Attack - Rise of the Blocks, BOOM: Remake, BStone, C-Dogs SDL, CaesarIA, Cannonball, CatacombSDL, CaveExpress, CavePacker, Chocolate Doom, Choria, Chronoshift, COCOS2D-X, Colobot: Gold Edition, Commander Genius, CorsixTH, Craft, Cubosphere, Curse of War, DesktopAdventures, DevilutionX, DGEngine, dhewm3, DNT, DOOM Retro, Doom64EX, Doomsday, Doxygen, DreamChess, Dust Racing 2D, EasyRPG Player, Eat The Whistle, ECWolf, Egoboo, EmptyEpsilon, ET: Legacy, Falling Time, Flare, FlightGear, fonline, freeablo, freeaoe, FreeBlocks, FreeOrion, FreeRCT, Freeserf, FreeSiege, FreeSynd, FreeType, Friking Shark, GemRB, ges-code, glPortal, GoldenEye: Source, Gorc, Griefly, GZDoom, Hardwar, HarfBuzz, Hedgewars, HoverRace, Iceball, irrlamb, JediOutcastLinux, Julius, Librelancer, Lugaru, LÖVE, Mana, Maratis, Me and My Shadow, Mechanized Assault & eXploration Reloaded, MegaGlest, Minetest, mkxp, Nuvie, NXEngine-evo, Odamex, OGRE3D, Open AL Soft, Open Apocalypse, Open Creatures, Open Game Engine, Open Surge, Open Tibia, OpenBlok, OpenClaw, OpenClonk, OpenGothic, OpenJK, OpenLieroX, OpenLoco, OpenMoM, OpenOMF, OpenRaider, OpenRCT2, OpenRW, OpenSkyscraper, OpenSpades, OpenSR, OpenSWE1R, OpenTomb, OpenXcom, OPMon, PainTown, Performous, Pingus, Polycode, Powerslide remake, Privateer - Gemini Gold, Q-Gears, Race Into Space, Return of Dr. Destructo, Rigel Engine, Rigs of Rods, Ryzom Core, SDLPoP, Shadowgrounds, Simple and Fast Multimedia Library, Simple DirectMedia Layer, SoftPixel Engine, Solarus, Sonic Robo Blast 2, Sourcehold, Speed Dreams, Spring, StepMania, Stunt Rally, super-methane-brothers-gx, TES3MP, The Battle for Wesnoth, The Butterfly Effect, The Rush, thiefcatcher, Thrive, Thyme, TOMB5, Total Annihilation 3D, Trinity Reign, Tux Football, Tux of Math Command, UFO: Alien Invasion, uMario, Unvanquished, urde, Urho3D, Valyria Tear, Violetland, Visual Pinball, Voxelands, Warzone 2100, Widelands, Wizardry Legacy, wkbre, Wyrmsun, xoreos, xu4, Yamagi Quake II, yaml-cpp, ZDoom, Zero Ballistics, zlib
|
||||
Allegro, Annchienta, Arx Libertatis, AstroMenace, Atrinik, Ballerburg SDL, BitRiot, Blender game engine, Block Attack - Rise of the Blocks, BOOM: Remake, BStone, C-Dogs SDL, CaesarIA, Cannonball, CatacombSDL, CaveExpress, CavePacker, Chocolate Doom, Choria, Chronoshift, COCOS2D-X, Colobot: Gold Edition, Commander Genius, CorsixTH, Craft, Cubosphere, Curse of War, DesktopAdventures, DevilutionX, DGEngine, dhewm3, DNT, DOOM Retro, Doom64EX, Doomsday, Doxygen, DreamChess, Dust Racing 2D, EasyRPG Player, Eat The Whistle, ECWolf, Egoboo, EmptyEpsilon, ET: Legacy, Falling Time, Flare, FlightGear, fonline, freeablo, freeaoe, FreeBlocks, FreeOrion, FreeRCT, Freeserf, FreeSiege, FreeSynd, FreeType, Friking Shark, GemRB, ges-code, glPortal, GoldenEye: Source, Gorc, Griefly, GZDoom, Hardwar, HarfBuzz, Hedgewars, HoverRace, Iceball, irrlamb, JediOutcastLinux, Julius, Librelancer, Lugaru, LÖVE, Mana, Maratis, Me and My Shadow, Mechanized Assault & eXploration Reloaded, MegaGlest, Minetest, mkxp, Nuvie, NXEngine-evo, Odamex, OGRE3D, Open AL Soft, Open Apocalypse, Open Creatures, Open Game Engine, Open Surge, Open Tibia, OpenBlok, OpenClaw, OpenClonk, OpenGothic, OpenJK, OpenLieroX, OpenLoco, OpenMoM, OpenOMF, OpenRaider, OpenRCT2, OpenRW, OpenSkyscraper, OpenSpades, OpenSR, OpenSWE1R, OpenTESArena, OpenTomb, OpenXcom, OPMon, PainTown, Performous, Pingus, Polycode, Powerslide remake, Privateer - Gemini Gold, Q-Gears, Race Into Space, Return of Dr. Destructo, Rigel Engine, Rigs of Rods, Ryzom Core, SDLPoP, Shadowgrounds, Simple and Fast Multimedia Library, Simple DirectMedia Layer, SoftPixel Engine, Solarus, Sonic Robo Blast 2, Sourcehold, Speed Dreams, Spring, StepMania, Stunt Rally, super-methane-brothers-gx, TES3MP, The Battle for Wesnoth, The Butterfly Effect, The Rush, thiefcatcher, Thrive, Thyme, TOMB5, Total Annihilation 3D, Trinity Reign, Tux Football, Tux of Math Command, UFO: Alien Invasion, uMario, Unvanquished, urde, Urho3D, Valyria Tear, Violetland, Visual Pinball, Voxelands, Warzone 2100, Widelands, Wizardry Legacy, wkbre, Wyrmsun, xoreos, xu4, Yamagi Quake II, yaml-cpp, ZDoom, Zero Ballistics, zlib
|
||||
|
||||
## Platform
|
||||
|
||||
Platform information available for 67.9% of all projects.
|
||||
Platform information available for 68.1% of all projects.
|
||||
|
||||
##### Platforms frequency
|
||||
|
||||
- Windows (35.4%)
|
||||
- Windows (35.5%)
|
||||
- Linux (32.8%)
|
||||
- macOS (19.8%)
|
||||
- Web (6.2%)
|
||||
|
@ -8,7 +8,7 @@ _{Description}_
|
||||
- Play: {URL} (optional)
|
||||
- Download: {URL} (optional)
|
||||
- Platform: {XX} (optional)
|
||||
- Keywords: {XX} (optional)
|
||||
- Keywords: {XX}
|
||||
- Code repository: {URL}
|
||||
- Code language: {XX}
|
||||
- Code license: {XX}
|
||||
|
@ -282,7 +282,9 @@
|
||||
"https://github.com/aburch/simutrans.git",
|
||||
"https://github.com/acmepjz/meandmyshadow.git",
|
||||
"https://github.com/adamenkov/jet-story.git",
|
||||
"https://github.com/afritz1/OpenTESArena.git",
|
||||
"https://github.com/ahmetkasif/KittenMaxit.git",
|
||||
"https://github.com/ajweeks/FlexEngine.git",
|
||||
"https://github.com/ajxs/jsFO.git",
|
||||
"https://github.com/akarnokd/open-ig.git",
|
||||
"https://github.com/albertz/openlierox.git",
|
||||
@ -290,6 +292,7 @@
|
||||
"https://github.com/alexdantas/www.git",
|
||||
"https://github.com/alexknvl/fonline.git",
|
||||
"https://github.com/alphaonex86/CatchChallenger.git",
|
||||
"https://github.com/amroibrahim/DIYDoom.git",
|
||||
"https://github.com/anael-seghezzi/Maratis-4.git",
|
||||
"https://github.com/andrettin/wyrmsun.git",
|
||||
"https://github.com/andrewfenn/Hardwar.git",
|
||||
|
@ -87,11 +87,8 @@ https://fedoraproject.org/wiki/SIGs/Games#List_of_games_we_will_NOT_package
|
||||
https://flathub.org/home (use it for Linux packaging) / https://flathub.org/apps/category/Game
|
||||
https://freegamer.blogspot.com/2015/11/top-3-open-source-pinball-games.html
|
||||
https://futurepinball.com/
|
||||
https://github.com/afritz1/OpenTESArena
|
||||
https://github.com/ajweeks/FlexEngine
|
||||
https://github.com/amerkoleci/alimer
|
||||
https://github.com/amerkoleci/vortice
|
||||
https://github.com/amroibrahim/DIYDoom
|
||||
https://github.com/Anthonymcqueen21/Pygame---Alien-Invasion
|
||||
https://github.com/ao-libre/ao-cliente
|
||||
https://github.com/apsillers/lords-of-the-fey
|
||||
@ -123,6 +120,7 @@ https://github.com/cubei/FlappyCow
|
||||
https://github.com/cyberegoorg/cetech
|
||||
https://github.com/DaemonEngine/Daemon
|
||||
https://github.com/Dariasteam/TowerJumper
|
||||
https://github.com/DeflatedPickle/FAOSDance
|
||||
https://github.com/demonixis/C3DE
|
||||
https://github.com/digitall/scummvm-deskadv
|
||||
https://github.com/DigitalPulseSoftware/NazaraEngine
|
||||
@ -141,6 +139,7 @@ https://github.com/freeboardgame/FreeBoardGame.org
|
||||
https://github.com/FreeCol/freecol
|
||||
https://github.com/gamearians
|
||||
https://github.com/GentenStudios/quartz-engine
|
||||
https://github.com/grantjenks/free-python-games (check all)
|
||||
https://github.com/GunshipPenguin/open_flood
|
||||
https://github.com/hedgewars/hw
|
||||
https://github.com/hparcells/cards-against-humanity
|
||||
@ -172,6 +171,7 @@ https://github.com/pelya/commandergenius
|
||||
https://github.com/pld-linux
|
||||
https://github.com/ptitSeb/gl4es
|
||||
https://github.com/raysan5/rfxgen
|
||||
https://github.com/Realm667/WolfenDoom
|
||||
https://github.com/romlok/godot-gdhexgrid
|
||||
https://github.com/RonenNess/GeonBit.UI
|
||||
https://github.com/RPG-Paper-Maker/RPG-Paper-Maker
|
||||
@ -220,7 +220,6 @@ https://pyweek.org/4/entries/ (Ascent of Justice)
|
||||
https://revolutionarygamesstudio.com/ Trhive
|
||||
https://salsa.debian.org/games-team/etw
|
||||
https://scratch.mit.edu/ (https://en.scratch-wiki.info/wiki/Scratch_Source_Code)
|
||||
https://secretchronicles.org/en/
|
||||
https://sourceforge.net/projects/actiongame/
|
||||
https://sourceforge.net/projects/deng/
|
||||
https://sourceforge.net/projects/ettu/
|
||||
|
@ -7,48 +7,23 @@ Unique left column names in the game info boxes:
|
||||
['Code license', 'Code licenses', 'Developer', 'Developers', 'Engine', 'Engines', 'Genre', 'Genres', 'Libraries', 'Library', 'Media license', 'Media licenses', 'P. language', 'P. languages', 'Platforms']
|
||||
"""
|
||||
|
||||
import os
|
||||
import requests
|
||||
import json
|
||||
from bs4 import BeautifulSoup, NavigableString
|
||||
from utils.utils import *
|
||||
from bs4 import BeautifulSoup
|
||||
from utils import constants, utils, osg
|
||||
|
||||
|
||||
def key_selection_gameinfobox(a, b):
|
||||
def download_lgw_content():
|
||||
"""
|
||||
Checks which of the two elements in a is in b or none but not both
|
||||
|
||||
:return:
|
||||
"""
|
||||
if len(a) != 2:
|
||||
raise RuntimeError()
|
||||
c = [x in b for x in a]
|
||||
if all(c):
|
||||
raise RuntimeError
|
||||
if not any(c):
|
||||
return None, None
|
||||
d = [(k, i) for (i, k) in enumerate(a) if c[i]]
|
||||
return d[0]
|
||||
|
||||
|
||||
def extract_field_content(key, idx, info):
|
||||
"""
|
||||
From a game info field.
|
||||
"""
|
||||
content = info[key].get_text()
|
||||
content = content.split(',')
|
||||
content = [x.strip() for x in content]
|
||||
content = [x if not (x.endswith('[1]') or x.endswith('[2]')) else x[:-3] for x in content] # remove trailing [1,2]
|
||||
content = [x.strip() for x in content]
|
||||
if not content:
|
||||
raise RuntimeError
|
||||
if (len(content) > 1 and idx == 0) or (len(content) == 1 and idx == 1):
|
||||
print(' warning: {} Sg./Pl. mismatch'.format(key))
|
||||
return content
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
# parameters
|
||||
base_url = 'https://libregamewiki.org'
|
||||
ignored_gameinfos = ['Contribute', 'Origin', 'Release date', 'Latest release']
|
||||
destination_path = os.path.join(constants.root_path, 'tools', 'lgw-import')
|
||||
utils.recreate_directory(destination_path)
|
||||
|
||||
# read and process the base url (get all games and categories)
|
||||
url = base_url + '/Category:Games'
|
||||
@ -69,89 +44,70 @@ if __name__ == "__main__":
|
||||
break
|
||||
url = base_url + next_page['href']
|
||||
|
||||
# remove all those that start with user
|
||||
games = [game for game in games if not any(game[1].startswith(x) for x in ('User:', 'Template:', 'Bullet'))]
|
||||
|
||||
print('current number of games in LGW {}'.format(len(games)))
|
||||
|
||||
# parse games
|
||||
counter = 0
|
||||
unique_gameinfo_fields = set()
|
||||
entries = []
|
||||
for game in games:
|
||||
print(game[1])
|
||||
url = base_url + game[0]
|
||||
destination_file = os.path.join(destination_path, osg.canonical_game_name(game[0][1:]) + '.html')
|
||||
|
||||
text = requests.get(url).text
|
||||
utils.write_text(destination_file, text)
|
||||
|
||||
|
||||
def parse_lgw_content():
|
||||
|
||||
# paths
|
||||
import_path = os.path.join(constants.root_path, 'tools', 'lgw-import')
|
||||
entries_file = os.path.join(import_path, '_lgw.json')
|
||||
|
||||
# iterate over all imported files
|
||||
files = os.listdir(import_path)
|
||||
entries = []
|
||||
for file in files:
|
||||
if file == '_lgw.json':
|
||||
continue
|
||||
|
||||
text = utils.read_text(os.path.join(import_path, file))
|
||||
|
||||
# parse the html
|
||||
soup = BeautifulSoup(text, 'html.parser')
|
||||
title = soup.h1.string
|
||||
title = soup.h1.get_text()
|
||||
print(title)
|
||||
entry = {'name': title}
|
||||
|
||||
# get all external links
|
||||
links = [(x['href'], x.get_text()) for x in soup.find_all('a', href=True)]
|
||||
links = [x for x in links if x[0].startswith('http') and not x[0].startswith('https://libregamewiki.org/')]
|
||||
entry['external links'] = links
|
||||
|
||||
# get meta description
|
||||
description = soup.find('meta', attrs={"name":"description"})
|
||||
entry['description'] = description['content']
|
||||
|
||||
# parse gameinfobox
|
||||
info = soup.find('div', class_='gameinfobox')
|
||||
if not info:
|
||||
infos = soup.find('div', class_='gameinfobox')
|
||||
if not infos:
|
||||
print(' no gameinfobox')
|
||||
else:
|
||||
info = info.find_all('tr')
|
||||
info = [(x.th.string, x.td) for x in info if x.th and x.th.string]
|
||||
info = [x for x in info if x[0] not in ignored_gameinfos]
|
||||
info = dict(info)
|
||||
unique_gameinfo_fields.update(info.keys())
|
||||
|
||||
# consume fields of gameinfobox
|
||||
# genre
|
||||
key, idx = key_selection_gameinfobox(('Genre', 'Genres'), info.keys())
|
||||
if key:
|
||||
genres = extract_field_content(key, idx, info)
|
||||
entry['genre']
|
||||
del info[key]
|
||||
|
||||
# platforms
|
||||
key = 'Platforms'
|
||||
if key in info:
|
||||
platforms = extract_field_content(key, 1, info)
|
||||
# platforms = [x if x != 'Mac' else 'macOS' for x in platforms] # replace Mac with macOS
|
||||
entry['platform'] = platforms
|
||||
del info[key]
|
||||
|
||||
# developer
|
||||
key, idx = key_selection_gameinfobox(('Developer', 'Developers'), info.keys())
|
||||
if key:
|
||||
entry['developer'] = extract_field_content(key, idx, info)
|
||||
del info[key]
|
||||
|
||||
# code license
|
||||
key, idx = key_selection_gameinfobox(('Code license', 'Code licenses'), info.keys())
|
||||
if key:
|
||||
entry['code license'] = extract_field_content(key, idx, info)
|
||||
del info[key]
|
||||
|
||||
# media license
|
||||
key, idx = key_selection_gameinfobox(('Media license', 'Media licenses'), info.keys())
|
||||
if key:
|
||||
entry['assets license'] = extract_field_content(key, idx, info)
|
||||
del info[key]
|
||||
|
||||
# engine
|
||||
key, idx = key_selection_gameinfobox(('Engine', 'Engines'), info.keys())
|
||||
if key:
|
||||
entry['engine'] = extract_field_content(key, idx, info)
|
||||
del info[key]
|
||||
|
||||
# library
|
||||
key, idx = key_selection_gameinfobox(('Library', 'Libraries'), info.keys())
|
||||
if key:
|
||||
entry['library'] = extract_field_content(key, idx, info)
|
||||
del info[key]
|
||||
|
||||
# programming language
|
||||
key, idx = key_selection_gameinfobox(('P. language', 'P. languages'), info.keys())
|
||||
if key:
|
||||
languages = extract_field_content(key, idx, info)
|
||||
languages = [x for x in languages if x != 'HTML5'] # ignore HTML5
|
||||
entry['code language'] = languages
|
||||
del info[key]
|
||||
|
||||
# unconsumed
|
||||
if info:
|
||||
print('unconsumed gameinfo keys {}'.format(info.keys()))
|
||||
raise RuntimeError()
|
||||
infos = infos.find_all('tr')
|
||||
for x in infos:
|
||||
if x.th and x.td:
|
||||
# row with header
|
||||
key = x.th.get_text()
|
||||
content = x.td.get_text()
|
||||
content = content.split(',')
|
||||
content = [x.strip() for x in content]
|
||||
entry[key] = content
|
||||
if not x.th and x.td:
|
||||
# row without header: contribute section
|
||||
x = x.find_all('li')
|
||||
x = [(x.a.string, x.a['href']) for x in x if x.a]
|
||||
for key, content in x:
|
||||
entry[key] = content
|
||||
|
||||
# parse "for available as package in"
|
||||
tables = soup.find_all('table', class_='wikitable')
|
||||
@ -187,18 +143,56 @@ if __name__ == "__main__":
|
||||
entry['categories'] = categories
|
||||
|
||||
entries.append(entry)
|
||||
# print(entry)
|
||||
|
||||
counter += 1
|
||||
if counter > 20:
|
||||
# break
|
||||
pass
|
||||
|
||||
unique_gameinfo_fields = sorted(list(unique_gameinfo_fields))
|
||||
print('unique gameinfo fields: {}'.format(unique_gameinfo_fields))
|
||||
|
||||
# save entries
|
||||
json_path = os.path.join(os.path.dirname(__file__), 'lgw_import.json')
|
||||
text = json.dumps(entries, indent=1)
|
||||
write_text(json_path, text)
|
||||
utils.write_text(entries_file, text)
|
||||
|
||||
|
||||
def clean_lgw_content():
|
||||
|
||||
# paths
|
||||
import_path = os.path.join(constants.root_path, 'tools', 'lgw-import')
|
||||
entries_file = os.path.join(import_path, '_lgw.json')
|
||||
cleaned_entries_file = os.path.join(import_path, '_lgw.cleaned.json')
|
||||
|
||||
# load entries
|
||||
text = utils.read_text(entries_file)
|
||||
entries = json.loads(text)
|
||||
|
||||
# rename keys
|
||||
key_replacements = (('developer', ('Developer', 'Developers')), ('code license', ('Code license', 'Code licenses')), ('engine', ('Engine', 'Engines')), ('genre', ('Genre', 'Genres')))
|
||||
for index, entry in enumerate(entries):
|
||||
for new_key, old_keys in key_replacements:
|
||||
for key in old_keys:
|
||||
if key in entry:
|
||||
entry[new_key] = entry[key]
|
||||
del entry[key]
|
||||
break
|
||||
|
||||
entries[index] = entry
|
||||
|
||||
# check for unique field names
|
||||
unique_fields = set()
|
||||
for entry in entries:
|
||||
unique_fields.update(entry.keys())
|
||||
print('unique lgw fields: {}'.format(sorted(list(unique_fields))))
|
||||
|
||||
# which fields are mandatory
|
||||
for entry in entries:
|
||||
remove_fields = [field for field in unique_fields if field not in entry]
|
||||
unique_fields -= set(remove_fields)
|
||||
print('mandatory lgw fields: {}'.format(sorted(list(unique_fields))))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
# stage one
|
||||
# download_lgw_content()
|
||||
|
||||
# stage two
|
||||
# parse_lgw_content()
|
||||
|
||||
# stage three
|
||||
clean_lgw_content()
|
@ -243,7 +243,7 @@ if __name__ == "__main__":
|
||||
|
||||
# determine file name
|
||||
print('create new entry for {}'.format(lgw_name))
|
||||
file_name = derive_canonical_file_name(lgw_name)
|
||||
file_name = canonical_game_name(lgw_name) + '.md'
|
||||
target_file = os.path.join(games_path, file_name)
|
||||
if os.path.isfile(target_file):
|
||||
print('warning: file {} already existing, save under slightly different name'.format(file_name))
|
||||
|
@ -13,7 +13,9 @@ import http.client
|
||||
import datetime
|
||||
import json
|
||||
import textwrap
|
||||
from utils.osg import *
|
||||
import os
|
||||
import re
|
||||
from utils import constants as c, utils, osg
|
||||
|
||||
|
||||
def update_readme_and_tocs(infos):
|
||||
@ -29,12 +31,12 @@ def update_readme_and_tocs(infos):
|
||||
print('update readme and toc files')
|
||||
|
||||
# delete content of toc path
|
||||
for file in os.listdir(tocs_path):
|
||||
os.remove(os.path.join(tocs_path, file))
|
||||
for file in os.listdir(c.tocs_path):
|
||||
os.remove(os.path.join(c.tocs_path, file))
|
||||
|
||||
# read readme
|
||||
readme_file = os.path.join(root_path, 'README.md')
|
||||
readme_text = read_text(readme_file)
|
||||
readme_file = os.path.join(c.root_path, 'README.md')
|
||||
readme_text = utils.read_text(readme_file)
|
||||
|
||||
# compile regex for identifying the building blocks in the readme
|
||||
regex = re.compile(r"(.*?)(\[comment\]: # \(start.*?end of autogenerated content\))(.*)", re.DOTALL)
|
||||
@ -55,7 +57,7 @@ def update_readme_and_tocs(infos):
|
||||
|
||||
# create by category
|
||||
categories_text = []
|
||||
for keyword in recommended_keywords:
|
||||
for keyword in osg.recommended_keywords:
|
||||
infos_filtered = [x for x in infos if keyword in x['keywords']]
|
||||
title = keyword.capitalize()
|
||||
name = keyword.replace(' ', '-')
|
||||
@ -67,7 +69,7 @@ def update_readme_and_tocs(infos):
|
||||
|
||||
# create by platform
|
||||
platforms_text = []
|
||||
for platform in valid_platforms:
|
||||
for platform in osg.valid_platforms:
|
||||
infos_filtered = [x for x in infos if platform in x.get('platform', [])]
|
||||
title = platform
|
||||
name = platform.lower()
|
||||
@ -80,7 +82,7 @@ def update_readme_and_tocs(infos):
|
||||
text = start + "[comment]: # (start of autogenerated content, do not edit)\n" + tocs_text + "\n[comment]: # (end of autogenerated content)" + end
|
||||
|
||||
# write to readme
|
||||
write_text(readme_file, text)
|
||||
utils.write_text(readme_file, text)
|
||||
|
||||
|
||||
def create_toc(title, file, entries):
|
||||
@ -88,7 +90,7 @@ def create_toc(title, file, entries):
|
||||
|
||||
"""
|
||||
# file path
|
||||
toc_file = os.path.join(tocs_path, file)
|
||||
toc_file = os.path.join(c.tocs_path, file)
|
||||
|
||||
# header line
|
||||
text = '[comment]: # (autogenerated content, do not edit)\n# {}\n\n'.format(title)
|
||||
@ -105,7 +107,7 @@ def create_toc(title, file, entries):
|
||||
text += '\n'.join(rows)
|
||||
|
||||
# write to toc file
|
||||
write_text(toc_file, text)
|
||||
utils.write_text(toc_file, text)
|
||||
|
||||
|
||||
def check_validity_external_links():
|
||||
@ -127,7 +129,7 @@ def check_validity_external_links():
|
||||
ignored_urls = ('https://git.tukaani.org/xz.git')
|
||||
|
||||
# iterate over all entries
|
||||
for _, entry_path, content in entry_iterator(games_path):
|
||||
for _, entry_path, content in osg.entry_iterator():
|
||||
|
||||
# apply regex
|
||||
matches = regex.findall(content)
|
||||
@ -169,12 +171,12 @@ def check_template_leftovers():
|
||||
print('check for template leftovers')
|
||||
|
||||
# load template and get all lines
|
||||
text = read_text(os.path.join(root_path, 'template.md'))
|
||||
text = utils.read_text(os.path.join(c.root_path, 'template.md'))
|
||||
text = text.split('\n')
|
||||
check_strings = [x for x in text if x and not x.startswith('##')]
|
||||
|
||||
# iterate over all entries
|
||||
for _, entry_path, content in entry_iterator(games_path):
|
||||
for _, entry_path, content in osg.entry_iterator():
|
||||
|
||||
for check_string in check_strings:
|
||||
if content.find(check_string) >= 0:
|
||||
@ -196,7 +198,7 @@ def fix_entries():
|
||||
regex = re.compile(r"(.*)- Keywords:([^\n]*)(.*)", re.DOTALL)
|
||||
|
||||
# iterate over all entries
|
||||
for entry, entry_path, content in entry_iterator(games_path):
|
||||
for entry, entry_path, content in osg.entry_iterator():
|
||||
|
||||
# match with regex
|
||||
matches = regex.findall(content)
|
||||
@ -211,7 +213,7 @@ def fix_entries():
|
||||
elements = list(set(elements))
|
||||
|
||||
# get category out
|
||||
for keyword in recommended_keywords:
|
||||
for keyword in osg.recommended_keywords:
|
||||
if keyword in elements:
|
||||
elements.remove(keyword)
|
||||
category = keyword
|
||||
@ -243,13 +245,13 @@ def fix_entries():
|
||||
|
||||
if new_content != content:
|
||||
# write again
|
||||
write_text(entry_path, new_content)
|
||||
utils.write_text(entry_path, new_content)
|
||||
|
||||
# code dependencies
|
||||
regex = re.compile(r"(.*)- Code dependencies:([^\n]*)(.*)", re.DOTALL)
|
||||
|
||||
# iterate over all entries
|
||||
for entry, entry_path, content in entry_iterator(games_path):
|
||||
for entry, entry_path, content in osg.entry_iterator():
|
||||
# match with regex
|
||||
matches = regex.findall(content)
|
||||
|
||||
@ -279,13 +281,13 @@ def fix_entries():
|
||||
|
||||
if new_content != content:
|
||||
# write again
|
||||
write_text(entry_path, new_content)
|
||||
utils.write_text(entry_path, new_content)
|
||||
|
||||
# build systems
|
||||
regex = re.compile(r"(.*)- Build system:([^\n]*)(.*)", re.DOTALL)
|
||||
|
||||
# iterate over all entries
|
||||
for entry, entry_path, content in entry_iterator(games_path):
|
||||
for entry, entry_path, content in osg.entry_iterator():
|
||||
# match with regex
|
||||
matches = regex.findall(content)
|
||||
|
||||
@ -311,7 +313,7 @@ def fix_entries():
|
||||
|
||||
if new_content != content:
|
||||
# write again
|
||||
write_text(entry_path, new_content)
|
||||
utils.write_text(entry_path, new_content)
|
||||
|
||||
|
||||
def update_statistics(infos):
|
||||
@ -324,7 +326,7 @@ def update_statistics(infos):
|
||||
print('update statistics')
|
||||
|
||||
# start the page
|
||||
statistics_file = os.path.join(root_path, 'statistics.md')
|
||||
statistics_file = os.path.join(c.root_path, 'statistics.md')
|
||||
statistics = '[comment]: # (autogenerated content, do not edit)\n# Statistics\n\n'
|
||||
|
||||
# total number
|
||||
@ -524,7 +526,7 @@ def update_statistics(infos):
|
||||
statistics += '##### Platforms frequency\n\n' + '\n'.join(unique_platforms) + '\n\n'
|
||||
|
||||
# write to statistics file
|
||||
write_text(statistics_file, statistics)
|
||||
utils.write_text(statistics_file, statistics)
|
||||
|
||||
|
||||
def export_json(infos):
|
||||
@ -585,9 +587,9 @@ def export_json(infos):
|
||||
db['data'] = entries
|
||||
|
||||
# output
|
||||
json_path = os.path.join(games_path, os.path.pardir, 'docs', 'data.json')
|
||||
json_path = os.path.join(c.games_path, os.path.pardir, 'docs', 'data.json')
|
||||
text = json.dumps(db, indent=1)
|
||||
write_text(json_path, text)
|
||||
utils.write_text(json_path, text)
|
||||
|
||||
|
||||
def git_repo(repo):
|
||||
@ -710,9 +712,9 @@ def export_primary_code_repositories_json():
|
||||
primary_repos[k] = sorted(set(v))
|
||||
|
||||
# write them to tools/git
|
||||
json_path = os.path.join(root_path, 'tools', 'archives.json')
|
||||
json_path = os.path.join(c.root_path, 'tools', 'archives.json')
|
||||
text = json.dumps(primary_repos, indent=1)
|
||||
write_text(json_path, text)
|
||||
utils.write_text(json_path, text)
|
||||
|
||||
|
||||
def export_git_code_repositories_json():
|
||||
@ -739,40 +741,31 @@ def export_git_code_repositories_json():
|
||||
urls.sort()
|
||||
|
||||
# write them to tools/git
|
||||
json_path = os.path.join(root_path, 'tools', 'git_repositories.json')
|
||||
json_path = os.path.join(c.root_path, 'tools', 'git_repositories.json')
|
||||
text = json.dumps(urls, indent=1)
|
||||
write_text(json_path, text)
|
||||
utils.write_text(json_path, text)
|
||||
|
||||
|
||||
def sort_text_file(file, name):
|
||||
"""
|
||||
Reads a text file, splits in lines, removes duplicates, sort, writes back.
|
||||
"""
|
||||
text = read_text(file)
|
||||
text = utils.read_text(file)
|
||||
text = text.split('\n')
|
||||
text = sorted(list(set(text)), key=str.casefold)
|
||||
print('{} contains {} items'.format(name, len(text)))
|
||||
text = '\n'.join(text)
|
||||
write_text(file, text)
|
||||
|
||||
def strip_url(url):
|
||||
for prefix in ('http://', 'https://'):
|
||||
if url.startswith(prefix):
|
||||
url = url[len(prefix):]
|
||||
for suffix in ('/', '.git'):
|
||||
if url.endswith(suffix):
|
||||
url = url[:-len(suffix)]
|
||||
return url
|
||||
utils.write_text(file, text)
|
||||
|
||||
def clean_backlog(stripped_game_urls):
|
||||
|
||||
# read backlog and split
|
||||
file = os.path.join(root_path, 'tools', 'backlog.txt')
|
||||
text = read_text(file)
|
||||
file = os.path.join(c.root_path, 'tools', 'backlog.txt')
|
||||
text = utils.read_text(file)
|
||||
text = text.split('\n')
|
||||
|
||||
# remove those that are in stripped_game_urls
|
||||
text = [x for x in text if strip_url(x) not in stripped_game_urls]
|
||||
text = [x for x in text if utils.strip_url(x) not in stripped_game_urls]
|
||||
|
||||
# remove duplicates and sort
|
||||
text = sorted(list(set(text)), key=str.casefold)
|
||||
@ -780,18 +773,14 @@ def clean_backlog(stripped_game_urls):
|
||||
|
||||
# join and save again
|
||||
text = '\n'.join(text)
|
||||
write_text(file, text)
|
||||
utils.write_text(file, text)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
# paths
|
||||
root_path = os.path.realpath(os.path.join(os.path.dirname(__file__), os.path.pardir))
|
||||
games_path = os.path.join(root_path, 'games')
|
||||
tocs_path = os.path.join(games_path, 'tocs')
|
||||
|
||||
# backlog
|
||||
game_urls = extract_links(games_path)
|
||||
stripped_game_urls = [strip_url(x) for x in game_urls]
|
||||
game_urls = osg.extract_links()
|
||||
stripped_game_urls = [utils.strip_url(x) for x in game_urls]
|
||||
clean_backlog(stripped_game_urls)
|
||||
|
||||
|
||||
@ -802,7 +791,7 @@ if __name__ == "__main__":
|
||||
fix_entries()
|
||||
|
||||
# assemble info
|
||||
infos = assemble_infos(games_path)
|
||||
infos = osg.assemble_infos()
|
||||
|
||||
# recount and write to readme and to tocs
|
||||
update_readme_and_tocs(infos)
|
||||
@ -823,5 +812,5 @@ if __name__ == "__main__":
|
||||
# check_validity_external_links()
|
||||
|
||||
# sort backlog and rejected
|
||||
# sort_text_file(os.path.join(root_path, 'tools', 'backlog.txt'), 'backlog')
|
||||
sort_text_file(os.path.join(root_path, 'tools', 'rejected.txt'), 'rejected games list')
|
||||
# sort_text_file(os.path.join(c.root_path, 'tools', 'backlog.txt'), 'backlog')
|
||||
sort_text_file(os.path.join(c.root_path, 'tools', 'rejected.txt'), 'rejected games list')
|
||||
|
@ -229,9 +229,9 @@ if __name__ == "__main__":
|
||||
urls = osgc_entry['url']
|
||||
if type(urls) == str:
|
||||
urls = [urls]
|
||||
urls = [strip_url(url) for url in urls]
|
||||
our_urls = our_entry['home']
|
||||
our_urls = [x.replace('http://', '').replace('https://', '') for x in our_urls]
|
||||
urls = [x.replace('http://', '').replace('https://', '') for x in urls]
|
||||
our_urls = [strip_url(url) for url in our_urls]
|
||||
for url in urls:
|
||||
if url not in our_urls:
|
||||
p += ' home url {} missing\n'.format(url)
|
||||
@ -309,7 +309,7 @@ if __name__ == "__main__":
|
||||
|
||||
# determine file name
|
||||
print('create new entry for {}'.format(osgc_name))
|
||||
file_name = derive_canonical_file_name(osgc_name)
|
||||
file_name = canonical_game_name(osgc_name) + '.md'
|
||||
target_file = os.path.join(games_path, file_name)
|
||||
if os.path.isfile(target_file):
|
||||
print('warning: file {} already existing, save under slightly different name'.format(file_name))
|
||||
|
12
tools/utils/constants.py
Normal file
12
tools/utils/constants.py
Normal file
@ -0,0 +1,12 @@
|
||||
"""
|
||||
Paths, properties.
|
||||
"""
|
||||
|
||||
import os
|
||||
|
||||
# paths
|
||||
root_path = os.path.realpath(os.path.join(os.path.dirname(__file__), os.path.pardir, os.path.pardir))
|
||||
games_path = os.path.join(root_path, 'games')
|
||||
tocs_path = os.path.join(games_path, 'tocs')
|
||||
|
||||
local_properties_file = os.path.join(root_path, 'local.properties')
|
@ -3,8 +3,9 @@ Specific functions working on the games.
|
||||
"""
|
||||
|
||||
import re
|
||||
import os
|
||||
from difflib import SequenceMatcher
|
||||
from utils.utils import *
|
||||
from utils import utils, constants as c
|
||||
|
||||
essential_fields = ('Home', 'State', 'Keywords', 'Code repository', 'Code language', 'Code license')
|
||||
valid_fields = ('Home', 'Media', 'State', 'Play', 'Download', 'Platform', 'Keywords', 'Code repository', 'Code language',
|
||||
@ -19,38 +20,37 @@ def game_name_similarity(a, b):
|
||||
return SequenceMatcher(None, str.casefold(a), str.casefold(b)).ratio()
|
||||
|
||||
|
||||
def entry_iterator(games_path):
|
||||
def entry_iterator():
|
||||
"""
|
||||
|
||||
"""
|
||||
|
||||
# get all entries (ignore everything starting with underscore)
|
||||
entries = os.listdir(games_path)
|
||||
entries = os.listdir(c.games_path)
|
||||
|
||||
# iterate over all entries
|
||||
for entry in entries:
|
||||
entry_path = os.path.join(games_path, entry)
|
||||
entry_path = os.path.join(c.games_path, entry)
|
||||
|
||||
# ignore directories ("tocs" for example)
|
||||
if os.path.isdir(entry_path):
|
||||
continue
|
||||
|
||||
# read entry
|
||||
content = read_text(entry_path)
|
||||
content = utils.read_text(entry_path)
|
||||
|
||||
# yield
|
||||
yield entry, entry_path, content
|
||||
|
||||
|
||||
def derive_canonical_file_name(name):
|
||||
def canonical_game_name(name):
|
||||
"""
|
||||
Derives a canonical file name from a game name
|
||||
Derives a canonical game name from an actual game name (suitable for file names, ...)
|
||||
"""
|
||||
name = regex_sanitize_name.sub('', name)
|
||||
name = regex_sanitize_name_space_eater.sub('_', name)
|
||||
name = name.replace('_-_', '-')
|
||||
name = name.casefold()
|
||||
name = name + '.md'
|
||||
return name
|
||||
|
||||
|
||||
@ -193,7 +193,7 @@ def parse_entry(content):
|
||||
return info
|
||||
|
||||
|
||||
def assemble_infos(games_path):
|
||||
def assemble_infos():
|
||||
"""
|
||||
Parses all entries and assembles interesting infos about them.
|
||||
"""
|
||||
@ -204,7 +204,7 @@ def assemble_infos(games_path):
|
||||
infos = []
|
||||
|
||||
# iterate over all entries
|
||||
for entry, _, content in entry_iterator(games_path):
|
||||
for entry, _, content in entry_iterator():
|
||||
|
||||
# parse entry
|
||||
info = parse_entry(content)
|
||||
@ -213,12 +213,12 @@ def assemble_infos(games_path):
|
||||
info['file'] = entry
|
||||
|
||||
# check canonical file name
|
||||
canonical_file_name = derive_canonical_file_name(info['name'])
|
||||
canonical_file_name = canonical_game_name(info['name']) + '.md'
|
||||
# we also allow -X with X =2..9 as possible extension (because of duplicate canonical file names)
|
||||
if canonical_file_name != entry and canonical_file_name != entry[:-5] + '.md':
|
||||
print('file {} should be {}'.format(entry, canonical_file_name))
|
||||
source_file = os.path.join(games_path, entry)
|
||||
target_file = os.path.join(games_path, canonical_file_name)
|
||||
source_file = os.path.join(c.games_path, entry)
|
||||
target_file = os.path.join(c.games_path, canonical_file_name)
|
||||
if not os.path.isfile(target_file):
|
||||
pass
|
||||
# os.rename(source_file, target_file)
|
||||
@ -228,7 +228,8 @@ def assemble_infos(games_path):
|
||||
|
||||
return infos
|
||||
|
||||
def extract_links(games_path):
|
||||
|
||||
def extract_links():
|
||||
"""
|
||||
Parses all entries and extracts http(s) links from them
|
||||
"""
|
||||
@ -238,7 +239,7 @@ def extract_links(games_path):
|
||||
|
||||
# iterate over all entries
|
||||
urls = set()
|
||||
for _, _, content in entry_iterator(games_path):
|
||||
for _, _, content in entry_iterator():
|
||||
|
||||
# apply regex
|
||||
matches = regex.findall(content)
|
||||
|
5
tools/utils/osg_github.py
Normal file
5
tools/utils/osg_github.py
Normal file
@ -0,0 +1,5 @@
|
||||
"""
|
||||
Everything specific to the Github API (via PyGithub).
|
||||
"""
|
||||
|
||||
from github import Github
|
@ -9,7 +9,6 @@ import tarfile
|
||||
import time
|
||||
import urllib.request
|
||||
import zipfile
|
||||
import errno
|
||||
import stat
|
||||
|
||||
|
||||
@ -267,3 +266,33 @@ def unzip(zip_file, destination_directory):
|
||||
for name in dirs:
|
||||
date_time = dirs[name]
|
||||
os.utime(name, (date_time, date_time))
|
||||
|
||||
|
||||
def strip_url(url):
|
||||
for prefix in ('http://', 'https://'):
|
||||
if url.startswith(prefix):
|
||||
url = url[len(prefix):]
|
||||
for prefix in ('www'):
|
||||
if url.startswith(prefix):
|
||||
url = url[len(prefix):]
|
||||
for suffix in ('/', '.git', '/en', '/index.html'):
|
||||
if url.endswith(suffix):
|
||||
url = url[:-len(suffix)]
|
||||
return url
|
||||
|
||||
|
||||
def load_properties(filepath, sep='=', comment_char='#'):
|
||||
"""
|
||||
Read the file as a properties file (in Java).
|
||||
"""
|
||||
properties = {}
|
||||
with open(filepath, "rt") as file:
|
||||
for line in file:
|
||||
line = line.strip()
|
||||
if not line.startswith(comment_char):
|
||||
line = line.split(sep)
|
||||
assert(len(line)==2)
|
||||
key = line[0].strip()
|
||||
value = line[1].strip()
|
||||
properties[key] = value
|
||||
return properties
|
Loading…
x
Reference in New Issue
Block a user