<commit_before><?php
declare(strict_types=1);

namespace Fc2blog\Web;

use Fc2blog\App;
use Fc2blog\Config;
use Fc2blog\Model\BlogsModel;
use Fc2blog\Util\StringCaseConverter;

class Html
{
    /**
     * Admin系画面用（BlogId非対応）のurl()のwrapper, コントローラー名とアクション名を簡便に指定する
     * @param Request $request
     * @param string $controller
     * @param string $action
     * @param array $args
     * @param bool $full_url
     * @return string
     */
    public static function adminUrl(Request $request, string $controller, string $action, array $args = [], bool $full_url = false): string
    {
        $path = static::url(
            $request,
            array_merge(
                ['controller' => $controller, 'action' => $action],
                $args
            ),
        );
        if ($full_url) {
            return static::getServerUrl($request) . $path;
        } else {
            return $path;
        }
    }

    /**
     * URLを作成する
     * TODO: ユーザー側のURL生成時はApp:userURLを使用に置き換え最終的にblog_idの部分を削る
     * @param Request $request
     * @param array $args
     * @param bool $reused
     * @param bool $full_url
     * @param bool $use_base_dir
     * @return string
     */
    public static function url(Request $request, array $args = array(), bool $reused = false, bool $full_url = false, bool $use_base_dir = true): string
    {
        // 現在のURLの引数を引き継ぐ
        if ($reused == true) {
            $gets = $request->getGet();
            unset($gets[Config::get('ARGS_CONTROLLER')]);
            unset($gets[Config::get('ARGS_ACTION')]);
            $args = array_merge($gets, $args);
        }

        $controller = $request->shortControllerName;
        if (isset($args['controller'])) {
            $controller = $args['controller'];
            unset($args['controller']);
        }
        $controller = StringCaseConverter::snakeCase($controller);

        $action = $request->methodName;
        if (isset($args['action'])) {
            $action = $args['action'];
            unset($args['action']);
        }

        // 引数のデバイスタイプを取得
        $device_name = App::getArgsDevice($request);
        if (!empty($device_name) && isset($args[$device_name])) {
            unset($args[$device_name]);
        }

        // URL/Controller/Methodの形で返却
        if ($request->urlRewrite && !$full_url) {
            $params = array();
            foreach ($args as $key => $value) {
                $params[] = $key . '=' . $value;
            }
            if (!empty($device_name)) {
                $params[] = $device_name;
            }

            $url = $request->baseDirectory . $controller . '/' . $action;
            if (count($params)) {
                $url .= '?' . implode('&', $params);
            }
            return $url;
        }

        // BlogIdを先頭に付与する
        $blog_id = null;
        if (isset($args['blog_id'])) {
            $blog_id = $args['blog_id'];
            unset($args['blog_id']);
        }

        $params = array();
        $params[] = Config::get('ARGS_CONTROLLER') . '=' . $controller;
        $params[] = Config::get('ARGS_ACTION') . '=' . $action;
        foreach ($args as $key => $value) {
            $params[] = $key . '=' . rawurlencode((string)$value);
        }
        if (!empty($device_name)) {
            $params[] = $device_name;
        }

        if ($use_base_dir) {
            $url = $request->baseDirectory . Config::get('DIRECTORY_INDEX');
        } else {
            $url = "/" . Config::get('DIRECTORY_INDEX');
        }
        if (count($params)) {
            $url .= '?' . implode('&', $params);
        }
        // シングルテナントモードのために、/testblog2/〜〜 のブログ指定部分を省略するか？を決定
        if (
            $blog_id && (
                // Default Blog IDが未指定か
                strlen(Config::get('DEFAULT_BLOG_ID', "")) === 0 ||
                // 指定されたblog_idがDefault blog idと異なる場合
                $blog_id !== Config::get('DEFAULT_BLOG_ID')
            )
        ) {
            $url = '/' . $blog_id . $url;
        }

        // フルのURLを取得する（SSL強制リダイレクト用）
        if ($full_url && !is_null($blog_id)) {
            $url = BlogsModel::getFullHostUrlByBlogId($blog_id) . $url;
        }
        return $url;
    }

    public static function input(Request $request, $name, $type, $attrs = array(), $option_attrs = array()): string
    {<commit_msg>add noinspection. too complex inline html building for linter.<commit_after><?php
declare(strict_types=1);

namespace Fc2blog\Web;

use Fc2blog\App;
use Fc2blog\Config;
use Fc2blog\Model\BlogsModel;
use Fc2blog\Util\StringCaseConverter;

class Html
{
    /**
     * Admin系画面用（BlogId非対応）のurl()のwrapper, コントローラー名とアクション名を簡便に指定する
     * @param Request $request
     * @param string $controller
     * @param string $action
     * @param array $args
     * @param bool $full_url
     * @return string
     */
    public static function adminUrl(Request $request, string $controller, string $action, array $args = [], bool $full_url = false): string
    {
        $path = static::url(
            $request,
            array_merge(
                ['controller' => $controller, 'action' => $action],
                $args
            ),
        );
        if ($full_url) {
            return static::getServerUrl($request) . $path;
        } else {
            return $path;
        }
    }

    /**
     * URLを作成する
     * TODO: ユーザー側のURL生成時はApp:userURLを使用に置き換え最終的にblog_idの部分を削る
     * @param Request $request
     * @param array $args
     * @param bool $reused
     * @param bool $full_url
     * @param bool $use_base_dir
     * @return string
     */
    public static function url(Request $request, array $args = array(), bool $reused = false, bool $full_url = false, bool $use_base_dir = true): string
    {
        // 現在のURLの引数を引き継ぐ
        if ($reused == true) {
            $gets = $request->getGet();
            unset($gets[Config::get('ARGS_CONTROLLER')]);
            unset($gets[Config::get('ARGS_ACTION')]);
            $args = array_merge($gets, $args);
        }

        $controller = $request->shortControllerName;
        if (isset($args['controller'])) {
            $controller = $args['controller'];
            unset($args['controller']);
        }
        $controller = StringCaseConverter::snakeCase($controller);

        $action = $request->methodName;
        if (isset($args['action'])) {
            $action = $args['action'];
            unset($args['action']);
        }

        // 引数のデバイスタイプを取得
        $device_name = App::getArgsDevice($request);
        if (!empty($device_name) && isset($args[$device_name])) {
            unset($args[$device_name]);
        }

        // URL/Controller/Methodの形で返却
        if ($request->urlRewrite && !$full_url) {
            $params = array();
            foreach ($args as $key => $value) {
                $params[] = $key . '=' . $value;
            }
            if (!empty($device_name)) {
                $params[] = $device_name;
            }

            $url = $request->baseDirectory . $controller . '/' . $action;
            if (count($params)) {
                $url .= '?' . implode('&', $params);
            }
            return $url;
        }

        // BlogIdを先頭に付与する
        $blog_id = null;
        if (isset($args['blog_id'])) {
            $blog_id = $args['blog_id'];
            unset($args['blog_id']);
        }

        $params = array();
        $params[] = Config::get('ARGS_CONTROLLER') . '=' . $controller;
        $params[] = Config::get('ARGS_ACTION') . '=' . $action;
        foreach ($args as $key => $value) {
            $params[] = $key . '=' . rawurlencode((string)$value);
        }
        if (!empty($device_name)) {
            $params[] = $device_name;
        }

        if ($use_base_dir) {
            $url = $request->baseDirectory . Config::get('DIRECTORY_INDEX');
        } else {
            $url = "/" . Config::get('DIRECTORY_INDEX');
        }
        if (count($params)) {
            $url .= '?' . implode('&', $params);
        }
        // シングルテナントモードのために、/testblog2/〜〜 のブログ指定部分を省略するか？を決定
        if (
            $blog_id && (
                // Default Blog IDが未指定か
                strlen(Config::get('DEFAULT_BLOG_ID', "")) === 0 ||
                // 指定されたblog_idがDefault blog idと異なる場合
                $blog_id !== Config::get('DEFAULT_BLOG_ID')
            )
        ) {
            $url = '/' . $blog_id . $url;
        }

        // フルのURLを取得する（SSL強制リダイレクト用）
        if ($full_url && !is_null($blog_id)) {
            $url = BlogsModel::getFullHostUrlByBlogId($blog_id) . $url;
        }
        return $url;
    }

    /** @noinspection XmlInvalidId HTML組み立てが複雑で、Linterが解析しきれないため */
    public static function input(Request $request, $name, $type, $attrs = array(), $option_attrs = array()): string
    {
{'fraction_non_alphanumeric': 0.15501311737196305, 'fraction_numerical': 0.001825025664423406, 'mean_word_length': 1.872870249017038, 'pattern_counts': {'":': 0, '<': 5, '<?xml version=': 0, '>': 23, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '3057444', 'n_tokens_mistral': 2901, 'n_tokens_neox': 2862, 'n_words': 501}