diff --git a/.env b/.env new file mode 100644 diff --git a/.gitignore b/.gitignore --- a/.gitignore +++ b/.gitignore @@ -1 +1,15 @@ *.pyc +*.lock +vendor +bin +var +logs +public/stable5 +public/trunk5 + +###> symfony/webpack-encore-bundle ### +/node_modules/ +/public/build/ +npm-debug.log +yarn-error.log +###< symfony/webpack-encore-bundle ### diff --git a/404.php b/404.php deleted file mode 100644 --- a/404.php +++ /dev/null @@ -1,9 +0,0 @@ - diff --git a/assets/css/app.scss b/assets/css/app.scss new file mode 100644 --- /dev/null +++ b/assets/css/app.scss @@ -0,0 +1,677 @@ +@import "~bootstrap/scss/bootstrap"; +@import '~jquery-ui/themes/base/all.css'; + +body { + font-family:'Noto Sans', sans-serif +} +p { + line-height:2em +} +h1,h2,h3 { + line-height:1.5em +} +ul>li { + line-height:2em +} +.header { + position:sticky; + top:0; + display:block; + z-index:2; + background-color:rgba(255,255,255,0.95) +} +.header>* { + margin:auto; + max-width:1140px +} +.header::after { + content:""; + clear:both; + display:block; + background-size:100% 5px; + position:absolute; + height:5px; + width:100%; + left:0; + bottom:0; + background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAAAFCAYAAACzSkmrAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAACkSURBVDiN7dExDsIwDEbh9we1soXE6eCEbJyInQNwgKgxQ9WWFrIShr7ZkewvYm/V5fbwLj8NoKTec0lGzp66ZAzJS8jQ4EKG5KLY+FIeYBAOMoRHyFC4YJwpcqVixGYWnHHG1ebs700YHxBAHWM6DqoYHxBvswvGEegbnL1q/pAqxgQB1DE2EEAdY4aABeMEHH57+n+m8/UerZfYW0qtF9hb9wI2bU03vw4M8QAAAABJRU5ErkJggg=="); + z-index:-1 +} +#kHeaderNav { + padding:0; + position:relative +} +#kHeaderNav button { + outline:0 +} +#kHeaderNav .navbar-toggler { + position:relative +} +#kHeaderNav .navbar-toggler:before { + position:absolute; + top:0; + left:50%; + width:42px; + margin-left:-21px; + content:"="; + color:#4d4d4d; + font-family:"glyph"; + font-size:22px; + font-weight:normal; + text-indent:0px; + text-align:center; + line-height:50px; + display:inline-block; + text-decoration:none !important +} +#kHeaderNav a.nav-link,#kHeaderNav a.dropdown-item { + color:#334545; + height:50px; + line-height:50px; + padding:0 20px +} +#kHeaderNav a:hover { + color:#3daefd +} +#kHeaderNav a.nav-link.active { + color:#FFF +} +#kHeaderNav a.nav-link.active:hover { + color:#FFF +} +#kHeaderNav .dropdown-menu { + padding:0 +} +#kHeaderNav a.active:hover,#kHeaderNav .dropdown-menu.show a.nav-link { + color:#334545 +} +#kHeaderNav a:active,#kHeaderNav .active,#kHeaderNav a.dropdown-item:active,#kHeaderNav .navbar-brand-active,#kHeaderNav .dropdown-toggle.show a.nav-link { + background:#54a3d8; + color:#FFF +} +#kHeaderNav .dropdown-toggle.show { + position:relative +} +#kHeaderNav .dropdown-toggle::after { + content:"" !important; + display:none +} +#kHeaderNav .dropdown-toggle .nav-link::after { + display:inline-block; + width:0; + height:0; + margin-left:.5em; + vertical-align:.255em; + content:""; + border-top:.3em solid; + border-right:.3em solid transparent; + border-bottom:0; + border-left:.3em solid transparent +} +#kHeaderNav .dropdown-menu { + border-radius:0px; + border:1px solid #54a3d8; + border-top:none; + margin:0; + padding:0; + background-color:initial +} +@media (min-width: 575px) { + #kHeaderNav .dropdown-menu { + background-color:#fff + } +} +#kHeaderNav .dropdown-menu a { + display:block; + text-align:center; + text-decoration:none; + background-size:100%; + background-position:center; + background-repeat:no-repeat; + transition:background-size 0.4s; + position:relative +} +#kHeaderNav .dropdown-menu a::before { + content:''; + width:100%; + height:100%; + top:0; + left:0; + position:absolute; + background-repeat:no-repeat; + background-position:center; + background-size:101%; + z-index:-1; + transition:background-size 0.3s +} +#kHeaderNav a.kontact-menu-features::before { + background-image:url(/assets/img/kontact-menu-features.png) +} +#kHeaderNav a.kontact-menu-features:hover::before { + background-size:150% +} +#kHeaderNav a.kontact-menu-features { + min-width:360px; + min-height:150px; + line-height:150px; + color:#334545; + font-size:1.5em +} +#kHeaderNav .kontact-menu-apps { + display:flex; + flex-wrap:wrap +} +#kHeaderNav .kontact-menu-apps a { + width:50%; + height:auto; + position:relative; + min-height:100px; + line-height:100px; + font-size:1.3em; + color:#334545 +} +#kHeaderNav .kontact-menu-apps a::before { + background-size:155%; + opacity:0.3 +} +#kHeaderNav .kontact-menu-apps a:hover::before { + background-size:65%; + transition:background-size 0.3s +} +#kHeaderNav a.kontact-menu-apps-kmail::before { + background-image:url(/assets/img/icon-kmail.svg) +} +#kHeaderNav a.kontact-menu-apps-korganizer::before { + background-image:url(/assets/img/icon-korganizer.svg) +} +#kHeaderNav a.kontact-menu-apps-kaddressbook::before { + background-image:url(/assets/img/icon-kaddressbook.svg) +} +#kHeaderNav a.kontact-menu-apps-akregator::before { + background-image:url(/assets/img/icon-akregator.svg) +} +#kHeaderNav a.kontact-menu-apps-knotes::before { + background-image:url(/assets/img/icon-knotes.svg) +} +#kHeaderNav a.kontact-menu-apps-akonadi::before { + background-image:url(/assets/img/icon-akonadi.png) +} +#kHeaderNav .navbar-toggler { + order:2 +} +#KontactGlobalLogo { + margin:0; + margin-top:-3px; + text-align:center; + line-height:50px; + height:50px; + padding:0 10px; + order:1 +} +#KontactGlobalLogo>img { + width:70%; + margin-top:-3px +} +#kMainNavbar { + order:4 +} +@media (min-width: 768px) { + #kMainNavbar { + order:3 + } +} +#KMadeByKDE { + order:3; + padding-right:15px +} +#KMadeByKDE span { + display:none +} +@media (min-width: 768px) { + #KMadeByKDE span { + display:inline + } +} +@media (min-width: 768px) { + #KMadeByKDE { + order:4 + } +} +#KGlobalLogo::before { + position:absolute; + top:0; + width:42px; + margin-left:-21px; + content:"K"; + color:#4d4d4d; + font-family:"glyph"; + font-size:32px; + font-weight:normal; + text-indent:0px; + text-align:center; + line-height:50px; + display:inline-block; + text-decoration:none !important +} +main.main { + margin:auto; + margin-bottom:50px; + width:100%; + max-width:1140px; + padding:0 30px +} +@media (min-width: 1140px) { + main.main { + padding-left:0; + padding-right:0 + } +} +main .block { + padding:30px 20px +} +main.navfix { + margin-top:50px +} +#kWelcome { + font-size:18px; + border-radius:2px; + border:solid 1px #abdaf9; + background-color:#e1f2ff; + color:#375a7d; + padding:10px 20px; + margin-top:60px; + margin-bottom:60px; + text-align:center +} +#kWelcome p { + padding:0; + margin:0 +} +#kFooter { + background-color:#eff1f1; + color:#7f8c8d; + position:relative; + padding-top:12px; + font-size:12px; + width:100%; + clear:both +} +#kFooter a { + text-decoration:none; + color:#2980b9 +} +#kFooter section { + width:100%; + max-width:1140px; + margin:auto; + padding:0 20px +} +#kFooter #KSiteDonateForm { + background-color:#abf9c7; + border:solid 1px #7ceca4; + border-radius:2px; + margin-top:10px; + padding-top:10px; + padding-bottom:10px +} +#kFooter #KSiteDonateForm h3 { + font-size:14px; + font-weight:bold; + color:#377d50; + padding:0 0 10px; + margin:0 +} +#kFooter #KSiteDonateForm h3 a { + font-width:normal; + margin-left:20px; + color:#2980b9 +} +#kFooter #KSiteDonateForm h3 a::before { + content:"( "; + color:#377d50 +} +#kFooter #KSiteDonateForm h3 a::after { + content:" )"; + color:#377d50 +} +#kFooter #KSiteDonateForm #otherWaysDonate { + display:inline-block; + font-size:14px; + margin-top:10px +} +#kFooter #KGlobalContributorLinks { + padding:0 20px; + box-sizing:border-box; + max-width:100%; + background-color:rgba(0,0,0,0.05); + position:relative; + margin:auto +} +#kFooter #KGlobalContributorLinks nav { + max-width:1100px; + padding:0; + line-height:50px; + margin:auto; + font-size:14px; + width:100%; + position:relative +} +#kFooter #KGlobalLegalInfo { + padding:20px +} +#kFooter #KGlobalLegalInfo small { + font-size:12px +} +#kFooter #KGlobalLegalInfo figure { + display:inline-block; + padding:0; + margin:0 +} +#kFooter #KGlobalLegalInfo small+small::before { + content:" | "; + color:#bdc3c7; + margin:0 10px +} +#kLinks { + padding:30px 20px 30px 0 +} +#kLinks nav { + width:20%; + display:inline-block; + box-sizing:border-box; + vertical-align:top; + font-size:12px; + padding:10px 0 10px 20px +} +#kLinks nav h3 { + font-size:14px; + color:#95a5a6; + margin:0 0 10px 0; + font-weight:bold +} +#kLinks a { + display:block; + line-height:150% +} +#kLinks a::after { + color:#7f8c8d; + position:relative; + content:">"; + font-family:"glyph"; + vertical-align:baseline; + top:.1em; + padding-left:10px +} +.konqi { + float:right; + width:250px; + margin-top:-50px; + margin-left:40px +} +.icon { + margin-left:20px +} +.icon::before { + content:""; + position:absolute; + display:block; + width:32px; + height:50px; + left:5px; + background-repeat:no-repeat; + background-size:24px; + background-position:center +} +.icon-kontact::before { + background-image:url(/assets/img/icon-kontact.svg) +} +.icon-kmail::before { + background-image:url(/assets/img/icon-kmail.svg) +} +.icon-korganizer::before { + background-image:url(/assets/img/icon-korganizer.svg) +} +.icon-kaddressbook::before { + background-image:url(/assets/img/icon-kaddressbook.svg) +} +.icon-knotes::before { + background-image:url(/assets/img/icon-knotes.svg) +} +.icon-akregator::before { + background-image:url(/assets/img/icon-akregator.svg) +} +.preview { + cursor:pointer +} +#kImagePreview { + text-align:center +} +#kImagePreview img { + margin:auto; + cursor:pointer; + max-width:100% +} +#kImagePreviewContainer { + width:100%; + height:100%; + display:flex; + flex-direction:column; + align-items:center; + pointer-events:none +} +.kSocialLinks { + line-height:50px +} +.kSocialLinks a:not(.no-glyph) { + display:inline-block; + color:#fafafa; + background:#27AE60; + position:relative; + text-indent:-9999px; + width:24px; + line-height:30px; + padding:0px 10px; + border-radius:3px; + transition:all .2s +} +.kSocialLinks a:after { + content:"@"; + font-family:'glyph'; + font-size:24px; + text-indent:0px; + color:#fafafa; + position:absolute; + top:0px; + left:0px; + right:0px; + text-align:center +} +.kSocialLinks a.shareFacebook { + background-color:#2980b9 +} +.kSocialLinks a.shareGoogle { + background-color:#d35400 +} +.kSocialLinks a.shareTwitter { + background-color:#3daefd +} +.kSocialLinks a.shareForum { + background-color:#0068c6 +} +.kSocialLinks a.shareTelegram { + background-color:#2ca5e0 +} +.kSocialLinks a.shareFacebook:hover { + background-color:#3498db +} +.kSocialLinks a.shareGoogle:hover { + background-color:#f67400 +} +.kSocialLinks a.shareTwitter:hover { + background-color:#70c3fe +} +.kSocialLinks a.shareForum:hover { + background-color:#1078d6 +} +.kSocialLinks a.shareTelegram:hover { + background-color:#2ca5e0 +} +.kSocialLinks a.shareFacebook:after { + content:"F" +} +.kSocialLinks a.shareGoogle:after { + content:"G" +} +.kSocialLinks a.shareTwitter:after { + content:"T" +} +.kSocialLinks a.shareForum:after { + content:"K" +} +.kSocialLinks a.shareMastodon:after { + content:"M" +} + +a#KDEGlobalLogo.navbar-brand { + padding-left: 5px; + padding-right: 5px; + &:hover { + color: white; + } +} + +@include media-breakpoint-down(lg) { + .nav-item.form-inline { + margin-bottom: 5px; + padding-left: 20px; + } +} +@font-face { + font-family:'glyph'; + src:url("glyph/glyph.eot?d1eayo"); + src:url("glyph/glyph.eot?d1eayo#iefix") format("embedded-opentype"),url("glyph/glyph.ttf?d1eayo") format("truetype"),url("glyph/glyph.woff?d1eayo") format("woff"),url("glyph/glyph.svg?d1eayo#glyph") format("svg"); + font-weight:normal; + font-style:normal +} +[class^="glyph-"],[class*=" glyph-"] { + font-family:'glyph'; + speak:none; + font-style:normal; + font-weight:normal; + font-variant:normal; + text-transform:none; + line-height:1; + -webkit-font-smoothing:antialiased; + -moz-osx-font-smoothing:grayscale +} +.glyph-favorite:before { + content:"\e900" +} +.glyph-link:before { + content:"\6c" +} +.glyph-share-diaspora:before { + content:"\2a" +} +.glyph-share-facebook:before { + content:"\46" +} +.glyph-share-gplus:before { + content:"\47" +} +.glyph-share-reddit:before { + content:"\52" +} +.glyph-share-twitter:before { + content:"\54" +} +.glyph-share-ycombinator:before { + content:"\59" +} +.glyph-view-catalog:before { + content:"\e908" +} +.glyph-view-categories:before { + content:"\e909" +} +.glyph-view-fullscreen:before { + content:"\e90a" +} +.glyph-view-list-details:before { + content:"\e90b" +} +.glyph-view-list-icons:before { + content:"\e90c" +} +.glyph-view-list-text:before { + content:"\e90d" +} +.glyph-view-list-tree:before { + content:"\e90e" +} +.glyph-view-media-playlist:before { + content:"\e90f" +} +.glyph-window-new:before { + content:"\57" +} +.glyph-video:before { + content:"\56" +} +.glyph-cancel:before { + content:"\5c" +} +.glyph-check:before { + content:"\63" +} +.glyph-close:before { + content:"\58" +} +.glyph-logo-kde:before { + content:"\4b" +} +.glyph-logo-plasma:before { + content:"\50" +} +.glyph-logo-plasmamobile:before { + content:"\4d" +} +.glyph-clear:before { + content:"\78" +} +.glyph-go-down:before { + content:"\76" +} +.glyph-go-home:before { + content:"\48" +} +.glyph-go-next:before { + content:"\3e" +} +.glyph-go-previous:before { + content:"\3c" +} +.glyph-go-up:before { + content:"\5e" +} +.glyph-hamburger:before { + content:"\3d" +} +.glyph-info:before { + content:"\49" +} +.glyph-new-window:before { + content:"\77" +} +.glyph-search:before { + content:"\51" +} +.glyph-settings:before { + content:"\53" +} +.glyph-share:before { + content:"\73" +} +.glyph-share-telegram:before { + content:"\2197" +} diff --git a/assets/glyph/glyph.eot b/assets/glyph/glyph.eot new file mode 100644 index 0000000000000000000000000000000000000000..733439ed3249ac3f40e4393ad07c8ec440540ab2 GIT binary patch literal 5712 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 literal 0 Hc$@ + + +Generated by IcoMoon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/glyph/glyph.ttf b/assets/glyph/glyph.ttf new file mode 100644 index 0000000000000000000000000000000000000000..6bca8bcc5fd89221bb20b652d8d06df54bb0b53e GIT binary patch literal 5556 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.'/.env'); +} + +$_SERVER['APP_ENV'] = $_ENV['APP_ENV'] = $_SERVER['APP_ENV'] ?: $_ENV['APP_ENV'] ?: 'dev'; +$_SERVER['APP_DEBUG'] = $_SERVER['APP_DEBUG'] ?? $_ENV['APP_DEBUG'] ?? 'prod' !== $_SERVER['APP_ENV']; +$_SERVER['APP_DEBUG'] = $_ENV['APP_DEBUG'] = (int) $_SERVER['APP_DEBUG'] || filter_var($_SERVER['APP_DEBUG'], FILTER_VALIDATE_BOOLEAN) ? '1' : '0'; diff --git a/config/bundles.php b/config/bundles.php new file mode 100644 --- /dev/null +++ b/config/bundles.php @@ -0,0 +1,18 @@ + ['all' => true], + Doctrine\Bundle\DoctrineCacheBundle\DoctrineCacheBundle::class => ['all' => true], + Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle::class => ['all' => true], + Doctrine\Bundle\DoctrineBundle\DoctrineBundle::class => ['all' => true], + Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle::class => ['all' => true], + Symfony\Bundle\SecurityBundle\SecurityBundle::class => ['all' => true], + Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle::class => ['all' => true], + Symfony\Bundle\TwigBundle\TwigBundle::class => ['all' => true], + Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['dev' => true, 'test' => true], + Symfony\Bundle\MonologBundle\MonologBundle::class => ['all' => true], + Symfony\Bundle\DebugBundle\DebugBundle::class => ['dev' => true, 'test' => true], + Symfony\Bundle\MakerBundle\MakerBundle::class => ['dev' => true], + Symfony\Bundle\WebServerBundle\WebServerBundle::class => ['dev' => true], + Symfony\WebpackEncoreBundle\WebpackEncoreBundle::class => ['all' => true], +]; diff --git a/config/packages/assets.yaml b/config/packages/assets.yaml new file mode 100644 --- /dev/null +++ b/config/packages/assets.yaml @@ -0,0 +1,3 @@ +framework: + assets: + json_manifest_path: '%kernel.project_dir%/public/build/manifest.json' diff --git a/config/packages/cache.yaml b/config/packages/cache.yaml new file mode 100644 --- /dev/null +++ b/config/packages/cache.yaml @@ -0,0 +1,19 @@ +framework: + cache: + # Put the unique name of your app here: the prefix seed + # is used to compute stable namespaces for cache keys. + #prefix_seed: your_vendor_name/app_name + + # The app cache caches to the filesystem by default. + # Other options include: + + # Redis + #app: cache.adapter.redis + #default_redis_provider: redis://localhost + + # APCu (not recommended with heavy random-write workloads as memory fragmentation can cause perf issues) + #app: cache.adapter.apcu + + # Namespaced pools use the above "app" backend by default + #pools: + #my.dedicated.cache: ~ diff --git a/config/packages/dev/debug.yaml b/config/packages/dev/debug.yaml new file mode 100644 --- /dev/null +++ b/config/packages/dev/debug.yaml @@ -0,0 +1,4 @@ +debug: + # Forwards VarDumper Data clones to a centralized server allowing to inspect dumps on CLI or in your browser. + # See the "server:dump" command to start a new server. + dump_destination: "tcp://%env(VAR_DUMPER_SERVER)%" diff --git a/config/packages/dev/easy_log_handler.yaml b/config/packages/dev/easy_log_handler.yaml new file mode 100644 --- /dev/null +++ b/config/packages/dev/easy_log_handler.yaml @@ -0,0 +1,16 @@ +services: + EasyCorp\EasyLog\EasyLogHandler: + public: false + arguments: ['%kernel.logs_dir%/%kernel.environment%.log'] + +#// FIXME: How to add this configuration automatically without messing up with the monolog configuration? +#monolog: +# handlers: +# buffered: +# type: buffer +# handler: easylog +# channels: ['!event'] +# level: debug +# easylog: +# type: service +# id: EasyCorp\EasyLog\EasyLogHandler diff --git a/config/packages/dev/monolog.yaml b/config/packages/dev/monolog.yaml new file mode 100644 --- /dev/null +++ b/config/packages/dev/monolog.yaml @@ -0,0 +1,19 @@ +monolog: + handlers: + main: + type: stream + path: "%kernel.logs_dir%/%kernel.environment%.log" + level: debug + channels: ["!event"] + # uncomment to get logging in your browser + # you may have to allow bigger header sizes in your Web server configuration + #firephp: + # type: firephp + # level: info + #chromephp: + # type: chromephp + # level: info + console: + type: console + process_psr_3_messages: false + channels: ["!event", "!doctrine", "!console"] diff --git a/config/packages/dev/routing.yaml b/config/packages/dev/routing.yaml new file mode 100644 --- /dev/null +++ b/config/packages/dev/routing.yaml @@ -0,0 +1,3 @@ +framework: + router: + strict_requirements: true diff --git a/config/packages/dev/swiftmailer.yaml b/config/packages/dev/swiftmailer.yaml new file mode 100644 --- /dev/null +++ b/config/packages/dev/swiftmailer.yaml @@ -0,0 +1,4 @@ +# See https://symfony.com/doc/current/email/dev_environment.html +swiftmailer: + # send all emails to a specific address + #delivery_addresses: ['me@example.com'] diff --git a/config/packages/dev/web_profiler.yaml b/config/packages/dev/web_profiler.yaml new file mode 100644 --- /dev/null +++ b/config/packages/dev/web_profiler.yaml @@ -0,0 +1,6 @@ +web_profiler: + toolbar: true + intercept_redirects: false + +framework: + profiler: { only_exceptions: false } diff --git a/config/packages/doctrine.yaml b/config/packages/doctrine.yaml new file mode 100644 --- /dev/null +++ b/config/packages/doctrine.yaml @@ -0,0 +1,29 @@ +parameters: + # Adds a fallback DATABASE_URL if the env var is not set. + # This allows you to run cache:warmup even if your + # environment variables are not available yet. + # You should not need to change this value. + env(DATABASE_URL): '' + +doctrine: + dbal: + # configure these for your database server + driver: 'pdo_mysql' + server_version: '5.7' + charset: utf8mb4 + default_table_options: + charset: utf8mb4 + collate: utf8mb4_unicode_ci + + url: '%env(resolve:DATABASE_URL)%' + orm: + auto_generate_proxy_classes: true + naming_strategy: doctrine.orm.naming_strategy.underscore + auto_mapping: true + mappings: + App: + is_bundle: false + type: annotation + dir: '%kernel.project_dir%/src/Entity' + prefix: 'App\Entity' + alias: App diff --git a/config/packages/doctrine_migrations.yaml b/config/packages/doctrine_migrations.yaml new file mode 100644 --- /dev/null +++ b/config/packages/doctrine_migrations.yaml @@ -0,0 +1,5 @@ +doctrine_migrations: + dir_name: '%kernel.project_dir%/src/Migrations' + # namespace is arbitrary but should be different from App\Migrations + # as migrations classes should NOT be autoloaded + namespace: DoctrineMigrations diff --git a/config/packages/framework.yaml b/config/packages/framework.yaml new file mode 100644 --- /dev/null +++ b/config/packages/framework.yaml @@ -0,0 +1,19 @@ +framework: + secret: '%env(APP_SECRET)%' + #default_locale: en + #csrf_protection: true + #http_method_override: true + + # Enables session support. Note that the session will ONLY be started if you read or write from it. + # Remove or comment this section to explicitly disable session support. + session: + handler_id: ~ + cookie_secure: auto + cookie_samesite: lax + + #esi: true + #fragments: true + php_errors: + log: true + assets: + json_manifest_path: '%kernel.project_dir%/public/build/manifest.json' diff --git a/config/packages/prod/doctrine.yaml b/config/packages/prod/doctrine.yaml new file mode 100644 --- /dev/null +++ b/config/packages/prod/doctrine.yaml @@ -0,0 +1,32 @@ +doctrine: + orm: + auto_generate_proxy_classes: false + metadata_cache_driver: + type: service + id: doctrine.system_cache_provider + query_cache_driver: + type: service + id: doctrine.system_cache_provider + result_cache_driver: + type: service + id: doctrine.result_cache_provider + +services: + doctrine.result_cache_provider: + class: Symfony\Component\Cache\DoctrineProvider + public: false + arguments: + - '@doctrine.result_cache_pool' + doctrine.system_cache_provider: + class: Symfony\Component\Cache\DoctrineProvider + public: false + arguments: + - '@doctrine.system_cache_pool' + +framework: + cache: + pools: + doctrine.result_cache_pool: + adapter: cache.app + doctrine.system_cache_pool: + adapter: cache.system diff --git a/config/packages/prod/monolog.yaml b/config/packages/prod/monolog.yaml new file mode 100644 --- /dev/null +++ b/config/packages/prod/monolog.yaml @@ -0,0 +1,25 @@ +monolog: + handlers: + main: + type: fingers_crossed + action_level: error + handler: nested + excluded_404s: + # regex: exclude all 404 errors from the logs + - ^/ + nested: + type: stream + path: "%kernel.logs_dir%/%kernel.environment%.log" + level: debug + console: + type: console + process_psr_3_messages: false + channels: ["!event", "!doctrine"] + deprecation: + type: stream + path: "%kernel.logs_dir%/%kernel.environment%.deprecations.log" + deprecation_filter: + type: filter + handler: deprecation + max_level: info + channels: ["php"] diff --git a/config/packages/routing.yaml b/config/packages/routing.yaml new file mode 100644 --- /dev/null +++ b/config/packages/routing.yaml @@ -0,0 +1,4 @@ +framework: + router: + strict_requirements: ~ + utf8: true diff --git a/config/packages/security.yaml b/config/packages/security.yaml new file mode 100644 --- /dev/null +++ b/config/packages/security.yaml @@ -0,0 +1,24 @@ +security: + # https://symfony.com/doc/current/security.html#where-do-users-come-from-user-providers + providers: + in_memory: { memory: ~ } + firewalls: + dev: + pattern: ^/(_(profiler|wdt)|css|images|js)/ + security: false + main: + anonymous: true + + # activate different ways to authenticate + + # http_basic: true + # https://symfony.com/doc/current/security.html#a-configuring-how-your-users-will-authenticate + + # form_login: true + # https://symfony.com/doc/current/security/form_login_setup.html + + # Easy way to control access for large sections of your site + # Note: Only the *first* access control that matches will be used + access_control: + # - { path: ^/admin, roles: ROLE_ADMIN } + # - { path: ^/profile, roles: ROLE_USER } diff --git a/config/packages/sensio_framework_extra.yaml b/config/packages/sensio_framework_extra.yaml new file mode 100644 --- /dev/null +++ b/config/packages/sensio_framework_extra.yaml @@ -0,0 +1,3 @@ +sensio_framework_extra: + router: + annotations: false diff --git a/config/packages/swiftmailer.yaml b/config/packages/swiftmailer.yaml new file mode 100644 --- /dev/null +++ b/config/packages/swiftmailer.yaml @@ -0,0 +1,3 @@ +swiftmailer: + url: '%env(MAILER_URL)%' + spool: { type: 'memory' } diff --git a/config/packages/test/framework.yaml b/config/packages/test/framework.yaml new file mode 100644 --- /dev/null +++ b/config/packages/test/framework.yaml @@ -0,0 +1,4 @@ +framework: + test: true + session: + storage_id: session.storage.mock_file diff --git a/config/packages/test/monolog.yaml b/config/packages/test/monolog.yaml new file mode 100644 --- /dev/null +++ b/config/packages/test/monolog.yaml @@ -0,0 +1,7 @@ +monolog: + handlers: + main: + type: stream + path: "%kernel.logs_dir%/%kernel.environment%.log" + level: debug + channels: ["!event"] diff --git a/config/packages/test/routing.yaml b/config/packages/test/routing.yaml new file mode 100644 --- /dev/null +++ b/config/packages/test/routing.yaml @@ -0,0 +1,3 @@ +framework: + router: + strict_requirements: true diff --git a/config/packages/test/swiftmailer.yaml b/config/packages/test/swiftmailer.yaml new file mode 100644 --- /dev/null +++ b/config/packages/test/swiftmailer.yaml @@ -0,0 +1,2 @@ +swiftmailer: + disable_delivery: true diff --git a/config/packages/test/web_profiler.yaml b/config/packages/test/web_profiler.yaml new file mode 100644 --- /dev/null +++ b/config/packages/test/web_profiler.yaml @@ -0,0 +1,6 @@ +web_profiler: + toolbar: false + intercept_redirects: false + +framework: + profiler: { collect: false } diff --git a/config/packages/translation.yaml b/config/packages/translation.yaml new file mode 100644 --- /dev/null +++ b/config/packages/translation.yaml @@ -0,0 +1,6 @@ +framework: + default_locale: en + translator: + default_path: '%kernel.project_dir%/translations' + fallbacks: + - '%locale%' diff --git a/config/packages/twig.yaml b/config/packages/twig.yaml new file mode 100644 --- /dev/null +++ b/config/packages/twig.yaml @@ -0,0 +1,4 @@ +twig: + default_path: '%kernel.project_dir%/templates' + debug: '%kernel.debug%' + strict_variables: '%kernel.debug%' diff --git a/config/packages/validator.yaml b/config/packages/validator.yaml new file mode 100644 --- /dev/null +++ b/config/packages/validator.yaml @@ -0,0 +1,3 @@ +framework: + validation: + email_validation_mode: html5 diff --git a/config/packages/webpack_encore.yaml b/config/packages/webpack_encore.yaml new file mode 100644 --- /dev/null +++ b/config/packages/webpack_encore.yaml @@ -0,0 +1,4 @@ +webpack_encore: + # The path where Encore is building the assets. + # This should match Encore.setOutputPath() in webpack.config.js. + output_path: '%kernel.project_dir%/public/build' diff --git a/config/routes.yaml b/config/routes.yaml new file mode 100644 --- /dev/null +++ b/config/routes.yaml @@ -0,0 +1,3 @@ +#index: +# path: / +# controller: App\Controller\DefaultController::index diff --git a/config/routes/annotations.yaml b/config/routes/annotations.yaml new file mode 100644 --- /dev/null +++ b/config/routes/annotations.yaml @@ -0,0 +1,3 @@ +controllers: + resource: ../../src/Controller/ + type: annotation diff --git a/config/routes/dev/twig.yaml b/config/routes/dev/twig.yaml new file mode 100644 --- /dev/null +++ b/config/routes/dev/twig.yaml @@ -0,0 +1,3 @@ +_errors: + resource: '@TwigBundle/Resources/config/routing/errors.xml' + prefix: /_error diff --git a/config/routes/dev/web_profiler.yaml b/config/routes/dev/web_profiler.yaml new file mode 100644 --- /dev/null +++ b/config/routes/dev/web_profiler.yaml @@ -0,0 +1,7 @@ +web_profiler_wdt: + resource: '@WebProfilerBundle/Resources/config/routing/wdt.xml' + prefix: /_wdt + +web_profiler_profiler: + resource: '@WebProfilerBundle/Resources/config/routing/profiler.xml' + prefix: /_profiler diff --git a/config/services.yaml b/config/services.yaml new file mode 100644 --- /dev/null +++ b/config/services.yaml @@ -0,0 +1,28 @@ +# This file is the entry point to configure your own services. +# Files in the packages/ subdirectory configure your dependencies. + +# Put parameters here that don't need to change on each machine where the app is deployed +# https://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration +parameters: + locale: 'en' + +services: + # default configuration for services in *this* file + _defaults: + autowire: true # Automatically injects dependencies in your services. + autoconfigure: true # Automatically registers your services as commands, event subscribers, etc. + + # makes classes in src/ available to be used as services + # this creates a service per class whose id is the fully-qualified class name + App\: + resource: '../src/*' + exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}' + + # controllers are imported separately to make sure services can be injected + # as action arguments even if you don't extend any base controller class + App\Controller\: + resource: '../src/Controller' + tags: ['controller.service_arguments'] + + # add more service definitions when explicit configuration is needed + # please note that last definitions always *replace* previous ones diff --git a/create_generated_used.php b/create_generated_used.php --- a/create_generated_used.php +++ b/create_generated_used.php @@ -37,19 +37,21 @@ # full length, without the prefix (with code), without the suffix (.json) $var_name_len = strlen($json_file) - (strlen(JSONFILE_PREFIX) + 3) - 5; $var_name = substr($json_file, strlen(JSONFILE_PREFIX)+3, $var_name_len); - echo "\$$var_name = $array_string;\n"; + echo " const $var_name = $array_string;\n"; } function convert_files($json_dir) { $all_files = scandir($json_dir); echo "\n"; + echo "}?>\n"; } $json_files_dir = "."; diff --git a/dblatex-cvs-install/bin/dblatex b/dblatex-cvs-install/bin/dblatex deleted file mode 100755 --- a/dblatex-cvs-install/bin/dblatex +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/sh -# -# This script is automatically created by -# ./configure --prefix=/home/phil/sources/dblatex-cvs-install --catalog=/home/phil/cvs-kde/share/apps/ksgmltools2/customization/catalog -# -#SGML_CATALOG_FILES is exported by generator - -DBLATEX_BASE_DIR=${DBLATEX_BASE_DIR:-/home/docs/docs} - -TEXINPUTS=:${DBLATEX_BASE_DIR}/dblatex-cvs-install/share/dblatex/latex//:$TEXINPUTS -export TEXINPUTS - -${DBLATEX_BASE_DIR}/dblatex-cvs-install/share/dblatex/scripts/dblatex $* diff --git a/docgen_conf.ini b/docgen_conf.ini --- a/docgen_conf.ini +++ b/docgen_conf.ini @@ -1,16 +1,16 @@ [common] -work_dir=/home/docs/docs/work -website_dir=/home/docs/website +work_dir=/home/carl/docs/work +website_dir=/home/carl/project/docs-kde-org/public # If the following options are not specified, languages and packages # are read from the files with the same name -#languages= -#packages= -branches=stable4,trunk4,stable5,trunk5 -static_files=404.php,docs.css,favicon.ico,images,include,index.php,intro.inc.html,robots.txt,styles +languages=en,ca +packages=frameworks,kde-workspace +branches=stable5,trunk5 +static_files=docs.css,favicon.ico,images excluded_lang_pdf=es,ja [env.kdelibs4] -compile_dir=/home/docs/docs/kdelibs +compile_dir=/home/carl/project/docs-kde-org/kdelibs docbookxml_path=/usr/share/xml/docbook/schema/dtd/4.2/ docbookxsl_path=/usr/share/xml/docbook/stylesheet/docbook-xsl diff --git a/doclogconfig.ini b/doclogconfig.ini --- a/doclogconfig.ini +++ b/doclogconfig.ini @@ -21,7 +21,7 @@ class=FileHandler level=DEBUG formatter=formatter -args=('/home/docs/logs/%(logfilename)s.log',) +args=('/home/carl/project/docs-kde-org/logs/%(logfilename)s.log',) [formatter_formatter] format=%(asctime)s:%(levelname)s:%(name)s:%(message)s diff --git a/include/doc_footer.inc b/include/doc_footer.inc deleted file mode 100644 --- a/include/doc_footer.inc +++ /dev/null @@ -1,110 +0,0 @@ - - - - - - - - 0) { ?> - - - - - - show(); ?> - - - - - - - \n
\n"; - $hotspotstart = '\n"; - if (!isset($site_search) || ($site_search == true)) { - print $searchstart; - include_once("search.inc"); - print $end; - } - else if ($site_search == "custom") { - print $searchstart; - include_once("$site_root/includes/search.inc"); - print $end; - } - - if (isset($site_hotspot)) { - if ($site_hotspot === true) { - print $hotspotstart; - include_once("hotspot.inc"); - print $end; - } - else - if ($site_hotspot == "custom") { - print $hotspotstart; - include_once("$site_root/includes/hotspot.inc"); - print $end; - } - } - ?> - - - - - - - - - - - - - - - | - | - - - -$name
\n"; -else - $contact = i18n_var("Maintained by kde.org Webmaster
\n"); -?> - - -
- - - - - - - - diff --git a/include/docs.inc b/include/docs.inc deleted file mode 100644 --- a/include/docs.inc +++ /dev/null @@ -1,14 +0,0 @@ -push("Docs Default","/media/styles/standard.css;/docs.css"); - -?> diff --git a/include/docs_classes.inc b/include/docs_classes.inc deleted file mode 100644 --- a/include/docs_classes.inc +++ /dev/null @@ -1,54 +0,0 @@ -name=$name; - $this->items=explode(";",$group); - } - function show($alt) - { - if ( count($this->items) ) - { - $numitems = count( $this->items ); - for ($i=0; $i < $numitems; $i++) - { - echo '\n"; - } - } - } -} - -class StylesheetList -{ - var $items= array(); - function push($name,$group) - { - array_push($this->items,new StylesheetGroup($name,$group)); - } - function show() - { - if ( count($this->items) ) - { - $numitems = count( $this->items ); - for ($i=0; $i < $numitems; $i++) - { - $this->items[$i]->show($i>0); - } - } - } -} - - - -?> diff --git a/include/functions.inc b/include/functions.inc deleted file mode 100644 --- a/include/functions.inc +++ /dev/null @@ -1,304 +0,0 @@ -" . i18n_var("Latest News") . "\n"; - - $news = new RDF(); - $rdf_pieces = $news->openRDF($file); - - if(!$items) - { - $items = 5; // default - } - $rdf_items = count($rdf_pieces); - if ($rdf_items > $items) - { - $rdf_items = $items; - } - - //only open the file if it has something in it - if ($rdf_items > 0) - { - /* Don't display the last story twice - * if there is less than the requested number of stories - * in the RDF file */ - if ($rdf_items < $items) - { - $rdf_items = $rdf_items - 1; - } - - $alternate = false; - - print "\n"; - - if ($summaryonly) - print "\n\n"; - - $prevDate = ""; - for($x=1;$x<=$rdf_items;$x++) - { - $alternate = !$alternate; - if ($alternate) - { - $color = "newsbox1"; - } - else - { - $color = "newsbox2"; - } - ereg("(.*)", $rdf_pieces[$x], $title); - ereg("(.*)", $rdf_pieces[$x], $date); - ereg("(.*)", $rdf_pieces[$x], $fullstory); - print "\n"; - - $printDate = $date[1]; - - $title[1] = utf8_encode($title[1]); - - if ($summaryonly) - { - print "\n"; - print "\n"; - $prevDate = $printDate; - } - else - { - print "\n"; - print "\n"; - } - - print "\n"; - - } - print "
" . i18n_var("Date") . "" . i18n_var("Headline") . "
".(($printDate == $prevDate) ? " " : "$printDate")."$title[1]

$printDate: $title[1]

$fullstory[1]
\n"; - } -} - -function begin_under_construction() -{ - if ($_SERVER["QUERY_STRING"] != "test") - print("\n"); -} - -function startTranslation($dictionary) -{ - global $site_root; - global $site_external; - $topleveldir = explode("/", $_SERVER['REQUEST_URI']); - - if ($site_root == "./") // if the page is not under a sub-directory - { - if (($site_external && ($_SERVER['SERVER_NAME'] != "kde.org")) || !$site_external) // if the page is something like kde.org or konqueror.org - { - $dir_file = $site_root . "/media/includes/i18n/" . $dictionary . "/" . "root.inc"; - $media_file = $site_root . "/media/includes/i18n/" . $dictionary . "/" . "media.inc"; - } - else // something like kde.org/apps/konqueror or kde.org/areas/kde-ev - { - $dir_file = "../../" . $site_root . "/media/includes/i18n/" . $dictionary . "/" . "root.inc"; - $media_file = "../../" . $site_root . "/media/includes/i18n/" . $dictionary . "/" . "media.inc"; - } - } - else - { - if (($site_external && ($_SERVER['SERVER_NAME'] != "kde.org")) || !$site_external) // if the page is something like kde.org or konqueror.org - { - $dir_file = $site_root . "/media/includes/i18n/" . $dictionary . "/" . $topleveldir[1] . ".inc"; - $media_file = $site_root . "/media/includes/i18n/" . $dictionary . "/" . "media.inc"; - } - else // someting like kde.org/apps/konqueror - { - $dir_file = "../../" . $site_root . "/media/includes/i18n/" . $dictionary . "/" . $topleveldir[1] . ".inc"; - $media_file = "../../" . $site_root . "/media/includes/i18n/" . $dictionary . "/" . "media.inc"; - } - } - - if ($dictionary != "en") - { - global $text; //needed! - if (file_exists($media_file)) - { - include($media_file); - } - if (file_exists($dir_file)) - { - include($dir_file); - } - } -} - -function i18nDebug() -{ - global $text; - print "text contains " . count($text) . " items \n"; -} - -function i18n_var($translate) -{ - global $text; - global $site_locale; - if ($site_locale == "en") - { - return $translate; - } - else - { - $translated = $text[$translate]; - if ($translated == "") - { - return $translate; - } - else - { - return $translated; - } - } -} - -function i18n($translate) -{ - global $text; - global $site_locale; - if ($site_locale == "en") - { - print $translate; - } - else - { - $translated = $text[$translate]; - if ($translated == "") - { - print $translate; - } - else - { - print $translated; - } - } -} - -function niceFileSize($path) -{ - if (file_exists($path)) - { - $size = filesize($path); - if ($size > (1024 * 1024)) - { - echo "(" . round($size/(1024*1024)) . "MB)"; - } - else - if ($size > 1024) - { - echo "(" . round($size/1024) . "KB)"; - } - else - { - echo "(" . round($size) . "B)"; - } - } - else - { - echo "(File not available on this server, use printing.kde.org or koffice.org instead)"; - } -} - -function siteLogo($path, $width, $height) -{ - return "src=\"$path\" width=\"$width\" height=\"$height\""; -} - -?> diff --git a/include/header.inc b/include/header.inc deleted file mode 100644 --- a/include/header.inc +++ /dev/null @@ -1,294 +0,0 @@ -\n"; - print "\n"; -?> - - - - - <?php print $title; ?> - - - - - - - - - - - - - - -\n"; - if (isset($rss_feed2_link)) - print "\n"; -?> - -show(); - else - { - if (!$rtl) - echo ''; - else - echo ''; - } -?> - - - - -'; - else - echo ''; -?> - - - -" > - - - - - - - - - - - - -
-
- - - -
-
- - - 0) { ?> - - - -
0) print 'rowspan="2"'; ?> > -
- $page_title\n"; - ?> diff --git a/include/header_docs.inc b/include/header_docs.inc deleted file mode 100644 --- a/include/header_docs.inc +++ /dev/null @@ -1,110 +0,0 @@ - - - - - - - KDE Documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
- Skip to main content :: - - \"Home\" - :: - \"\" - -
KDE Documentation
- - -
- -
- - Help :: - Contact Us - - :: Skip to Link Menu
- -   -
-
-
- - - -
-
- -"; -?> diff --git a/include/initialize.inc.php b/include/initialize.inc.php deleted file mode 100644 --- a/include/initialize.inc.php +++ /dev/null @@ -1,97 +0,0 @@ - diff --git a/include/produce_lists.inc.php b/include/produce_lists.inc.php deleted file mode 100644 --- a/include/produce_lists.inc.php +++ /dev/null @@ -1,61 +0,0 @@ - 0, - 'kdelibs' => 0, - 'calligra' => 5, - 'kdereview' => 10, - ); - if ( array_key_exists($p, $weights) ) { - $w = $weights[$p]; - } elseif ( strncmp($p, 'extragear-', strlen('extragear-')) == 0 ) { - $w = 7; - } else { - $w = 2; - } - return $w; -} - -/* - Compare packages, so that a certain order is enforced - (libraries first, then Applications, Extragear and Review) -*/ -function cmp_packages( $p1, $p2 ) -{ - $w1 = package_weight( $p1 ); - $w2 = package_weight( $p2 ); - $dw = $w1 - $w2; - if ( $dw == 0 ) { - /* same weight, so normal comparison */ - return strcmp( $p1, $p2 ); - } else { - return $dw; - } -} - -/* $packagelist: Complete list of all available packages */ -$packagelist = array_keys( $modules_programs ); -usort( $packagelist, 'cmp_packages' ); -/* Check if the requested package is a valid one */ -if ( $selected_package != "" and - (! in_array($selected_package, $packagelist) ) ) { - $selected_package_nonexist = $selected_package; - $show_intro = true; -} - -?> \ No newline at end of file diff --git a/include/staticappdata.inc.php b/include/staticappdata.inc.php deleted file mode 100644 --- a/include/staticappdata.inc.php +++ /dev/null @@ -1,466 +0,0 @@ - diff --git a/index.php b/index.php deleted file mode 100644 --- a/index.php +++ /dev/null @@ -1,546 +0,0 @@ - 0, 'stable5' => 1, 'trunk4' => 2, 'stable4' => 3); - if (in_array($b1, $base_array) && in_array($b2, $base_array)) { - return $base_array[$b1] - $base_array[$b2]; - } -} - -/* - Return the proper package/namespace for the specified application and - branch, using the knowledge generated by the documentation - generator. -*/ -function get_namespace($application, $branch) -{ - global $programs_multiplemodules; - if ( array_key_exists($application, $programs_multiplemodules) ) { - // multiple packages/namespaces: check in the special list of programs_docs - // with multiple modules if there is specific module for the current branch. - foreach ( $programs_multiplemodules[$application] as $s_branch => $s_module ) { - if ( $s_branch == $branch ) { - return $s_module; - } - } - } else { - global $modules_programs; - // single module for all branches, find it - foreach ( $modules_programs as $module => $module_apps ) { - if ( in_array($application, $module_apps) ) { - return $module; - } - } - } -} - -function build_url( $application='', $package='', $lang='', $branch='', $html_path='' ) -{ - $params = array(); - if ( strlen($branch) > 0 ) - $params[] = "branch=".$branch; - if ( strlen($lang) > 0 ) - $params[] = "language=".$lang; - if ( strlen($package) > 0 ) - $params[] = "package=".$package; - if ( strlen($application) > 0 ) - $params[] = "application=".$application; - if ( strlen($html_path) > 0 ) - $params[] = "path=".$html_path; - return "/index.php?" . implode('&', $params); -} - -function build_path( $branch='', $lang='', $application='', $html_path='' ) -{ - $package = get_namespace($application, $branch); - return $branch . - "/" . $lang . - "/" . $package . - "/" . $application . - "/" . $html_path; -} - -function language_for_application_exist( $app, $lang ) -{ - global $programs_docs; - return (array_key_exists($lang, $programs_docs[$app])); -} - -function branch_exist( $app, $lang, $branch ) -{ - global $programs_docs; - // no translations for the specified application in the current language - if ( !language_for_application_exist($app, $lang) ) { - return ""; - } - // Handle old URL - compatibility with the old schema - $compatibility_branches = array( - "development" => array("trunk5", "trunk4"), - "stable" => array("stable5", "stable4"), - ); - // Search in compatibility branches first - if ( array_key_exists($branch, $compatibility_branches) ) { - foreach ( $compatibility_branches[$branch] as $comp_branch ) { - # echo "Looking for $comp_branch into ".var_dump($programs_docs[$app][$lang]); - if ( in_array($comp_branch, $programs_docs[$app][$lang]) ) { - return $comp_branch; - } - } - } - // Normal branch - if ( in_array($branch, $programs_docs[$app][$lang]) ) { - return $branch; - } - return ""; -} - -if ( $selected_application != "" ) { - $apps = array($selected_application); - - // If branch is specified and correct, jump to the documentation - if ( $selected_branch != "" ) { - if (!language_for_application_exist( $selected_application, $selected_language )) { - $selected_language_nonexist = $selected_language; - $selected_language = "en"; - } - $looked_branch = branch_exist( $selected_application, $selected_language, $selected_branch ); - if ( $looked_branch != "" ) { - header( "Location: /".build_path( $looked_branch, $selected_language, $selected_application, $html_path ) ); - } else { - $selected_branch_nonexist = $selected_branch; - $selected_branch = ""; - } - } -} elseif ( $selected_package != "" ) { - $apps = $modules_programs[$selected_package]; -} else { - $show_intro = true; -} - -/* This is the actual start of the page as the media framework knows it */ - - -/* include('include/docs.inc'); */ - - $applications_list_json = json_encode(array_keys($programs_docs)); - include('include/functions.inc'); - include('include/header_docs.inc'); - -/* We are really printing HTML, WOW */ - -/* Build the menu */ - -echo ""; - -echo " -
-"; -echo " - -"; - - - - -echo " -
-
    -
  • -Language: - -
  • -
  • -Documentation branch: - -
  • -
  • -Match: - -
  • -
  • -Words: - -
  • -
  • - -
  • -
- - -
-"; - - -// end of search block - -echo " -

This server contains the complete user documentation for KDE (except the playground module).

-

You can select the release and language of the documentation you are searching for. Not all languages have all documentation translated.

-

The API documentation is available at api.kde.org.

- -

"; - - -if (isset($name) && isset($url)) { - $contact = i18n_var("Maintained by ") . " $name
\n"; -} else { - $contact = i18n_var("Maintained by kde.org Webmaster
\n"); -} - -print $contact; - -echo "

"; - i18n("KDE and K Desktop Environment are trademarks of"); -echo " "; - i18n("KDE e.V."); -echo " | "; - i18n("Legal"); -echo " -

- -
-"; - -echo ""; - -echo ""; // id=navigation - -/* - Check for packages/dirctories with subdirectories - Used to produce the i.e. kcontrol break out boxes. -*/ - -include 'include/staticappdata.inc.php'; - -/* Introduced because of the kocontrol/* */ -echo "
"; - -if ($selected_application_nonexist != "") { -echo " -
-

The application $selected_application_from_user -could not be found. Please check if you entered the name correctly, or use the -navigation on the left to access the complete KDE User Documentation.

-
-"; -} - -if ($selected_branch_nonexist != "") { -echo " -
-

The branch $selected_branch_nonexist -is not available for the specified application/language.

-
-"; -} - -if ($selected_language_nonexist != "") { -echo " -
-

The requested language $selected_language_nonexist -could not be found. US English was used instead.

-
-"; -} - -if ($selected_package_nonexist != "") { -echo " -
-

The package $selected_package_nonexist -could not be found.

-
-"; -} - -if (isset($url_nonexist)) { -echo " -
-

The file $url_nonexist could not be found. -Please check if you entered the URL correctly, or use the navigation on the left -to access the complete KDE User Documentation.

-

If you reached this page from another part of the KDE Documentation website or from an other KDE website, -please notify the KDE Documentation -Team and report the page where you found the wrong link, so we can fix the problem.

-
-"; -} - - -if ( $show_intro ) { - - include ("intro.inc.html"); - -} else { - #kdepimlibs has no applications - if ( (in_array($selected_package, $package_no_application_array) ) == false ) { - echo "

Module: $selected_package

"; - echo "
    "; - } - foreach ( $apps as $application ) { - - /* If the check for a subdir is positive, the subdir is added to the - subdir_array which is handled below */ - foreach ( $check_array as $check_string ) { - $check = strpos( $application, $check_string ); - if ( $check === false ) { - $applicationname = $application; - $checktest = false; - } else { - $checktest = true; - $subdir_array[]=$application; - break; - } - } - - /* Identity is important here */ - if ( $checktest === true ) { - continue; - } - - /* Ignore the oddities defined above */ - foreach ( $ignore_array as $ignore_string ) { - $test_string = $selected_package . "/" . $application; - if ( $test_string == $ignore_string ) { - $breaktest = true; - break; - } else { - $breaktest = false; - } - } - - if ( $breaktest === true ) { - continue; - } - - if ( $application == "kcontrol" or $application == "kcontrol5") { - /* If there ever is a kcontrol docbook outside kdebase - file_exists must be used. - */ - continue; - } - /* - catch docs which are there but have no index.docbook - or are otherwise broken - */ - $total_branches = $programs_docs[$applicationname][$selected_language]; - if(isset($appdisplayname_array[$applicationname])) { - $appdisplayname = $appdisplayname_array[$applicationname]; - } else { - $appdisplayname = $applicationname; - } - if ( $total_branches > 0 ) { - $app_branches = $programs_docs[$applicationname][$selected_language]; - usort( $app_branches, 'cmp_branches' ); - echo "
  • $appdisplayname
      "; - foreach ( $app_branches as $available_branch ) { - $candidate_html = build_path( $available_branch, $selected_language, $application, 'index.html' ); - if ( file_exists( $candidate_html ) ) { - echo "
    • "; - - echo "".$branch_description[$available_branch].""; - - $candidate_pdf = build_path( $available_branch, $selected_language, $application, $application.".pdf" ); - if ( file_exists( $candidate_pdf ) ) { - echo " (PDF)\n"; - } - echo "
    • "; - } - } - echo "
  • \n"; - } else { - echo "
  • ".$appdisplayname."". - "
    No documentation available for this language
  • "; - } - } - #kdepimlibs has no applications - if ( (in_array($selected_package, $package_no_application_array) ) == false ) { - echo "
"; - } - /* Needed for breaking up the subboxes (see kdebase)*/ - $previous_dir=""; - - /* Iterate over the subdir_array produced - above and break it into according boxes - */ - foreach ( $subdir_array as $application ) { - $current_dir = substr( $application, 0, strpos( $application, '/' ) ); - - if ( $current_dir != $previous_dir ) { - if ( $previous_dir != "" ) { - echo ""; - } - echo "

". $appdisplayname_array[$current_dir] ."

"; - echo "
    "; - } - - $applicationname = str_replace( '/', '', strstr( $application, '/' ) ); - - $app_branches = $programs_docs[$application][$selected_language]; - usort( $app_branches, 'cmp_branches' ); - echo "
  • $appdisplayname_array[$applicationname]
      "; - foreach ( $app_branches as $available_branch ) { - $candidate_html = build_path( $available_branch, $selected_language, $application, 'index.html' ); - if ( file_exists( $candidate_html ) ) { - echo "
    • "; - - echo "". - "". $branch_description[$available_branch] ."".""; - $candidate_pdf = build_path( $available_branch, $selected_language, - $application, $applicationname.".pdf" ); - if ( file_exists( $candidate_pdf ) ) { - echo " (PDF)\n"; - } - echo "
    • "; - } - } - echo "
  • \n"; - - $previous_dir = $current_dir; - } - echo "
"; -} - -/* END appswrapper */ -echo "
"; -echo "" -?> - - diff --git a/intro.inc.html b/intro.inc.html deleted file mode 100644 --- a/intro.inc.html +++ /dev/null @@ -1,53 +0,0 @@ - -
- -

Welcome

- -

- Welcome to the KDE documentation site. This page holds the - complete KDE User Documentation in over 25 languages. Thanks - to the enormous efforts by our documentation and translation - teams you can access thousands of pages of documentation. -

-

- Before you start searching the library or asking - questions on the mailing lists, there is a good chance your - answer is already in the - KDE UserBase or the - KDE Community Forums. - They have a hotspot in the right menubar, where you have - fast access to them. -

-

- If you are looking for developer documentation, the - KDE Techbase - is the place where you get what you are looking for. -

- -

Navigation

-

- There are two menubars on the site. The left one allows you to navigate - through the available KDE packages, languages and versions. The right - menubar holds quicklinks to KDE UserBase and the KDE Community Forums, - and allows you to search the complete documentation in all languages. -

-

- Select the language, the version of KDE and the package, - the application you want is in. For now only the stable and - the development versions of the documentation are available. -

- -

Other Information

-

- The documentation for KDE Extragear applications is only available - in the development section. -

-

- System Settings (KControl) documentation gets separate boxes, since it - is very big and most users only want a small part of them. -

- -

- I hope you find what you are searching for. Have fun with KDE! -

-
diff --git a/package.json b/package.json new file mode 100644 --- /dev/null +++ b/package.json @@ -0,0 +1,20 @@ +{ + "devDependencies": { + "@symfony/webpack-encore": "^0.22.0", + "bootstrap": "^4.2.1", + "jquery": "^3.3.1", + "jquery-ui": "^1.12.1", + "node-sass": "^4.11.0", + "popper.js": "^1.14.6", + "sass-loader": "^7.1.0", + "webpack-notifier": "^1.6.0" + }, + "license": "UNLICENSED", + "private": true, + "scripts": { + "dev-server": "encore dev-server", + "dev": "encore dev", + "watch": "encore dev --watch", + "build": "encore production --progress" + } +} diff --git a/phpunit.xml.dist b/phpunit.xml.dist new file mode 100644 --- /dev/null +++ b/phpunit.xml.dist @@ -0,0 +1,31 @@ + + + + + + + + + + + + + tests + + + + + + src + + + + + + + diff --git a/public/assets/img/icon-kde.svg b/public/assets/img/icon-kde.svg new file mode 100644 --- /dev/null +++ b/public/assets/img/icon-kde.svg @@ -0,0 +1,132 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs.css b/public/docs.css rename from docs.css rename to public/docs.css diff --git a/favicon.ico b/public/favicon.ico rename from favicon.ico rename to public/favicon.ico index 2c9dd50e4d961b11292cae22cc765d531f4d0d93..2c9dd50e4d961b11292cae22cc765d531f4d0d93 GIT binary patch literal 1150 zc$|flZBUd|6vx+@W>9M;W3ewrL>+bfYFHZNF`#kfUd;jO0d*=ME zM6yOa8#YM9+g1|)oJ8`nL?UqzQ<#M1U;DF0o`=;tMV`_-s=cpJ8EB6>_zlz{PE-Xu z@pGsHrQ!BmjBuhl%$XaJE;Pru(;V%}Zy{Unm3m8Ea$K#NemP)^a*qvi&lji+dX<|o z&U74eqxZNceJMUXO!lJVb2sXR{gPP!!TUwjL3R{-S-0hTtmQ(`CQAHYqWZ8McN1Lr z>*PL+dEpGU-ejOj!)jp^Mp*>~O+4F1YYbb=i;JtNJMr@|)BU{?e9JTD9 zottH5M9*lAil?;|%ns==7!8c;I?<)?=W47Iwb5Hp_)0k^^uNcvPED*mU8y@6zIK^u zy^j7b_t29TPJgN&gBbzzD|6`l>L8up#-Tal#*KJKlpokoxO+WyN9@tWZ$&FlVQzec zUS$?tU+iRQ!NkhS3Z03rXjA<$%}ipLdMdOoG$c4t=4V5Z*Yo0k3oTzqW1OF7acPmZ zBu}&{9xN{{u)4ZR%V#^7>}g|J__}*Gk=7(I`emVd5P}qLp=UIj3HT|(7%mBoIiipIvP{l=#zcOKz;& zFJbb_%OImY%%%bd7c zj9!(FwjheyWFHZGH=4-pl=w&+&HRcy8qNG(GV>c`=GRg1>xfG5s|dFf{5lGLw^9Ee Ve(S=Wo6Y>5Uh~YW;eUr&`wy;ov*`c; literal 1150 zc$|flZBUd|6vx+@W>9M;W3ewrL>+bfYFHZNF`#kfUd;jO0d*=ME zM6yOa8#YM9+g1|)oJ8`nL?UqzQ<#M1U;DF0o`=;tMV`_-s=cpJ8EB6>_zlz{PE-Xu z@pGsHrQ!BmjBuhl%$XaJE;Pru(;V%}Zy{Unm3m8Ea$K#NemP)^a*qvi&lji+dX<|o z&U74eqxZNceJMUXO!lJVb2sXR{gPP!!TUwjL3R{-S-0hTtmQ(`CQAHYqWZ8McN1Lr z>*PL+dEpGU-ejOj!)jp^Mp*>~O+4F1YYbb=i;JtNJMr@|)BU{?e9JTD9 zottH5M9*lAil?;|%ns==7!8c;I?<)?=W47Iwb5Hp_)0k^^uNcvPED*mU8y@6zIK^u zy^j7b_t29TPJgN&gBbzzD|6`l>L8up#-Tal#*KJKlpokoxO+WyN9@tWZ$&FlVQzec zUS$?tU+iRQ!NkhS3Z03rXjA<$%}ipLdMdOoG$c4t=4V5Z*Yo0k3oTzqW1OF7acPmZ zBu}&{9xN{{u)4ZR%V#^7>}g|J__}*Gk=7(I`emVd5P}qLp=UIj3HT|(7%mBoIiipIvP{l=#zcOKz;& zFJbb_%OImY%%%bd7c zj9!(FwjheyWFHZGH=4-pl=w&+&HRcy8qNG(GV>c`=GRg1>xfG5s|dFf{5lGLw^9Ee Ve(S=Wo6Y>5Uh~YW;eUr&`wy;ov*`c; diff --git a/public/images/docs.png b/public/images/docs.png new file mode 100644 index 0000000000000000000000000000000000000000..6ea007cf8c64d1424a2d5273b39dc178838109e2 GIT binary patch literal 5653 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 literal 0 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 +$response->send(); +$kernel->terminate($request, $response); diff --git a/robots.txt b/public/robots.txt rename from robots.txt rename to public/robots.txt diff --git a/search/do_xapian_index.sh b/search/do_xapian_index.sh deleted file mode 100755 --- a/search/do_xapian_index.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash - -SCRIPTDIR="$(dirname $0)" -LOGFILE="/home/docs/logs/xapianindex_$(date +%Y%m%d_%H%M).log" - -# Create the directory which holds the indexes -mkdir -p "${SCRIPTDIR}/omegaconf/data/default/" - -make -C "${SCRIPTDIR}/omegaconf/cdb/" &>${LOGFILE} - -${SCRIPTDIR}/kdedocs_indexer.py -v -l /home/docs/docs/languages \ - -d "${SCRIPTDIR}/omegaconf/data/default/" \ - -w /home/docs/website \ - &>${LOGFILE} diff --git a/search/kdedocs_indexer.py b/search/kdedocs_indexer.py deleted file mode 100755 --- a/search/kdedocs_indexer.py +++ /dev/null @@ -1,351 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Copyright 2015-2016 Luigi Toscano -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of -# the License or (at your option) version 3 or any later version -# accepted by the membership of KDE e.V. (or its successor approved -# by the membership of KDE e.V.), which shall act as a proxy -# defined in Section 14 of version 3 of the license. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -import argparse -import hashlib -import logging -import os -import re -import sys -import time -from collections import namedtuple - -from bs4 import BeautifulSoup -import unicodedata -import xapian - -SAMPLESIZE = 512 - -IDX_VAL_LASTMOD = 0 -IDX_VAL_MD5 = 1 -IDX_VAL_SIZE = 2 - -STEMMER_MAP = { - 'da': 'danish', - 'de': 'german', - # de alternative: german2 - 'en': 'english', - 'en_GB': 'english', - # en* alternatives: lovins porter - 'es': 'spanish', - 'fi': 'finnish', - 'fr': 'french', - 'hu': 'hungarian', - 'it': 'italian', - 'nb': 'norwegian', - 'nn': 'norwegian', - 'nl': 'dutch', - # nl alternative: kraaij_pohlmann - 'pt': 'portuguese', - 'pt_BR': 'portuguese', - 'ro': 'romanian', - 'ru': 'russian', - 'sv': 'swedish', - 'tr': 'turkish', -} - -ALL_BRANCHES = ['stable4', 'trunk4', 'stable5', 'trunk5'] - -LOGGER = logging.getLogger(__name__) - -DocDetails = namedtuple('DocDetails', ['content', 'md5', 'path', 'title', - 'mtime', 'size', 'description', - 'keywords', 'application']) - - -def get_normalized_branch(branch): - if branch.startswith('stable'): - return 'stable' - elif branch.startswith('trunk'): - return 'trunk' - else: - return '' - - -def get_stemmer_name(lang): - """ Returns the name of the stemmer for the specified language code. """ - return STEMMER_MAP.get(lang, 'none') - - -def opendb(dbfile): - database = xapian.WritableDatabase(dbfile, xapian.DB_CREATE_OR_OPEN) - indexer = xapian.TermGenerator() - return (database, indexer) - - -def get_doc_details(full_path, file_path_rel): - try: - html_file = open(full_path, 'r') - html_parsed = BeautifulSoup(html_file, "lxml") - except Exception as e: - LOGGER.error("Exception parsing %s: %s" % (full_path, str(e)), - exc_info=True) - return None - - hashf = hashlib.md5() - hashf.update(str(html_parsed)) - docmd5 = hashf.digest() - - dumptxt = ' '.join(html_parsed.findAll(text=True)) - doctxt = unicodedata.normalize('NFKC', dumptxt) - doctitle = html_parsed.title.string - docmtime = int(os.path.getmtime(full_path)) - docsize = os.path.getsize(full_path) - appname = os.path.basename(os.path.dirname(full_path)) - - # description - descriptions = html_parsed.findAll(attrs={"name": "description"}) - if descriptions: - docdescription = descriptions[-1]['content'] - else: - docdescription = doctxt - # keywords: - keywords = html_parsed.findAll(attrs={"name": "keywords"}) - dockeywords = [] - if keywords: - dockeywords = re.split('[,\s]+', keywords[-1]['content']) - - doc_details = DocDetails(doctxt, docmd5, file_path_rel, doctitle, docmtime, - docsize, docdescription, dockeywords, appname) - return doc_details - - -def do_index_file(file_path, file_path_rel, xdb, xidx, language, branch, - normalized_branch): - """ Check a single file and determine whether and how it should be - indexed. - """ - doc_urlterm = 'U%s' % (file_path_rel) - # check if a document with the same U tag already exists - # in the database, and the respective timestamp (mtime) - currdoc_mtime = int(os.path.getmtime(file_path)) - postlist = xdb.postlist(doc_urlterm) - try: - existing_doc_iter = next(postlist) - existing_doc_id = existing_doc_iter.docid - existing_doc = xdb.get_document(existing_doc_id) - existing_doc_lastmod = float(existing_doc.get_value(IDX_VAL_LASTMOD)) - except StopIteration: - existing_doc_id = None - existing_doc_lastmod = None - LOGGER.debug('Looking for existing occurrencies of %s (timestamp %s): ' - 'found %s (timestamp: %s)' % (file_path_rel, currdoc_mtime, - existing_doc_id, - existing_doc_lastmod)) - - if existing_doc_id and (existing_doc_lastmod >= currdoc_mtime): - LOGGER.info('Doc %s already in the db and up-to-date' % (doc_urlterm)) - return - - doc_details = get_doc_details(file_path, file_path_rel) - if not doc_details: - LOGGER.error('Error accessing %s, skipping...' % (file_path)) - - doc = xapian.Document() - - xidx.set_document(doc) - - sample = doc_details.description[0:SAMPLESIZE - 1] - - record_data = [ - 'url=%s' % (doc_details.path), - 'sample=%s' % (sample), - 'type=text/html', - 'modtime=%d' % (doc_details.mtime), - 'size=%d' % (doc_details.size) - ] - if doc_details.title: - record_data.append('caption=%s' % ( - doc_details.title[0:SAMPLESIZE - 1])) - - doc.set_data('\n'.join(record_data)) - - # Index the text of the document and also various additional information - # (title, keywords, file name) - if doc_details.title: - xidx.index_text(doc_details.title, 5) - xidx.increase_termpos(100) - - if doc_details.content: - xidx.index_text(doc_details.content) - - xidx.increase_termpos(100) - # print "keywords: %s" % (' '.join(doc_details.keywords)) - xidx.index_text(' '.join(doc_details.keywords)) - - # the file name with no extension (which is always .html) - xidx.increase_termpos(100) - xidx.index_text(os.path.basename(doc_details.path)[:len('.html')]) - - # add boolean, add values - doc.add_boolean_term('Ttext/html') - - file_timestamp = time.gmtime(doc_details.mtime) - doc.add_boolean_term('D%s' % (time.strftime('%Y%m%d', file_timestamp))) - doc.add_boolean_term('M%s' % (time.strftime('%Y%m', file_timestamp))) - doc.add_boolean_term('Y%s' % (time.strftime('%Y', file_timestamp))) - - # URL/path - doc.add_boolean_term('P/') - doc.add_boolean_term(doc_urlterm) - - # extra details, specifically required for docs.kde.org search - doc.add_boolean_term('L%s' % (language)) - doc.add_boolean_term('XBRANCH%s' % (branch)) - doc.add_boolean_term('XBRANCHGENERIC%s' % (normalized_branch)) - - # used to sort by date - doc.add_value(IDX_VAL_LASTMOD, str(doc_details.mtime)) - - # used to collapse duplicate documents - doc.add_value(IDX_VAL_MD5, str(doc_details.md5)) - - # used to sort by size and for date ranges - doc.add_value(IDX_VAL_SIZE, str(doc_details.size)) - - # Finally, add the document to the database or replace it if already - # existed and it was updated. - if existing_doc_id: - # this means the document exists and its timestamp shows that it - # was updated. - LOGGER.info("Existing doc %s was updated" % (doc_urlterm)) - xdb.replace_document(existing_doc_id, doc) - else: - LOGGER.info("New doc %s was added" % (doc_urlterm)) - # not existing at all, regardless of the timestamp - add it anyway - xdb.add_document(doc) - - -def cleanup_unseen(xdb, seen_files): - # check all indexed documents and remove the ones not in seen_files - LOGGER.info('Looking for removed documents...') - removed_count = 0 - for doc_iter in xdb.postlist(''): - if not doc_iter.docid: - # This should not happen, but... - continue - doc_ref = xdb.get_document(doc_iter.docid) - # if no U term in the document have been seen, remove it - doc_urls = [term.term for term in doc_ref.termlist() - if term.term.startswith('U') and term.term in seen_files] - if len(doc_urls) == 0: - removed_count += 1 - LOGGER.debug('Removing %s (%s)' % (doc_iter.docid, [term.term - for term in doc_ref.termlist() - if term.term.startswith('U')])) - xdb.delete_document(doc_iter.docid) - LOGGER.info('Removed %d documents' % (removed_count)) - - -def do_index(dbfile, startdir, languages_list): - try: - (xdb, xidx) = opendb(dbfile) - - # array of files encountered while searching for html files; all the - # files not in this list after the end of the scan will be removed - # from the index - seen_files = set() - - # all branches, all languages, all html files - for branch in ALL_BRANCHES: - LOGGER.debug('Indexing branch %s' % (branch)) - # list all directories; each directory is a language - branch_dir = os.path.join(startdir, branch) - norm_branch = get_normalized_branch(branch) - all_lang_dirs = [ldir for ldir in os.listdir(branch_dir) - if os.path.isdir(os.path.join(branch_dir, - ldir)) and - (not languages_list or (languages_list and - ldir in languages_list))] - for lang in all_lang_dirs: - LOGGER.debug('Indexing language %s' % (lang)) - xidx.set_stemmer(xapian.Stem(get_stemmer_name(lang))) - lang_dir = os.path.join(branch_dir, lang) - # from here, get all html files and index them with the said - # branch/language if required - for walked_dir, subdirs, files in os.walk(lang_dir): - for found_file in files: - if not found_file.endswith('.html'): - continue - # mark the file as seen, and call the function which - # whether and how the file should be updated - file_path = os.path.join(walked_dir, found_file) - file_path_rel = os.path.join('/', os.path.relpath( - file_path, startdir)) - LOGGER.debug('Inspecting file %s' % (file_path_rel)) - seen_files.add('U%s' % (file_path_rel)) - try: - do_index_file(file_path, file_path_rel, xdb, xidx, - lang, branch, norm_branch) - except Exception as e: - LOGGER.error("Skipping file %s, exception: %s" % - (file_path_rel, str(e)), - exc_info=True) - cleanup_unseen(xdb, seen_files) - xdb.commit() - except Exception as e: - LOGGER.error("Exception: %s" % str(e), exc_info=True) - sys.exit(1) - - -def main(): - parser = argparse.ArgumentParser() - parser.add_argument('-v', '--verbose', action='store_true', default=False, - dest='verbose', help='verbose output') - parser.add_argument('-l', '--languages-file', default='languages', - dest='languages_file', required=True, - help='files containing the list of languages') - parser.add_argument('-d', '--database', default='db', dest='db', - required=True, metavar='DATABASE_DIR', - help='directory containing the Xapian database') - parser.add_argument('-w', '--website', default='website', dest='website', - required=True, metavar='WEBSITE_DIR', - help='website directory containing the documentation') - - args = parser.parse_args() - - # configure the logging system - logging_level = logging.INFO - if args.verbose: - logging_level = logging.DEBUG - logging.basicConfig(level=logging_level, - format='%(asctime)s:%(levelname)s:%(name)s:' - '%(message)s') - - try: - with open(args.languages_file) as lfile: - languages_list = [lang.strip() for lang in lfile] - if 'en' not in languages_list: - languages_list.insert(0, 'en') - except: - raise ValueError('languages file "%s" not found or invalid' % - (args.languages_file)) - languages_list = None - - if not os.path.isdir(args.db): - raise ValueError('%s is not a directory' % (args.db)) - if not os.path.isdir(args.website): - raise ValueError('%s is not a directory' % (args.website)) - do_index(args.db, args.website, languages_list) - - -if __name__ == '__main__': - main() diff --git a/search/omegaconf/README b/search/omegaconf/README deleted file mode 100644 --- a/search/omegaconf/README +++ /dev/null @@ -1,12 +0,0 @@ -This directory contains the configuration files required by omega. - -- omega.conf is used by Apache to configure Omega. It should be specified - in the apache (virtualhost) configuration as: - SetEnv OMEGA_CONFIG_FILE /srv/www/docs.kde.org/omega/omega.conf -- templates/ contains the Omega template used for search results, and few - required files. They all derived from the default templates directory as - shipped by Omega. -- cdb/ contains the source for the cdb files required by the templates. - They must be generated using the cdb utility (tinycdb package), the included - Makefile simplifies the generation. -- data/default will contain the generated indexes. diff --git a/search/omegaconf/cdb/Makefile b/search/omegaconf/cdb/Makefile deleted file mode 100644 --- a/search/omegaconf/cdb/Makefile +++ /dev/null @@ -1,7 +0,0 @@ - -CDB=branches.cdb languages.cdb - -all: ${CDB} - -%.cdb: %.csv - cdb -c -m $@ $< diff --git a/search/omegaconf/cdb/branches.csv b/search/omegaconf/cdb/branches.csv deleted file mode 100644 --- a/search/omegaconf/cdb/branches.csv +++ /dev/null @@ -1,6 +0,0 @@ -stable Released -trunk Development -stable4 Released (kdelibs4) -trunk4 Development (kdelibs4) -stable5 Released (Frameworks 5) -trunk5 Development (Frameworks 5) diff --git a/search/omegaconf/cdb/languages.csv b/search/omegaconf/cdb/languages.csv deleted file mode 100644 --- a/search/omegaconf/cdb/languages.csv +++ /dev/null @@ -1,28 +0,0 @@ -ca Catalan -cs Czech -da Danish -de German -en English -en_GB English UK -el Greek -es Spanish -et Estonian -fr French -gl Galician -hu Hungarian -it Italian -ja Japanese -lt Lituanian -nb Norwegian Bokmål -nl Dutch -nn Norwegian Nynorsk -pl Polish -pt Portuguese -pt_BR Brazilian Portuguese -ro Romanian -ru Russian -sr Serbian -sr@latin Serbian latin -sv Swedish -tr Turkish -uk Ukrainian diff --git a/search/omegaconf/omega.conf b/search/omegaconf/omega.conf deleted file mode 100644 --- a/search/omegaconf/omega.conf +++ /dev/null @@ -1,11 +0,0 @@ -# Directory containing Xapian databases: -database_dir /srv/www/docs.kde.org/omega/data - -# Directory containing OmegaScript templates: -template_dir /srv/www/docs.kde.org/omega/templates - -# Directory to write Omega logs to: -log_dir /srv/www/docs.kde.org/omegalogs - -# Directory containing any cdb files for the $lookup OmegaScript command: -cdb_dir /srv/www/docs.kde.org/omega/cdb diff --git a/search/omegaconf/templates/inc/anyalldropbox b/search/omegaconf/templates/inc/anyalldropbox deleted file mode 100644 --- a/search/omegaconf/templates/inc/anyalldropbox +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/search/omegaconf/templates/inc/anyallradio b/search/omegaconf/templates/inc/anyallradio deleted file mode 100644 --- a/search/omegaconf/templates/inc/anyallradio +++ /dev/null @@ -1,2 +0,0 @@ - Matching any words - Matching all words diff --git a/search/omegaconf/templates/inc/toptermsjs b/search/omegaconf/templates/inc/toptermsjs deleted file mode 100644 --- a/search/omegaconf/templates/inc/toptermsjs +++ /dev/null @@ -1,12 +0,0 @@ - diff --git a/search/omegaconf/templates/query b/search/omegaconf/templates/query deleted file mode 100644 --- a/search/omegaconf/templates/query +++ /dev/null @@ -1,196 +0,0 @@ -$httpheader{Content-Type,text/html; charset=utf-8} -${ $setmap{boolprefix,la,L} -$setmap{boolprefix,branch,XBRANCHGENERIC} } -${ $setmap{prefix,branch,XBRANCHGENERIC} } - -$set{stemmer,none} -$set{flag_spelling,$ne{$cgi{SPELL},0}} -$set{flag_wildcard,1} -$set{thousand,$.}$set{decimal,.}$setmap{BN,,Any Country,uk,England,fr,France} -${ -$def{PREV, -$if{$ne{$topdoc,0},, -} -} - -$def{NEXT, -$if{$ne{$last,$msize},, -} -} - -$def{P,} -$def{PAGE,$if{$gt{$1,9},$if{$gt{$1,99},$P{$1,$div{$1,100}}}$P{$1,$mod{$div{$1,10},10}}}$P{$1,$mod{$1,10}}} - -$def{S,$1} -$def{SPAGE,$if{$gt{$1,9},$if{$gt{$1,99},$S{$1,$div{$1,100}}}$S{$1,$mod{$div{$1,10},10}}}$S{$1,$mod{$1,10}}} -} - -$def{PREV,$if{$ne{$topdoc,0},}} - -$def{PAGE,} - -$def{SPAGE,} - -$def{NEXT,$if{$ne{$last,$msize},}} - - -docs.kde.org - $if{$query,searching: $html{$query},search} -$if{$opt{topterms},$include{inc/toptermsjs}} - - - - - - -
-
- - - -
-$if{true,$include{inc/anyalldropbox},$include{inc/anyallradio}} -- Results per page: $set{hitvalues,$split{10 20 50}} - -
-
-Language: - -Branch: - -
-$if{$opt{topterms}, -
- $map{$topterms,$html{$prettyterm{$_}} } -
-
-} -
-$if{$suggestion,Did you mean: $html{$suggestion}
} -$or{$html{$error}, -$if{$eq{$msize,0}, -$if{$query,No documents match your query, -
Searching $nice{$dbsize} documents -}, -$if{$not{$msizeexact}, - $nice{$add{$topdoc,1}}-$nice{$last} of about $nice{$msize} matches, - $if{$and{$eq{$last,$msize},$eq{$topdoc,0}}, - All $nice{$msize} matches, - $nice{$add{$topdoc,1}}$if{$ne{$add{$topdoc,1},$last},-$nice{$last}} of exactly $nice{$msize} matches} -} -
-
-$list{$map{$queryterms,$list{$html{$uniq{$unstem{$_}}},,/,}: $nice{$freq{$_}}},Term frequencies: ,$. ,} -
Search took $time seconds - -$hitlist{ -${ $set{docurl,$transform{\/(^\/+)/(^\/+)/(^\/+)/(^.+)/(^\/+)$,/index.php?branch=\1&language=\2&application=\4&page=\5,$html{$field{url}}}} } -${ $set{docurl,$transform{\/([^\/]\+)\/([^\/]\+)\/([^\/]\+)\/(.\+)\/([^\/]\+)$,/index.php?branch=\1&language=\2&application=\4&page=\5,$html{$field{url}}}} } -$set{docurl,$transform{/([^/]+)/([^/]+)/([^/]+)/(.+)/([^/]+),/index.php?branch=\1&language=\2&application=\4&path=\5,$html{$field{url}}}} -} -
-${$percentage%} -
-
-
-
-$if{$and{$field{modtime},$ne{$field{modtime},-1}}, - -
-} -$if{$field{language},Language: $html{$field{language}}
} -$if{$field{size},Size: $html{$filesize{$field{size}}}
} -${
- -
} -
-
$html{$or{$field{caption},$field{title},$prettyurl{$field{url}},Untitled}}
-$highlight{$field{sample},$terms}$if{$field{sample},...}
-$opt{docurl}
- -matching: -$list{$map{$terms,$html{$prettyterm{$_}}},$. , and }${for lynx:}

- -
- -${suppress next, prev, and page links if there's only one page} -$if{$ne{$lastpage,1}, -$set{a,$if{$opt{pagelink_height}, HEIGHT=$opt{pagelink_height}}$if{$opt{pagelink_width}, WIDTH=$opt{pagelink_width}}} - -${1-W ... X-(this)-Y ...} -$set{w,$min{3,$add{$thispage,-1}}} -$set{x,$max{$add{$opt{w},1},$add{$thispage,-3}}} -$set{y,$min{$lastpage,$add{$thispage,8}}} -$PREV -$map{$range{1,$opt{w}},$PAGE{$_}} -$if{$ne{$add{$opt{w},1},$opt{x}},...} -$map{$range{$opt{x},$add{$thispage,-1}},$PAGE{$_}} -$SPAGE{$thispage} -$map{$range{$add{$thispage,1},$opt{y}},$PAGE{$_}} -$if{$ne{$opt{y},$lastpage},...} -$NEXT -} -}} -

-$if{$dbname,} -$if{$ne{$topdoc,0},} -$if{$ne{$hitsperpage,10},} -$if{$fmt,} -$if{$cgi{COLLAPSE},} -$if{$queryterms,} - - -$list{$relevants,} -$if{$cgi{THRESHOLD},} -${Preserve any B filters used - this needs modifying if you modify this template - to have B on radio buttons, SELECT, etc} -${ $map{$cgilist{B},} } -
-
- - -$log{query.log} diff --git a/src/Controller/.gitignore b/src/Controller/.gitignore new file mode 100644 diff --git a/src/Controller/MainController.php b/src/Controller/MainController.php new file mode 100644 --- /dev/null +++ b/src/Controller/MainController.php @@ -0,0 +1,312 @@ +render('index.html.twig', [ + 'modules_programs' => GeneratedData::modules_programs, + 'search_form' => $this->createSearchForm()->createView(), + 'all_application_names' => $this->getAllAplicationsName(), + ]); + } + + /** + * @Route("/{_locale}/search", name="search") + * @param string $_locale + * @param Request $request + * @return Response + * @throws \Psr\Cache\InvalidArgumentException + */ + public function searchAction(string $_locale, Request $request): Response + { + // create search form + $search = new Search(); + $form = $this->createForm(SearchBarType::class, $search, [ + 'action' => $this->generateUrl('search'), + ]); + + $form->handleRequest($request); + + if ($form->isSubmitted() && $form->isValid()) { + // do the search with the provided search term + $searchTerm = $search->getSearchTerm(); + $cache = new FilesystemAdapter(); + $searchResult = []; + $searchTermSimpl = str_replace('/', '-', $searchTerm); + $searchResultCache = $cache->getItem('search.' . $searchTermSimpl); + + if (!$searchResultCache->isHit()) { + foreach (GeneratedData::modules_programs as $module => $moduleContent) { + foreach ($moduleContent as $submodule) { + $array = explode('/', $submodule); + $branch_available = GeneratedData::programs_docs[$submodule][$_locale]; + if (count($array) == 1 && stristr(($displayname = StaticAppData::appdisplayname[$submodule]) != null ? $displayname : $submodule, $searchTerm)) { + $searchResult[$module][$submodule] = ["branch" => $branch_available]; + } elseif (count($array) == 2 + && stristr(($displayname = StaticAppData::appdisplayname[$array[1]]) != null ? $displayname : $array[1], $searchTerm)) { + $searchResult[$module][$array[0]][$array[1]] = ["branch" => $branch_available]; + } + } + } + $searchResultCache->set($searchResult); + $cache->save($searchResultCache); + } else { + $searchResult = $searchResultCache->get(); + } + + + return $this->render('search.html.twig', [ + 'lang' => $_locale, + 'search_term' => $search->getSearchTerm(), + 'search_result' => $searchResult, + 'branch_descriptions' => GeneratedData::branch_description, + 'all_application_names' => $this->getAllAplicationsName(), + 'app_display_name' => StaticAppData::appdisplayname, + 'search_form' => $this->createSearchForm()->createView(), + ]); + } + + // no search term provided + // create page with only search form + return $this->render('search.html.twig', [ + 'lang' => $_locale, + 'search_result' => null, + 'search_form' => $this->createSearchForm()->createView(), + ]); + + } + + /** + * @Route("/{_locale}/{module}", name="module", defaults={"_locale": "en"}) + * @param string $_locale + * @param string $module + * @return Response + * @throws \Exception + */ + public function moduleAction(string $_locale, string $module): Response + { + if (!in_array($_locale, GeneratedData::languagelist)) { + throw new \Exception("Language is not supported"); + } + + if (!array_key_exists($module, GeneratedData::modules_programs)) { + throw new \Exception("Module is unknow"); + } + + $submodules = []; + + foreach (GeneratedData::modules_programs[$module] as $submodule) { + $array = explode('/', $submodule); + $branch_available = GeneratedData::programs_docs[$submodule][$_locale]; + if (count($array) == 1) { + $submodules[$submodule] = ["branch" => $branch_available]; + } elseif (count($array) == 2) { + $submodules[$array[0]][$array[1]] = ["branch" => $branch_available]; + } + } + + return $this->render('module.html.twig', [ + 'lang' => $_locale, + 'module' => $module, + 'categories' => $submodules, + 'branch_descriptions' => GeneratedData::branch_description, + 'appdisplayname' => StaticAppData::appdisplayname, + 'search_form' => $this->createSearchForm()->createView(), + 'all_application_names' => $this->getAllAplicationsName(), + ]); + } + + /** + * @return SearchBarType + */ + private function createSearchForm(): Form + { + // create search form + $search = new Search(); + $form = $this->createForm(SearchBarType::class, $search, [ + 'action' => $this->generateUrl('search'), + ]); + return $form; + } + + private function getAllAplicationsName(): string + { + $cache = new FilesystemAdapter(); + $applicationsNameCache = $cache->getItem('applicationsName'); + + if (!$applicationsNameCache->isHit()) { + $applicationsName = []; + foreach (GeneratedData::modules_programs as $module => $moduleContent) { + foreach ($moduleContent as $submodule) { + $array = explode('/', $submodule); + $branch_available = GeneratedData::programs_docs[$submodule]['en']; + if (count($array) == 1) { + $displayname = (StaticAppData::appdisplayname[$submodule] != null ? StaticAppData::appdisplayname[$submodule] : $submodule); + $applicationsName[] = $displayname; + } elseif (count($array) == 2) { + $displayname = (StaticAppData::appdisplayname[$array[1]] != null ? StaticAppData::appdisplayname[$array[1]] : $array[1]); + $applicationsName[] = $displayname; + } + } + } + $applicationsNameString = ''; + foreach ($applicationsName as $name) { + $applicationsNameString .= $name . ', '; + } + $applicationsNameCache->set($applicationsNameString); + $cache->save($applicationsNameCache); + return $applicationsNameString; + } else { + return $applicationsNameCache->get(); + } + + + } + + /** + * Compare branches (priority), used by usort()/uasort() + * @param string $b1 + * @param string $b2 + * @return string + */ + function cmp_branches(string $b1, string $b2): string + { + $base_array = array('trunk5' => 0, 'stable5' => 1, 'trunk4' => 2, 'stable4' => 3); + if (in_array($b1, $base_array) && in_array($b2, $base_array)) { + return $base_array[$b1] - $base_array[$b2]; + } + } + + + /** + * Return the proper package/namespace for the specified application and + * branch, using the knowledge generated by the documentation + * generator. + * @param string $application + * @param string $branch + * @return string + */ + function get_namespace(string $application, string $branch): string + { + if (array_key_exists($application, GeneratedData::programs_multiplemodules)) { + // multiple packages/namespaces: check in the special list of programs_docs + // with multiple modules if there is specific module for the current branch. + foreach (GeneratedData::programs_multiplemodules[$application] as $s_branch => $s_module) { + if ($s_branch == $branch) { + return $s_module; + } + } + } else { + global $modules_programs; + // single module for all branches, find it + foreach ($modules_programs as $module => $module_apps) { + if (in_array($application, $module_apps)) { + return $module; + } + } + } + } + + function build_url(string $application = '', string $package = '', string $lang = '', string $branch = '', string $html_path = ''): string + { + $params = array(); + if (strlen($branch) > 0) + $params[] = "branch=" . $branch; + if (strlen($lang) > 0) + $params[] = "language=" . $lang; + if (strlen($package) > 0) + $params[] = "package=" . $package; + if (strlen($application) > 0) + $params[] = "application=" . $application; + if (strlen($html_path) > 0) + $params[] = "path=" . $html_path; + return "/index.php?" . implode('&', $params); + } + + /** + * Get path to handbook + * @param string $branch + * @param string $lang + * @param string $application + * @param string $html_path + * @return string + */ + function build_path(string $branch = '', string $lang = '', string $application = '', string $html_path = ''): string + { + $package = get_namespace($application, $branch); + return $branch . + "/" . $lang . + "/" . $package . + "/" . $application . + "/" . $html_path; + } + + /** + * Check if translation exist + * @param string $app + * @param string $lang + * @return bool + */ + function language_for_application_exist(string $app, string $lang): bool + { + return (array_key_exists($lang, $this->programs_docs[$app])); + } + + /** + * Check if text exist for the specified branch and language + * @param $app + * @param $lang + * @param $branch + * @return string the branch + */ + function branch_exist($app, $lang, $branch): string + { + // no translations for the specified application in the current language + if (!language_for_application_exist($app, $lang)) { + return ""; + } + // Handle old URL - compatibility with the old schema + $compatibility_branches = array( + "development" => array("trunk5", "trunk4"), + "stable" => array("stable5", "stable4"), + ); + // Search in compatibility branches first + if (array_key_exists($branch, $compatibility_branches)) { + foreach ($compatibility_branches[$branch] as $comp_branch) { + # echo "Looking for $comp_branch into ".var_dump($this->programs_docs[$app][$lang]); + if (in_array($comp_branch, $this->programs_docs[$app][$lang])) { + return $comp_branch; + } + } + } + // Normal branch + if (in_array($branch, $this->programs_docs[$app][$lang])) { + return $branch; + } + return ""; + } +} + diff --git a/src/Data/GeneratedData.php b/src/Data/GeneratedData.php new file mode 100644 --- /dev/null +++ b/src/Data/GeneratedData.php @@ -0,0 +1,876 @@ + + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'kcontrol5/cache' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'kioslave5/mailto' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'kmenuedit' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'kcontrol/kwinscreenedges' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'kcontrol/cursortheme' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'kcontrol/workspaceoptions' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'kcontrol5/cookies' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'kdesu' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'kcontrol/kcmlaunchfeedback' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'kinfocenter' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'kdebugdialog5' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'kcontrol/windowbehaviour' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'kcontrol/clock' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'kcontrol/keys' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'knetattach' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'kcontrol/formats' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'kcontrol/windowspecific' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'kcontrol/solid-device-automounter' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'kcontrol/autostart' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'plasma-desktop' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'kcontrol/kcmaccess' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'kcontrol/screenlocker' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'kcontrol/desktop' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'kcontrol5/proxy' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'systemsettings' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'kioslave5/help/documentationnotfound' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'kioslave5/file' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'kcontrol/translations' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'kcontrol/kcmsmserver' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'kcontrol/kded' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'kcontrol/kcmstyle' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'kcontrol/kwintabbox' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'kcontrol5/filetypes' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'kfontview' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'kcontrol/solid-actions' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'kcontrol/fonts' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'kcontrol/desktopthemedetails' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'kcontrol/baloo' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'kioslave5/help' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'kcontrol/mouse' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'kcontrol/splashscreen' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'kioslave5/webdav' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'kcontrol5/useragent' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'kioslave5/data' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'kcontrol5/webshortcuts' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'kioslave5/telnet' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'kcontrol/kwindecoration' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'kcontrol5/trash' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'kcontrol/colors' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'kcontrol/componentchooser' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'kcontrol/icons' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'ksysguard' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'kcontrol/keyboard' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'kcontrol/emoticons' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'kioslave5/ftp' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'kcontrol/kwineffects' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'kcontrol/plasma-pa' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'kcontrol/paths' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'kcontrol/joystick' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'klipper' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'kcontrol5/smb' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'kcontrol/fontinst' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'kcontrol5/netpref' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'kioslave5/http' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'kcontrol/spellchecking' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'kcontrol/kgamma5' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'kcontrol/powerdevil' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'kcontrol/khotkeys' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'kcontrol/phonon' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), + 'kcontrol5/kcm_ssl' => + array ( + 'ca' => + array ( + 0 => 'trunk5', + ), + 'en' => + array ( + 0 => 'trunk5', + ), + ), +); + const modules_programs = array ( + 'frameworks' => + array ( + 0 => 'kdebugdialog5', + 1 => 'kioslave5/data', + 2 => 'kioslave5/file', + 3 => 'kioslave5/ftp', + 4 => 'kioslave5/help', + 5 => 'kioslave5/help/documentationnotfound', + 6 => 'kioslave5/http', + 7 => 'kioslave5/mailto', + 8 => 'kioslave5/telnet', + 9 => 'kioslave5/webdav', + 10 => 'kcontrol5/cache', + 11 => 'kcontrol5/cookies', + 12 => 'kcontrol5/netpref', + 13 => 'kcontrol5/proxy', + 14 => 'kcontrol5/smb', + 15 => 'kcontrol5/trash', + 16 => 'kcontrol5/useragent', + 17 => 'kcontrol5/webshortcuts', + 18 => 'kcontrol5/kcm_ssl', + ), + 'kde-workspace' => + array ( + 0 => 'kcontrol/autostart', + 1 => 'kcontrol/baloo', + 2 => 'kcontrol/clock', + 3 => 'kcontrol/colors', + 4 => 'kcontrol/componentchooser', + 5 => 'kcontrol/cursortheme', + 6 => 'kcontrol/desktopthemedetails', + 7 => 'kcontrol/emoticons', + 8 => 'kcontrol/fontinst', + 9 => 'kcontrol/fonts', + 10 => 'kcontrol/formats', + 11 => 'kcontrol/icons', + 12 => 'kcontrol/joystick', + 13 => 'kcontrol/kcmaccess', + 14 => 'kcontrol/kcmlaunchfeedback', + 15 => 'kcontrol/kcmnotify', + 16 => 'kcontrol/kcmsmserver', + 17 => 'kcontrol/kcmstyle', + 18 => 'kcontrol/kded', + 19 => 'kcontrol/keyboard', + 20 => 'kcontrol/keys', + 21 => 'kcontrol/mouse', + 22 => 'kcontrol/paths', + 23 => 'kcontrol/phonon', + 24 => 'kcontrol/solid-actions', + 25 => 'kcontrol/solid-device-automounter', + 26 => 'kcontrol/spellchecking', + 27 => 'kcontrol/splashscreen', + 28 => 'kcontrol/translations', + 29 => 'kcontrol/workspaceoptions', + 30 => 'kcontrol/kgamma5', + 31 => 'kcontrol/khotkeys', + 32 => 'kcontrol/desktop', + 33 => 'kcontrol/kwindecoration', + 34 => 'kcontrol/kwinscreenedges', + 35 => 'kcontrol/kwintabbox', + 36 => 'kcontrol/windowbehaviour', + 37 => 'kcontrol/windowspecific', + 38 => 'kcontrol/kwineffects', + 39 => 'kcontrol/screenlocker', + 40 => 'kcontrol/powerdevil', + 41 => 'kcontrol/plasma-pa', + 42 => 'kfontview', + 43 => 'knetattach', + 44 => 'plasma-desktop', + 45 => 'kdesu', + 46 => 'kcontrol5/filetypes', + 47 => 'kinfocenter', + 48 => 'kmenuedit', + 49 => 'ksysguard', + 50 => 'klipper', + 51 => 'systemsettings', + ), +); + const programs_multiplemodules = array ( +); + const languagelist = array ( + 0 => 'en', + 1 => 'ca', +); + const branch_description = array ( + 'stable5' => 'Stable (Frameworks 5)', + 'trunk5' => 'Development (Frameworks 5)', +); +}?> diff --git a/src/Data/StaticAppData.php b/src/Data/StaticAppData.php new file mode 100644 --- /dev/null +++ b/src/Data/StaticAppData.php @@ -0,0 +1,516 @@ + "System Settings Modules", + "kcontrol5" => "System Settings Modules", + "kioslave" => "Kioslaves", + "kioslave5" => "Kioslaves", + + #kdelibs + "sonnet" => "Check Spelling", + "data" => "Data URLs", + "http" => "http/https", + "file" => "file", + "ftp" => "FTP", + "help" => "help", + "mailto" => "mailto", + "rlogin" => "rlogin", + "telnet" => "telnet", + "webdav" => "webdav/webdavs", + + #kdepimlibs + "kresources" => "KDE PIM Resources (deprecated)", + "imap" => "imap", + "ldap" => "ldap", + "mbox" => "mbox", + "nntp" => "nntp", + "pop3" => "pop3", + "sieve" => "sieve", + "smtp" => "smtp", + + #applications + "kdepasswd" => "Password &, User Account", # move to kcontrol, it is a kcm + "kate" => "Kate", + "katepart" => "Kate Part", + "kfind" => "KFind", + "konsole" => "Konsole", + "konqueror" => "Konqueror", + "kwrite" => "KWrite", + "dolphin" => "Dolphin", + "keditbookmarks" => "Bookmark Editor", + + #kde-runtime + "kdebugdialog" => "KDebugDialog", + "kdebugdialog5" => "KDebugDialog", + "knetattach" => "KNetAttach", + "documentationnotfound" => "Documentation not found", + "onlinehelp" => "Online Help", + "khelpcenter" => "KHelpCenter", + "kdesu" => "KDE su", + "fundamentals" => "KDE Fundamentals", + + #kde-runtime kcontrol + "attica" => "Social Desktop", + "bookmarks" => "Bookmarks", + "cache" => "Cache", + "componentchooser" => "Default Applications", + "cookies" => "Cookies", + "ebrowsing" => "Web Shortcuts", + "emoticons" => "Emoticons", + "filemanager" => "File Management", + "filetypes" => "File Associations", + "formats" => "Formats", + "history" => "History", + "icons" => "Icons", + "kcmcgi" => "CGI Script", + "kcmcss" => "Appearance", + "kcmlaunchfeedback" => "Launch Feedback", + "kcmnotify" => "System Notification", + "kcm_ssl" => "SSL Preferences", + "kded" => "Service Manager", + "khtml-adblock" => "AdBlocK Filters", + "khtml-behavior" => "Web Browsing", + "khtml-general" => "General Konqueror Behavior", + "khtml-java-js" => "Java and JavaScript", + "khtml-plugins" => "Browser Plugins", + "kwineffects" => "Desktop Effects", + "language" => "Country/Region & Language", + "nepomuk" => "Desktop Search", + "netpref" => "Connection Preferences", + "performance" => "Performance", + "phonon" => "Audio and Video Settings", + "proxy" => "Proxy", + "smb" => "Windows Shares", + "solid-device-automounter" => "Removable Devices", + "spellchecking" => "Spell Checker", + "translations" => "Translations", + "trash" => "Trash", + "useragent" => "Browser Identification", + + #kde-runtime kioslaves + "bookmarks" => "bookmarks", + "bzip2" => "bzip2 / bzip", + "cgi" => "cgi", + "finger" => "finger", + "fish" => "fish", + "floppy" => "Floppy", + "gzip" => "gzip", + "info" => "Info", + "man" => "Man", + "nepomuksearch" => "nepomuksearch", + "network" => "network", + "nfs" => "nfs", + "sftp" => "sftp", + "smb" => "SMB", + "tar" => "tar", + "thumbnail" => "thumbnail", + "xz" => "xz / lzma", + + #kde-workspace + "plasma-desktop" => "Plasma Manual", + "plasma-pa" => "Audio Volume", + "systemsettings" => "System Settings", + "kfontview" => "Font Viewer", + "klipper" => "Klipper", + "kdm" => "KDM Login Manager", + "kinfocenter" => "KDE Info Center", + "kmenuedit" => "KDE Menu Editor", + "ksysguard" => "System Monitor", + "PolicyKit-kde" => "PolicyKit-kde", + #kde-workspace kcontrol + "autostart" => "Autostart", + "baloo" => "File Search Settings", + "bell" => "System Bell", + "clock" => "Date & Time", + "colors" => "Colors", + "cursortheme" => "Cursor Theme", + "desktop" => "Virtual Desktops", + "desktopthemedetails" => "Desktop Themes", + "fontinst" => "Font Management", + "fonts" => "Fonts", + "joystick" => "Joystick", + "kcmaccess" => "Accessibility", + "kcmsmserver" => "Session Management", + "kcmstyle" => "Style", + "keyboard" => "Keyboard", + "keys" => "Shortcuts", + "kgamma5" => "Monitor Gamma", + "khotkeys" => "Custom Shortcuts", + "kwincompositing" => "Desktop Effects", + "kwindecoration" => "Window Decorations", + "kwinscreenedges" => "Screen Edges", + "kwintabbox" => "Task Switcher", + "mouse" => "Mouse", + "paths" => "Paths", + "powerdevil" => "Power Management", + "screenlocker" => "Screen Locker", + "screensaver" => "Screen Locker", + "solid-actions" => "Device Actions", + "solid-hardware" => "Information Sources", + "splashscreen" => "Splash Screen", + "webshortcuts" => "Web Shortcuts", + "windowbehaviour" => "Window Behavior", + "windowspecific" => "Window Rules", + "workspaceoptions" => "Workspace", + + #kdeaccessibility/ + "jovie" => "Jovie", + "kmag" => "KMagnifier", + "kmousetool" => "KMouseTool", + "kmouth" => "KMouth", + + #kdeadmin/ + "kcron" => "Task Scheduler", # move to kcontrol, it is a kcm + "ksystemlog" => "KSystemLog", + "kuser" => "KUser", + + #kdeedu + "artikulate" => "Artikulate", + "blinken" => "Blinken", + "cantor" => "Cantor", + "kalgebra" => "KAlgebra", + "kalzium" => "Kalzium", + "kanagram" => "Kanagram", + "kbruch" => "KBruch", + "kgeography" => "KGeography", + "khangman" => "KHangMan", + "kig" => "Kig", + "kiten" => "Kiten", + "klettres" => "KLettres", + "kmplot" => "KmPlot", + "kstars" => "KStars", + "ktouch" => "KTouch", + "kturtle" => "KTurtle", + "kwordquiz" => "KWordQuiz", + "marble" => "Marble", + "minuet" => "Minuet", + "pairseditor" => "Pairs Editor", + "parley" => "Parley", + "rocs" => "Rocs", + "step" => "Step", + + #kdegames + "bomber" => "Bomber", + "bovo" => "Bovo", + "granatier" => "Granatier", + "kajongg" => "Kajongg", + "kapman" => "Kapman", + "katomic" => "KAtomic", + "knavalbattle" => "Naval Battle", + "kblackbox" => "KBlackbox", + "kblocks" => "KBlocks", + "kbounce" => "KBounce", + "kbreakout" => "KBreakout", + "kdiamond" => "KDiamond", + "kfourinline" => "KFourInLine", + "kgoldrunner" => "KGoldrunner", + "kigo" => "Kigo", + "killbots" => "Killbots", + "kiriki" => "Kiriki", + "kjumpingcube" => "KJumpingCube", + "klickety" => "Klickety", + "knights" => "Knights", + "klines" => "Kolor Lines", + "kmahjongg" => "KMahjongg", + "kmines" => "KMines", + "knetwalk" => "KNetwalk", + "kolf" => "Kolf", + "kollision" => "Kollision", + "konquest" => "Konquest", + "kpat" => "KPatience", + "kreversi" => "KReversi", + "kshisen" => "Shisen-Sho", + "ksirk" => "KSirk", + "kspaceduel" => "KSpaceDuel", + "ksquares" => "KSquares", + "ksudoku" => "KSudoku", + "ktron" => "KSnakeDuel", + "ktuberling" => "KTuberling", + "kubrick" => "Kubrick", + "lskat" => "LSkat", + "palapeli" => "Palapeli", + "picmi" => "Picmi", + + #kdegraphics + "gwenview" => "Gwenview", + "kolourpaint" => "KolourPaint", + "kruler" => "KRuler", + "ksnapshot" => "KSnapshot", + "okular" => "Okular", + "spectacle" => "Spectacle", + + #kdegraphics kcontrol + "kamera" => "Digital Camera", + "kgamma" => "Monitor Gamma", + + #kdemultimedia + "dragonplayer" => "Dragon Player", + "juk" => "JuK", + "kdenlive" => "Kdenlive", + "kmix" => "KMix", + "kwave" => "Kwave", + + #kdemultimedia kcontrol + "cddbretrieval" => "CDDB Retrieval", + "cddbretrieval5" => "CDDB Retrieval", + + #kdemultimedia kioslave + "audiocd" => "audiocd", + + #kdenetwork + "kget" => "KGet", + "kopete" => "Kopete", + "kppp" => "KPPP", + "krdc" => "KRDC", + "krfb" => "Desktop Sharing", + "recentdocuments" => "Recent Documents", + + #kdepim + "akonadi_archivemail_agent" => "Archive Mail Agent", + "akonadi_followupreminder_agent" => "Follow Up Reminder Agent", + "akonadi_folderarchive_agent" => "Folder Archive Agent", + "akonadi_notes_agent" => "Notes Agent", + "akonadi_sendlater_agent" => "Send Later Agent", + "akregator" => "Akregator", + "blogilo" => "Blogilo", + "contactthemeeditor" => "Contact Theme Editor", + "headerthemeeditor" => "Header Theme Editor", + "importwizard" => "Import Wizard", + "kabcclient" => "KABC-Client", + "kalarm" => "KAlarm", + "kjots" => "KJots", + "kleopatra" => "Kleopatra", + "kmail" => "KMail", + "kmail2" => "KMail", + "kmailcvt" => "KMailCVT", + "knode" => "KNode", + "knotes" => "KNotes", + "konsolekalendar" => "KonsoleKalendar", + "kontact" => "Kontact", + "kontact-admin" => "Kontact Administrator's Guide", + "korganizer" => "KOrganizer", + "ktimetracker" => "KTimeTracker", + "ktnef" => "KTnef", + "kwatchgnupg" => "KWatchGnuPG", + "pimsettingexporter" => "PIM Setting Exporter", + "sieveeditor" => "Sieve Script Editor", + + #kdepim kioslave + "news" => "news", + #kdesdk + + "cervisia" => "Cervisia", + "kapptemplate" => "KAppTemplate", + "kcachegrind" => "KCachegrind", + "kompare" => "Kompare", + "lokalize" => "Lokalize", + "okteta" => "Okteta", + "umbrello" => "Umbrello", + + #kdetoys + "amor" => "Amor", + "kteatime" => "KTeatime", + + #kdeutils + "ark" => "Ark", + "filelight" => "Filelight", + "kbackup" => "KBackup", + "kcalc" => "KCalc", + "kcharselect" => "KCharSelect", + "kdf" => "KDiskFree", + "kfloppy" => "KFloppy", + "kgpg" => "KGpg", + "ktimer" => "KTimer", + "kwallet" => "KWallet", + "kwallet5" => "KWallet", + "kwalletmanager" => "KWallet Manager", + "sweeper" => "Sweeper", + + #kdeutils kcontrol + "blockdevices" => "Block Devices", + "kremotecontrol" => "Remote Control", + + #kdewebdev + "kfilereplace" => "KFileReplace", + "kimagemapeditor" => "KImageMapEditor", + "klinkstatus" => "KLinkStatus", + + #calligra + "sheets" => "Calligra Sheets", + "calligra" => "Calligra", + "kexi" => "Kexi", + "stage" => "Calligra Stage", + + #extragear-accessibility + "afaras" => "Afaras", + "ssc" => "Sample Acquisition Tool", + "sscd" => "Sample Acquisition Tool Daemon", + "simond" => "Simon Daemon", + "simon" => "Simon Speech Recognition Tool", + "sam" => "Simon Accoustic Model Manager", + "ksimond" => "Simon Daemon Frontend", + + #extragear-base kcontrol + "wacomtablet" => "KCM Tablet", + + #extragear-edu + "gcompris" => "GCompris Administration", + "labplot2" => "LabPlot", + + #extragear-games + + #extragear-graphics + "digikam" => "digiKam", + "kcoloredit" => "KColorEdit", + "kgraphviewer" => "KGraphViewer", + "kiconedit" => "KIconEdit", + "kipi-plugins" => "Kipi Plugins", + "kphotoalbum" => "KPhotoAlbum", + "kpovmodeler" => "KPovModeler", + "kuickshow" => "KuickShow", + "kxstitch" => "KXStitch", + "showfoto" => "Showfoto", + "skanlite" => "Skanlite", + "SymbolEditor" => "SymbolEditor", + + #extragear-kdevelop + "kdevelop" => "KDevelop", + + #extragear-multimedia + "amarok" => "Amarok", + "k3b" => "K3b", + "kaffeine" => "Kaffeine", + "kamoso" => "Kamoso", + "kaudiocreator" => "KAudioCreator", + "kmid" => "KMid", + "kmplayer" => "KMPlayer", + "kplayer" => "KPlayer", + + #extragear-network + "choqok" => "Choqok", + "kopete-cryptography" => "Cryptography Plugin", + "rekonq" => "rekonq", + "konversation" => "Konversation", + "ktorrent" => "KTorrent", + "smb4k" => "Smb4K", + + #extragear-network kioslave + "gopher" => "gopher", + "gdrive" => "gdrive", + + #extragear-office + "kbibtex" => "KBibTeX", + "kile" => "Kile", + "kmymoney" => "KMyMoney", + "skrooge" => "Skrooge", + "tellico" => "Tellico", + + #extragear-pim + "ksig" => "KSig", + "trojita" => "Trojita", + + #extragear-sdk + "xsldbg" => "xsldbg", + "kxsldbg" => "KXSLDbg", + + #extragear-sysadmin + "partitionmanager" => "Partition Manager", + "kiosktool" => "KIOSK Admin Tool", + + #extragear-utils + "katimon" => "Katimon", + "kdesrc-build" => "kdesrc-build Script", + "keurocalc" => "KEuroCalc", + "kpager" => "KPager", + "krecipes" => "Krecipes", + "kronometer" => "Kronometer", + "krusader" => "Krusader", + "nepomukshell" => "Nepomuk Shell", + "rsibreak" => "RSIBreak", + "kdiff3" => "KDiff3", + "kdots" => "KDots", + "kpeg" => "KPeg", + "rkward" => "RKWard", + "rkwardplugins" => "RKWard Plugins", + ]; + + const package_no_application_array = array("kdepimlibs", "kdepim-runtime"); +} + +?> diff --git a/src/Entity/.gitignore b/src/Entity/.gitignore new file mode 100644 diff --git a/src/Entity/Search.php b/src/Entity/Search.php new file mode 100644 --- /dev/null +++ b/src/Entity/Search.php @@ -0,0 +1,26 @@ +searchTerm; + } + + /** + * @param string|null $search + */ + public function setSearchTerm(?string $search): void + { + $this->searchTerm = $search; + } +} + + diff --git a/src/Form/SearchBarType.php b/src/Form/SearchBarType.php new file mode 100644 --- /dev/null +++ b/src/Form/SearchBarType.php @@ -0,0 +1,24 @@ +add('search_term', SearchType::class) + ->add('Search', SubmitType::class) + ; + } +} \ No newline at end of file diff --git a/src/Kernel.php b/src/Kernel.php new file mode 100644 --- /dev/null +++ b/src/Kernel.php @@ -0,0 +1,58 @@ +getProjectDir().'/var/cache/'.$this->environment; + } + + public function getLogDir() + { + return $this->getProjectDir().'/var/log'; + } + + public function registerBundles() + { + $contents = require $this->getProjectDir().'/config/bundles.php'; + foreach ($contents as $class => $envs) { + if ($envs[$this->environment] ?? $envs['all'] ?? false) { + yield new $class(); + } + } + } + + protected function configureContainer(ContainerBuilder $container, LoaderInterface $loader) + { + $container->addResource(new FileResource($this->getProjectDir().'/config/bundles.php')); + $container->setParameter('container.dumper.inline_class_loader', true); + $confDir = $this->getProjectDir().'/config'; + + $loader->load($confDir.'/{packages}/*'.self::CONFIG_EXTS, 'glob'); + $loader->load($confDir.'/{packages}/'.$this->environment.'/**/*'.self::CONFIG_EXTS, 'glob'); + $loader->load($confDir.'/{services}'.self::CONFIG_EXTS, 'glob'); + $loader->load($confDir.'/{services}_'.$this->environment.self::CONFIG_EXTS, 'glob'); + } + + protected function configureRoutes(RouteCollectionBuilder $routes) + { + $confDir = $this->getProjectDir().'/config'; + + $routes->import($confDir.'/{routes}/*'.self::CONFIG_EXTS, '/', 'glob'); + $routes->import($confDir.'/{routes}/'.$this->environment.'/**/*'.self::CONFIG_EXTS, '/', 'glob'); + $routes->import($confDir.'/{routes}'.self::CONFIG_EXTS, '/', 'glob'); + } +} diff --git a/src/Migrations/.gitignore b/src/Migrations/.gitignore new file mode 100644 diff --git a/src/Repository/.gitignore b/src/Repository/.gitignore new file mode 100644 diff --git a/styles/darkbackground.css b/styles/darkbackground.css deleted file mode 100644 --- a/styles/darkbackground.css +++ /dev/null @@ -1,273 +0,0 @@ -/** - * based on code by Sebastian Faubel - * modified by Christoph Cullmann and Olaf Schmidt - */ - -/* common (X)HTML formats */ - -body { -font-size: 100%; -line-height: 1.2em; /* Note: it is inherited as is, not recalculated! */ -background-color: #000022; -color: white; -font-family: sans-serif; -padding: 0; -margin: 0; -} - -table, td, th { -font-family: sans-serif; -padding: 0; -margin: 0; -text-align: left; -background-color: black; -} - -input, select { -font-size: 0.8em; -line-height: 1em; -} - -form { -margin: 0; -padding: 0; -} - -optgroup { -font-style: normal; -} - -a:link { -color: #CCCCFF; -text-decoration: underline; -} - -a:visited { -color: #FFCCFF; -text-decoration: underline; -} - -a:hover { -text-decoration: underline; -} - -/* navigation header, this is the combined area with logo and section links */ - -#nav_header_top { -text-align: right; -} - -#nav_header_bottom { -clear: left; -padding: 0.3em; -background-color: black; -text-align: left; -} - -#nav_header_logo, #nav_header_logo_right { -display: none; -} - -/* title text */ -#nav_header_title { -float: left; -font-size: 2em; -line-height: 1.4em; -padding-left: 0.2em; -} - -/* location combo */ -#nav_header_location { -} - -/* location URL */ -#nav_header_bottom_left { -vertical-align: middle; - -font-size: 0.8em; -line-height: 1.1em; -} - -/* place for the links to contact, sitemap, ... s*/ -#nav_header_bottom_right { -float: right; -vertical-align: middle; - -font-size: 0.8em; -line-height: 1.1em; -} - -/* main color definitions */ - -.menuheader { -height: 0; -line-height: 0; -margin: 0; -padding: 0; -font-size: 0; -} - -#leftmenu, #rightmenu { -width: 20%; -} - -#leftmenu h2, #rightmenu h2 { -font-size: 1em; -padding-left: 1em; -vertical-align: middle; -background-color: #000022; -color: white; -margin-top: 0; -} - -#rightmenu h3 { -padding: 0.3em 0.8em; -font-size: 1em; -} - -#leftmenu ul, #rightmenu ul { -margin: 0; -padding-left: 0.5em; -padding-bottom: 1em; -} - -#leftmenu ul { -list-style-type: none; -} - -#rightmenu ul { -list-style-type: none; -} - -#leftmenu li, #rightmenu li { -font-size: 0.8em; -} - -#leftmenu li { -margin-left: 1em; -} - -#rightmenu li { -margin-left: 1.5em; -} - -#leftmenu ul ul, #rightmenu ul ul { -margin: 0; -padding-left: 0; -} - -#leftmenu li li, #rightmenu li li{ -font-size: 0.8em; -margin-left: 2em; -list-style-type: square; -} - -/** - * page footer - */ - -/* background + border at top */ -#footer { -background-color: #000022; -} - -/* footer text stuff + image */ -#footer_text { -display: none; -} - -/* classes */ - -/* static IDs, ordered top to bottom */ - -#content { -border: 1px solid white; -padding: 0em 0.7em 1.5em 0.7em; -text-align: justify; -background-color: black; -} - -#content td, #content th { -font-family: sans-serif; -padding: 0.25em; -margin: 0; -text-align: left; -} - -#content h4, #content h3, #content h2, #content h1 { -text-align: left; -line-height: 1em; /* without this lines stick in each other for headings */ -} - -#quicklinks { -font-size: 1em; -text-align: center; -margin-top: 1em; -margin-left: 0.5em; -margin-bottom: 0.5em; -margin-right: 0.5em; -} - -.menu_box { -background-color: black; -} - -#search { -text-align: center; -padding: 0.2em 0.2em 0.2em 0.2em; -} - -#search label { -display: none; -} - -#search input, #search select { -width: 95%; -margin-bottom: 2px; -} - -#hotspot { -font-size: 0.8em; -line-height: 1em; -text-align: center; -padding: 0 0 0.8em 0; -} - -#rightmenu h3 { -margin-bottom: 0; -} - -.newsbox1 { -background-color: #000022; -margin-top: 1em; -margin-bottom: 0.5em; -} - -.newsbox2 { -background-color: black; -margin-top: 1em; -margin-bottom: 0.5em -} - -/* common style for tables used in the page */ -.table_box { -background-color: #000022; -border: 0; -padding: 0; -margin: 0; -border-spacing: 0; -} - -.table_box th { -background-color: #000022; -color: white; -} - -/* hidden stuff */ -.doNotDisplay { -display: none; -} - -@media aural { .doNotDisplay { -display: inline; -}} diff --git a/styles/print-rtl.css b/styles/print-rtl.css deleted file mode 100644 --- a/styles/print-rtl.css +++ /dev/null @@ -1,63 +0,0 @@ -/** - * based on code by Sebastian Faubel - * modified by Christoph Cullmann - */ - -/* common (X)HTML formats */ - -body { -background-color: white; -color: black; -font-family: sans-serif; -padding: 0; -margin: 0; -} - -table, td, th { -font-family: sans-serif; -line-height: 1em; -padding: 0; -margin: 0; -text-align: left; -} - -input, select, textarea { -font-family: sans-serif; -} - -optgroup { -font-style: normal; -} - -a:link { -color: #036; -} - -a:visited { -color: #555AAA; -} - -/* main color definitions */ - -.invisible, #nav_header_logo, #nav_header_location, #nav_header_bottom, #footer, .menuheader, #leftmenu, #rightmenu, #leftmenu h2, #leftmenu ul, #search { -display: none; -width: 0; -overflow: hidden; -} - -#content { -background-color: white; -text-align: justify; -line-height: 1.5em; -background-color: white; -padding-right: 2em; -} - -/* static IDs, ordered top to bottom */ - -/* div { border: 1px solid black; } */ - -/* hidden stuff */ -.doNotDisplay { - display: none; -} \ No newline at end of file diff --git a/styles/print.css b/styles/print.css deleted file mode 100644 --- a/styles/print.css +++ /dev/null @@ -1,63 +0,0 @@ -/** - * based on code by Sebastian Faubel - * modified by Christoph Cullmann - */ - -/* common (X)HTML formats */ - -body { -background-color: white; -color: black; -font-family: sans-serif; -padding: 0; -margin: 0; -} - -table, td, th { -font-family: sans-serif; -line-height: 1em; -padding: 0; -margin: 0; -text-align: left; -} - -input, select, textarea { -font-family: sans-serif; -} - -optgroup { -font-style: normal; -} - -a:link { -color: #036; -} - -a:visited { -color: #555AAA; -} - -/* main color definitions */ - -.invisible, #nav_header_logo, #nav_header_location, #nav_header_bottom, #footer, .menuheader, #leftmenu, #rightmenu, #leftmenu h2, #leftmenu ul, #search, #footer { -display: none; -width: 0; -overflow: hidden; -} - -#content { -background-color: white; -text-align: justify; -line-height: 1.5em; -background-color: white; -padding-right: 2em; -} - -/* static IDs, ordered top to bottom */ - -/* div { border: 1px solid black; } */ - -/* hidden stuff */ -.doNotDisplay { - display: none; -} \ No newline at end of file diff --git a/styles/standard-rtl.css b/styles/standard-rtl.css deleted file mode 100644 --- a/styles/standard-rtl.css +++ /dev/null @@ -1,360 +0,0 @@ -/** - * based on code by Sebastian Faubel - * modified by Christoph Cullmann and Olaf Schmidt - */ - -/* common (X)HTML formats */ - -body { -font-size: 100%; -line-height: 1.2em; /* Note: it is inherited as is, not recalculated! */ -background-color: white; -color: black; -font-family: sans-serif; -padding: 0; -margin: 0; -} - -table, td, th { -font-family: sans-serif; -padding: 0; -margin: 0; -} - -input, select { -font-size: 0.8em; -line-height: 1em; -} - -form { -margin: 0; -padding: 0; -} - -optgroup { -font-style: normal; -} - -a:link { -color: #0000C0; -text-decoration: none; -} - -a:visited { -color: #800080; -text-decoration: none; -} - -a:hover { -text-decoration: underline; -} - -/* navigation header, this is the combined area with logo and section links */ - -#nav_header_top { -height: 52px; -background-color: #418ade; -border-bottom: 1px solid #000000; -} - -#nav_header_bottom { -padding: 6px 6px 6px 84px; -background-color: #dfe7f3; -border-bottom: 1px solid #000000; -} - -#nav_header_logo { -float: left; -padding: 10px; -} - -#nav_header_logo a img { -width: 64px; -height: 64px; -} - -#nav_header_logo_right { -float: right; -padding: 10px; -} - -/* title text */ -#nav_header_title { -position: absolute; -top: 12px; -left: 86px; -border: 0px; -font-size: 32px; -font-weight: bold; -color: white; -white-space: nowrap; - -line-height: 36px; -} - -/* location combo */ -#nav_header_location { -position: absolute; -top: 12px; -right: 8px; -border: 0px; -color: #444; -vertical-align: middle; -white-space: nowrap; - -font-size: 14px; -} - -/* location URL */ -#nav_header_bottom_left { -vertical-align: middle; - -font-size: 0.8em; -line-height: 1.1em; -} - -/* place for the links to contact, sitemap, ... s*/ -#nav_header_bottom_right { -float: left; -vertical-align: middle; - -font-size: 0.8em; -line-height: 1.1em; -} - -/* main color definitions */ - -.menuheader { -height: 0; -line-height: 0; -margin: 0; -padding: 0; -font-size: 0; -} - -#leftmenu, #rightmenu { -width: 20%; -} - -#leftmenu h2, #rightmenu h2 { -font-size: 1em; -padding-right: 1em; -vertical-align: middle; -background-color: #418ade; -border-top: 0.3em solid #418ade; -border-bottom: 0.3em solid #418ade; -color: white; -margin-top: 0; -} - -#rightmenu h3 { -padding: 0.3em 0.8em; -font-size: 1em; -margin-bottom: 0; -} - -#leftmenu ul, #rightmenu ul { -margin: 0; -padding-right: 0.5em; -padding-bottom: 1em; -} - -#leftmenu ul { -list-style-type: none; -} - -#rightmenu ul { -list-style-type: none; -} - -#leftmenu li, #rightmenu li { -font-size: 0.8em; -} - -#leftmenu li { -margin-right: 1em; -} - -#rightmenu li { -margin-right: 1.5em; -} - -#leftmenu ul ul, #rightmenu ul ul { -margin: 0; -padding-right: 0; -} - -#leftmenu li li, #rightmenu li li { -font-size: 0.8em; -margin-right: 2em; -} - -li.here a:link, li.here a:visited, li.here li.here a:link, li.here li.here a:visited { -text-decoration: underline; -} - -li.here li a:link, li.here li a:visited { -text-decoration: none; -} - -li.here a:hover, li.here li a:hover, li.here li.here a:hover { -text-decoration: underline; -} - -/** - * page footer - */ - -/* background + border at top */ -#footer { -border-top: 1px solid #000000; -background-image: url(../images/footer_bg.png); -background-repeat: repeat-x; -background-position: bottom left; -width: 100%; -height: 100px; -} - -/* left footer, contains the text */ -#footer_text { -left: 0px; -text-align: right; -padding: 0em 1.5em 0em 1.5em; -clear: both; -background-image: url(../images/footer_left.png); -background-repeat: no-repeat; -background-position: bottom left; -width: 100%; -height: 100px; -bottom:0px; -} - -/* classes */ - -#main, #content { -clear: both; -} - -#content { -background-color: white; -padding: 0.5em 0.7em 1.5em 0.7em; -text-align: justify; -} - -#content td, #content th { -font-family: sans-serif; -padding: 0.25em; -margin: 0; -text-align: left; -} - -#content h4, #content h3, #content h2, #content h1 { -color: #418ade; -line-height: 1em; /* without this lines stick in each other for headings */ -} - -#quicklinks { -background-color: #E6F0F9; -font-size: 1em; -padding: 1em; -text-align: center; -margin-top: 1em; -margin-left: 0.5em; -margin-bottom: 0.5em; -margin-right: 0.5em; -} - -#leftmenu, #rightmenu { -background-color: white; -color: #036; -} - -.menu_box { -border-top: 8px solid white; -border-right: 8px solid white; -border-left: 8px solid white; - -background-color: #dfe7f3; -} - -#search { -text-align: center; -padding: 0.2em 0.2em 0.2em 0.2em; -} - -#search label { -display: none; -} - -#search input, #search select { -width: 95%; -margin-bottom: 2px; -} - -#hotspot { -font-size: 0.8em; -line-height: 1em; -text-align: center; -padding: 0 0 0.8em 0; -} - -.newsbox1 { -background-color: #E6F0F9; -margin-top: 1em; -margin-bottom: 0.5em; -} - -.newsbox2 { -background-color: white; -margin-top: 1em; -margin-bottom: 0.5em -} - -/* common style for tables used in the page */ -.table_box { -background-color: #dfe7f3; -border: 0; -padding: 0; -margin: 0; -border-spacing: 0; -} - -.table_box th { -background-color: #418ade; -color: white; -} - -/* needed for edu.kde.org */ -.contentheader, #content h4.contentheader { -font-size: 1em; -font-weight: bold; -line-height: 1.2em; -padding: 0.1em 0 0.2em 1em; -vertical-align: middle; -background-color: #418ade; -color: white; -margin: 0; -} - -/* Very common pattern on developer.kde.org: a list of links - to other pages with a brief italicized description below the link. - Can be created with
  • link

  • */ - -ul.linklist p { - font-size: small; - font-style: italic; -} - -ul.linklist p em { - font-style: normal; - font-weight: bold; -} - -/* hidden stuff */ -.doNotDisplay { -display: none; -} - -@media aural { .doNotDisplay { -display: inline; -}} diff --git a/styles/standard.css b/styles/standard.css deleted file mode 100644 --- a/styles/standard.css +++ /dev/null @@ -1,368 +0,0 @@ -/** - * based on code by Sebastian Faubel - * modified by Christoph Cullmann and Olaf Schmidt - */ - -/* common (X)HTML formats */ - -body { -font-size: 100%; -line-height: 1.2em; /* Note: it is inherited as is, not recalculated! */ -background-color: white; -color: black; -font-family: sans-serif; -padding: 0; -margin: 0; -} - -table, td, th { -font-family: sans-serif; -padding: 0; -margin: 0; -text-align: left; -} - -input, select { -font-size: 0.8em; -line-height: 1em; -} - -form { -margin: 0; -padding: 0; -} - -optgroup { -font-style: normal; -} - -a:link { -color: #0000C0; -text-decoration: none; -} - -a:visited { -color: #800080; -text-decoration: none; -} - -a:hover { -text-decoration: underline; -} - -/* navigation header, this is the combined area with logo and section links */ - -#nav_header_top { -height: 52px; - -text-align: right; - -background-color: #418ade; -border-bottom: 1px solid #000000; -} - -#nav_header_bottom { -padding: 6px 6px 6px 84px; -background-color: #dfe7f3; -border-bottom: 1px solid #000000; - -text-align: left; -} - -#nav_header_logo { -float: left; -padding: 10px; -} - -#nav_header_logo a img { -width: 64px; -height: 64px; -} - -#nav_header_logo_right { -float: right; -padding: 10px; -} - -/* title text */ -#nav_header_title { -position: absolute; -top: 12px; -left: 86px; -border: 0px; -font-size: 32px; -font-weight: bold; -color: white; -white-space: nowrap; - -line-height: 36px; -} - -/* location combo */ -#nav_header_location { -position: absolute; -top: 12px; -right: 8px; -border: 0px; -color: #444; -vertical-align: middle; -white-space: nowrap; - -font-size: 14px; -} - -/* location URL */ -#nav_header_bottom_left { -vertical-align: middle; - -font-size: 0.8em; -line-height: 1.1em; -} - -/* place for the links to contact, sitemap, ... s*/ -#nav_header_bottom_right { -float: right; -vertical-align: middle; - -font-size: 0.8em; -line-height: 1.1em; -} - -/* main color definitions */ - -.menuheader { -height: 0; -line-height: 0; -margin: 0; -padding: 0; -font-size: 0; -} - -#leftmenu, #rightmenu { -width: 20%; -} - -#leftmenu h2, #rightmenu h2 { -font-size: 1em; -padding-left: 1em; -vertical-align: middle; -background-color: #418ade; -border-top: 0.3em solid #418ade; -border-bottom: 0.3em solid #418ade; -color: white; -margin-top: 0; -} - -#rightmenu h3 { -padding: 0.3em 0.8em; -font-size: 1em; -margin-bottom: 0; -} - -#leftmenu ul, #rightmenu ul { -margin: 0; -padding-left: 0.5em; -padding-bottom: 1em; -} - -#leftmenu ul { -list-style-type: none; -} - -#rightmenu ul { -list-style-type: none; -} - -#leftmenu li, #rightmenu li { -font-size: 0.8em; -} - -#leftmenu li { -margin-left: 1em; -} - -#rightmenu li { -margin-left: 1.5em; -} - -#leftmenu ul ul, #rightmenu ul ul { -margin: 0; -padding-left: 0; -} - -#leftmenu li li, #rightmenu li li { -font-size: 0.8em; -margin-left: 2em; -} - -li.here a:link, li.here a:visited, li.here li.here a:link, li.here li.here a:visited { -text-decoration: underline; -} - -li.here li a:link, li.here li a:visited { -text-decoration: none; -} - -li.here a:hover, li.here li a:hover, li.here li.here a:hover { -text-decoration: underline; -} - -/** - * page footer - */ - -/* background + border at top */ -#footer { -border-top: 1px solid #000000; -background-image: url(../images/footer_bg.png); -background-repeat: repeat-x; -background-position: bottom left; -width: 100%; -height: 100px; -} - -/* left footer, contains the text */ -#footer_text { -left: 0px; -text-align: left; -padding: 0em 1.5em 0em 1.5em; -clear: both; -background-image: url(../images/footer_right.png); -background-repeat: no-repeat; -background-position: bottom right; -width: 100%; -height: 100px; -bottom:0px; -} - -/* classes */ - -#main, #content { -clear: both; -} - -#content { -background-color: white; -padding: 0.5em 0.7em 1.5em 0.7em; -text-align: justify; -} - -#content td, #content th { -font-family: sans-serif; -padding: 0.25em; -margin: 0; -text-align: left; -} - -#content h4, #content h3, #content h2, #content h1 { -color: #418ade; -text-align: left; -line-height: 1em; /* without this lines stick in each other for headings */ -} - -#quicklinks { -background-color: #E6F0F9; -font-size: 1em; -padding: 1em; -text-align: center; -margin-top: 1em; -margin-left: 0.5em; -margin-bottom: 0.5em; -margin-right: 0.5em; -} - -#leftmenu, #rightmenu { -background-color: white; -color: #036; -} - -.menu_box { -border-top: 8px solid white; - -border-right: 8px solid white; -border-left: 8px solid white; - -background-color: #dfe7f3; -} - -#search { -text-align: center; -padding: 0.2em 0.2em 0.2em 0.2em; -} - -#search label { -display: none; -} - -#search input, #search select { -width: 95%; -margin-bottom: 2px; -} - -#hotspot { -font-size: 0.8em; -line-height: 1em; -text-align: center; -padding: 0 0 0.8em 0; -} - -.newsbox1 { -background-color: #E6F0F9; -margin-top: 1em; -margin-bottom: 0.5em; -} - -.newsbox2 { -background-color: white; -margin-top: 1em; -margin-bottom: 0.5em -} - -/* common style for tables used in the page */ -.table_box { -background-color: #dfe7f3; -border: 0; -padding: 0; -margin: 0; -border-spacing: 0; -} - -.table_box th { -background-color: #418ade; -color: white; -} - -/* needed for edu.kde.org */ -.contentheader, #content h4.contentheader { -font-size: 1em; -font-weight: bold; -line-height: 1.2em; -padding: 0.1em 0 0.2em 1em; -vertical-align: middle; -background-color: #418ade; -color: white; -margin: 0; -} - -/* Very common pattern on developer.kde.org: a list of links - to other pages with a brief italicized description below the link. - Can be created with
  • link

  • */ - -ul.linklist p { - font-size: small; - font-style: italic; -} - -ul.linklist p em { - font-style: normal; - font-weight: bold; -} - -/* hidden stuff */ -.doNotDisplay { -display: none; -} - -@media aural { .doNotDisplay { -display: inline; -}} diff --git a/styles/yellowonblue.css b/styles/yellowonblue.css deleted file mode 100644 --- a/styles/yellowonblue.css +++ /dev/null @@ -1,273 +0,0 @@ -/** - * based on code by Sebastian Faubel - * modified by Christoph Cullmann and Olaf Schmidt - */ - -/* common (X)HTML formats */ - -body { -font-size: 100%; -line-height: 1.2em; /* Note: it is inherited as is, not recalculated! */ -background-color: #000099; -color: #ffff00; -font-family: sans-serif; -padding: 0; -margin: 0; -} - -table, td, th { -font-family: sans-serif; -padding: 0; -margin: 0; -text-align: left; -background-color: #000066; -} - -input, select { -font-size: 0.8em; -line-height: 1em; -} - -form { -margin: 0; -padding: 0; -} - -optgroup { -font-style: normal; -} - -a:link { -color: #99ff00; -text-decoration: underline; -} - -a:visited { -color: #ff9900; -text-decoration: underline; -} - -a:hover { -text-decoration: underline; -} - -/* navigation header, this is the combined area with logo and section links */ - -#nav_header_top { -text-align: right; -} - -#nav_header_bottom { -clear: left; -padding: 0.3em; -background-color: #000066; -text-align: left; -} - -#nav_header_logo, #nav_header_logo_right { -display: none; -} - -/* title text */ -#nav_header_title { -float: left; -font-size: 2em; -line-height: 1.4em; -padding-left: 0.2em; -} - -/* location combo */ -#nav_header_location { -text-align: right; -} - -/* location URL */ -#nav_header_bottom_left { -vertical-align: middle; - -font-size: 0.8em; -line-height: 1.1em; -} - -/* place for the links to contact, sitemap, ... s*/ -#nav_header_bottom_right { -float: right; -vertical-align: middle; - -font-size: 0.8em; -line-height: 1.1em; -} - -/* main color definitions */ - -.menuheader { -height: 0; -line-height: 0; -margin: 0; -padding: 0; -font-size: 0; -} - -#leftmenu, #rightmenu { -width: 20%; -} - -#leftmenu h2, #rightmenu h2 { -font-size: 1em; -padding-left: 1em; -vertical-align: middle; -background-color: #000099; -color: #ffff00; -margin-top: 0; -} - -#rightmenu h3 { -padding: 0.3em 0.8em; -font-size: 1em; -} - -#leftmenu ul, #rightmenu ul { -margin: 0; -padding-left: 0.5em; -padding-bottom: 1em; -} - -#leftmenu ul { -list-style-type: none; -} - -#rightmenu ul { -list-style-type: none; -} - -#leftmenu li, #rightmenu li { -font-size: 0.8em; -} - -#leftmenu li { -margin-left: 1em; -} - -#rightmenu li { -margin-left: 1.5em; -} - -#leftmenu ul ul, #rightmenu ul ul { -margin: 0; -padding-left: 0; -} - -#leftmenu li li, #rightmenu li li{ -font-size: 0.8em; -margin-left: 2em; -list-style-type: square; -} - -/** - * page footer - */ - -/* background + border at top */ -#footer { -background-color: #000099; -} - -/* footer text stuff + image */ -#footer_text { -display: none; -} - -/* classes */ - -/* static IDs, ordered top to bottom */ - -#content { -border: 1px solid #ffff00; -padding: 0em 0.7em 1.5em 0.7em; -text-align: justify; -background-color: #000066; -} - -#content td, #content th { -font-family: sans-serif; -padding: 0.25em; -margin: 0; -text-align: left; -} - -#content h4, #content h3, #content h2, #content h1 { -text-align: left; -line-height: 1em; /* without this lines stick in each other for headings */ -} - -#quicklinks { -font-size: 1em; -text-align: center; -margin-top: 1em; -margin-left: 0.5em; -margin-bottom: 0.5em; -margin-right: 0.5em; -} - -.menu_box { -background-color: #000066; -} - -#search { -text-align: center; -padding: 0.2em 0.2em 0.2em 0.2em; -} - -#search label { -display: none; -} - -#search input, #search select { -width: 95%; -margin-bottom: 2px; -} - -#hotspot { -font-size: 0.8em; -line-height: 1em; -text-align: center; -padding: 0 0 0.8em 0; -} - -#rightmenu h3 { -margin-bottom: 0; -} - -.newsbox1 { -background-color: #000099; -margin-top: 1em; -margin-bottom: 0.5em; -} - -.newsbox2 { -background-color: #000066; -margin-top: 1em; -margin-bottom: 0.5em -} - -/* common style for tables used in the page */ -.table_box { -background-color: #000099; -border: 0; -padding: 0; -margin: 0; -border-spacing: 0; -} - -.table_box th { -background-color: #000099; -color: #ffff00; -} -/* hidden stuff */ -.doNotDisplay { -display: none; -} - -@media aural { .doNotDisplay { -display: inline; -}} diff --git a/templates/base.html.twig b/templates/base.html.twig new file mode 100644 --- /dev/null +++ b/templates/base.html.twig @@ -0,0 +1,125 @@ + + + + + {% block title %}Welcome!{% endblock %} + {% block stylesheets %} + {{ encore_entry_link_tags('app') }} + {% endblock %} + + +
    + +
    +
    +
    +
    + {{ form_start(search_form, {'attr': {'class': 'form-row', 'novalidate': 'novalidate'}}) }} +
    + {{ form_widget(search_form.search_term, {'attr': {'aria-label': 'Search', 'placeholder': 'Search', 'class': 'form-control mb-2', 'value': search_term is defined ? search_term : '', 'id': 'autocomplete'}} ) }} +
    + {{ form_widget(search_form.Search, {'attr': {'id': 'autocomplete', 'class': 'btn btn-outline-success mb-2 col-md-2'}}) }} + {{ form_end(search_form) }} +
    + {% block body %}{% endblock %} +
    +
    +
    + + + + +
    + + KDE + © and the K Desktop Environment + © logo ( +
    K
    + ) are registered trademarks of + KDE e.V. +
    + + Legal + +
    + +{% block javascripts %} + {{ encore_entry_script_tags('app') }} +{% endblock %} + + diff --git a/templates/index.html.twig b/templates/index.html.twig new file mode 100644 --- /dev/null +++ b/templates/index.html.twig @@ -0,0 +1,21 @@ +{% extends 'base.html.twig' %} + +{% block body %} +

    Welcome

    +

    Welcome to the KDE documentation site. This page holds the complete KDE User Documentation in over 25 + languages. Thanks to the enormous efforts by our documentation and translation teams you can access + thousands of pages of documentation.

    + +

    Before you start searching the library or asking questions on the mailing lists, there is a good chance your + answer is already in the KDE UserBase or the KDE Community Forums.

    + +

    If you are looking for developer documentation, the KDE Techbase is + the place where you get what you are looking for.

    +

    Categories

    +
      + {% for category in modules_programs|keys %} +
    • {{ category }}
    • + {% endfor %} +
    +{% endblock %} diff --git a/templates/module.html.twig b/templates/module.html.twig new file mode 100644 --- /dev/null +++ b/templates/module.html.twig @@ -0,0 +1,41 @@ +{% extends 'base.html.twig' %} + +{% block body %} +

    Module: {{ module }}

    + {% for category,submodules in categories %} +

    {{ appdisplayname[category] is defined ? appdisplayname[category] : category }}

    + {% if submodules.branch is defined %} + + {% else %} +
    + {% for submodule,branchs in submodules %} + {% if loop.index0 % 2 == 0 and loop.index0 != 0 %} +
    +
    + {% endif %} +
    + {{ appdisplayname[submodule] is defined ? appdisplayname[submodule] : submodule }} + +
    + {% endfor %} +
    + {% endif %} + {% endfor %} +{% endblock %} diff --git a/templates/search.html.twig b/templates/search.html.twig new file mode 100644 --- /dev/null +++ b/templates/search.html.twig @@ -0,0 +1,46 @@ +{% extends 'base.html.twig' %} + +{% block body %} + {% if search_result is not defined %} + {% for module, moduleContent in search_result %} + {% for category, submodules in moduleContent %} +

    {{ app_display_name[category] is defined ? app_display_name[category] : category }}

    + {% if submodules.branch is defined %} + + {% else %} +
    + {% for submodule,branchs in submodules %} + {% if loop.index0 % 2 == 0 and loop.index0 != 0 %} +
    +
    + {% endif %} +
    + {{ app_display_name[submodule] is defined ? app_display_name[submodule] : submodule }} + +
    + {% endfor %} +
    + {% endif %} + {% endfor %} + {% endfor %} + {% else %} + TODO ADD TEXT + {% endif %} +{% endblock %} diff --git a/tests/.gitignore b/tests/.gitignore new file mode 100644 diff --git a/translations/.gitignore b/translations/.gitignore new file mode 100644 diff --git a/webpack.config.js b/webpack.config.js new file mode 100644 --- /dev/null +++ b/webpack.config.js @@ -0,0 +1,39 @@ +var Encore = require('@symfony/webpack-encore'); + +Encore + // directory where compiled assets will be stored + .setOutputPath('public/build/') + + // public path used by the web server to access the output path + .setPublicPath('/build') + + .addEntry('app', './assets/js/app.js') + + // will require an extra script tag for runtime.js + // but, you probably want this, unless you're building a single-page app + .enableSingleRuntimeChunk() + + /* + * FEATURE CONFIG + * + * Enable & configure other features below. For a full + * list of features, see: + * https://symfony.com/doc/current/frontend.html#adding-more-features + */ + .cleanupOutputBeforeBuild() + .enableBuildNotifications() + .enableSourceMaps(!Encore.isProduction()) + // enables hashed filenames (e.g. app.abc123.css) + .enableVersioning() + + // enables Sass/SCSS support + .enableSassLoader() + + // uncomment if you use TypeScript + //.enableTypeScriptLoader() + + // uncomment if you're having problems with a jQuery plugin + .autoProvidejQuery() +; + +module.exports = Encore.getWebpackConfig();