diff options
Diffstat (limited to 'lib/BridgeCard.php')
-rw-r--r-- | lib/BridgeCard.php | 682 |
1 files changed, 350 insertions, 332 deletions
diff --git a/lib/BridgeCard.php b/lib/BridgeCard.php index 22520170..78132776 100644 --- a/lib/BridgeCard.php +++ b/lib/BridgeCard.php @@ -1,4 +1,5 @@ <?php + /** * This file is part of RSS-Bridge, a PHP project capable of generating RSS and * Atom feeds for websites that don't have one. @@ -6,9 +7,9 @@ * For the full license information, please view the UNLICENSE file distributed * with this source code. * - * @package Core - * @license http://unlicense.org/ UNLICENSE - * @link https://github.com/rss-bridge/rss-bridge + * @package Core + * @license http://unlicense.org/ UNLICENSE + * @link https://github.com/rss-bridge/rss-bridge */ /** @@ -19,310 +20,326 @@ * * @todo Return error if a caller creates an object of this class. */ -final class BridgeCard { - /** - * Get the form header for a bridge card - * - * @param string $bridgeName The bridge name - * @param bool $isHttps If disabled, adds a warning to the form - * @return string The form header - */ - private static function getFormHeader($bridgeName, $isHttps = false, $parameterName = '') { - $form = <<<EOD +final class BridgeCard +{ + /** + * Get the form header for a bridge card + * + * @param string $bridgeName The bridge name + * @param bool $isHttps If disabled, adds a warning to the form + * @return string The form header + */ + private static function getFormHeader($bridgeName, $isHttps = false, $parameterName = '') + { + $form = <<<EOD <form method="GET" action="?"> <input type="hidden" name="action" value="display" /> <input type="hidden" name="bridge" value="{$bridgeName}" /> EOD; - if(!empty($parameterName)) { - $form .= <<<EOD + if (!empty($parameterName)) { + $form .= <<<EOD <input type="hidden" name="context" value="{$parameterName}" /> EOD; - } + } - if(!$isHttps) { - $form .= '<div class="secure-warning">Warning : + if (!$isHttps) { + $form .= '<div class="secure-warning">Warning : This bridge is not fetching its content through a secure connection</div>'; - } - - return $form; - } - - /** - * Get the form body for a bridge - * - * @param string $bridgeName The bridge name - * @param array $formats A list of supported formats - * @param bool $isActive Indicates if a bridge is enabled or not - * @param bool $isHttps Indicates if a bridge uses HTTPS or not - * @param string $parameterName Sets the bridge context for the current form - * @param array $parameters The bridge parameters - * @return string The form body - */ - private static function getForm($bridgeName, - $formats, - $isActive = false, - $isHttps = false, - $parameterName = '', - $parameters = array()) { - $form = self::getFormHeader($bridgeName, $isHttps, $parameterName); - - if(count($parameters) > 0) { - - $form .= '<div class="parameters">'; - - foreach($parameters as $id => $inputEntry) { - if(!isset($inputEntry['exampleValue'])) - $inputEntry['exampleValue'] = ''; - - if(!isset($inputEntry['defaultValue'])) - $inputEntry['defaultValue'] = ''; - - $idArg = 'arg-' - . urlencode($bridgeName) - . '-' - . urlencode($parameterName) - . '-' - . urlencode($id); - - $form .= '<label for="' - . $idArg - . '">' - . filter_var($inputEntry['name'], FILTER_SANITIZE_FULL_SPECIAL_CHARS) - . '</label>' - . PHP_EOL; - - if(!isset($inputEntry['type']) || $inputEntry['type'] === 'text') { - $form .= self::getTextInput($inputEntry, $idArg, $id); - } elseif($inputEntry['type'] === 'number') { - $form .= self::getNumberInput($inputEntry, $idArg, $id); - } else if($inputEntry['type'] === 'list') { - $form .= self::getListInput($inputEntry, $idArg, $id); - } elseif($inputEntry['type'] === 'checkbox') { - $form .= self::getCheckboxInput($inputEntry, $idArg, $id); - } - - if(isset($inputEntry['title'])) { - $title_filtered = filter_var($inputEntry['title'], FILTER_SANITIZE_FULL_SPECIAL_CHARS); - $form .= '<i class="info" title="' . $title_filtered . '">i</i>'; - } else { - $form .= '<i class="no-info"></i>'; - } - } - - $form .= '</div>'; - - } - - if($isActive) { - $form .= '<button type="submit" name="format" formtarget="_blank" value="Html">Generate feed</button>'; - } else { - $form .= '<span style="font-weight: bold;">Inactive</span>'; - } - - return $form . '</form>' . PHP_EOL; - } - - /** - * Get input field attributes - * - * @param array $entry The current entry - * @return string The input field attributes - */ - private static function getInputAttributes($entry) { - $retVal = ''; - - if(isset($entry['required']) && $entry['required'] === true) - $retVal .= ' required'; - - if(isset($entry['pattern'])) - $retVal .= ' pattern="' . $entry['pattern'] . '"'; - - return $retVal; - } - - /** - * Get text input - * - * @param array $entry The current entry - * @param string $id The field ID - * @param string $name The field name - * @return string The text input field - */ - private static function getTextInput($entry, $id, $name) { - return '<input ' - . self::getInputAttributes($entry) - . ' id="' - . $id - . '" type="text" value="' - . filter_var($entry['defaultValue'], FILTER_SANITIZE_FULL_SPECIAL_CHARS) - . '" placeholder="' - . filter_var($entry['exampleValue'], FILTER_SANITIZE_FULL_SPECIAL_CHARS) - . '" name="' - . $name - . '" />' - . PHP_EOL; - } - - /** - * Get number input - * - * @param array $entry The current entry - * @param string $id The field ID - * @param string $name The field name - * @return string The number input field - */ - private static function getNumberInput($entry, $id, $name) { - return '<input ' - . self::getInputAttributes($entry) - . ' id="' - . $id - . '" type="number" value="' - . filter_var($entry['defaultValue'], FILTER_SANITIZE_NUMBER_INT) - . '" placeholder="' - . filter_var($entry['exampleValue'], FILTER_SANITIZE_NUMBER_INT) - . '" name="' - . $name - . '" />' - . PHP_EOL; - } - - /** - * Get list input - * - * @param array $entry The current entry - * @param string $id The field ID - * @param string $name The field name - * @return string The list input field - */ - private static function getListInput($entry, $id, $name) { - if(isset($entry['required']) && $entry['required'] === true) { - Debug::log('The "required" attribute is not supported for lists.'); - unset($entry['required']); - } - - $list = '<select ' - . self::getInputAttributes($entry) - . ' id="' - . $id - . '" name="' - . $name - . '" >'; - - foreach($entry['values'] as $name => $value) { - if(is_array($value)) { - $list .= '<optgroup label="' . htmlentities($name) . '">'; - foreach($value as $subname => $subvalue) { - if($entry['defaultValue'] === $subname - || $entry['defaultValue'] === $subvalue) { - $list .= '<option value="' - . $subvalue - . '" selected>' - . $subname - . '</option>'; - } else { - $list .= '<option value="' - . $subvalue - . '">' - . $subname - . '</option>'; - } - } - $list .= '</optgroup>'; - } else { - if($entry['defaultValue'] === $name - || $entry['defaultValue'] === $value) { - $list .= '<option value="' - . $value - . '" selected>' - . $name - . '</option>'; - } else { - $list .= '<option value="' - . $value - . '">' - . $name - . '</option>'; - } - } - } - - $list .= '</select>'; - - return $list; - } - - /** - * Get checkbox input - * - * @param array $entry The current entry - * @param string $id The field ID - * @param string $name The field name - * @return string The checkbox input field - */ - private static function getCheckboxInput($entry, $id, $name) { - if(isset($entry['required']) && $entry['required'] === true) { - Debug::log('The "required" attribute is not supported for checkboxes.'); - unset($entry['required']); - } - - return '<input ' - . self::getInputAttributes($entry) - . ' id="' - . $id - . '" type="checkbox" name="' - . $name - . '" ' - . ($entry['defaultValue'] === 'checked' ? 'checked' : '') - . ' />' - . PHP_EOL; - } - - /** - * Gets a single bridge card - * - * @param string $bridgeName The bridge name - * @param array $formats A list of formats - * @param bool $isActive Indicates if the bridge is active or not - * @return string The bridge card - */ - public static function displayBridgeCard($bridgeName, $formats, $isActive = true){ - - $bridgeFac = new \BridgeFactory(); - - $bridge = $bridgeFac->create($bridgeName); - - if($bridge == false) - return ''; - - $isHttps = strpos($bridge->getURI(), 'https') === 0; - - $uri = $bridge->getURI(); - $name = $bridge->getName(); - $icon = $bridge->getIcon(); - $description = $bridge->getDescription(); - $parameters = $bridge->getParameters(); - $donationUri = $bridge->getDonationURI(); - $maintainer = $bridge->getMaintainer(); - - $donationsAllowed = Configuration::getConfig('admin', 'donations'); - - if(defined('PROXY_URL') && PROXY_BYBRIDGE) { - $parameters['global']['_noproxy'] = array( - 'name' => 'Disable proxy (' . ((defined('PROXY_NAME') && PROXY_NAME) ? PROXY_NAME : PROXY_URL) . ')', - 'type' => 'checkbox' - ); - } - - if(CUSTOM_CACHE_TIMEOUT) { - $parameters['global']['_cache_timeout'] = array( - 'name' => 'Cache timeout in seconds', - 'type' => 'number', - 'defaultValue' => $bridge->getCacheTimeout() - ); - } - - $card = <<<CARD + } + + return $form; + } + + /** + * Get the form body for a bridge + * + * @param string $bridgeName The bridge name + * @param array $formats A list of supported formats + * @param bool $isActive Indicates if a bridge is enabled or not + * @param bool $isHttps Indicates if a bridge uses HTTPS or not + * @param string $parameterName Sets the bridge context for the current form + * @param array $parameters The bridge parameters + * @return string The form body + */ + private static function getForm( + $bridgeName, + $formats, + $isActive = false, + $isHttps = false, + $parameterName = '', + $parameters = [] + ) { + $form = self::getFormHeader($bridgeName, $isHttps, $parameterName); + + if (count($parameters) > 0) { + $form .= '<div class="parameters">'; + + foreach ($parameters as $id => $inputEntry) { + if (!isset($inputEntry['exampleValue'])) { + $inputEntry['exampleValue'] = ''; + } + + if (!isset($inputEntry['defaultValue'])) { + $inputEntry['defaultValue'] = ''; + } + + $idArg = 'arg-' + . urlencode($bridgeName) + . '-' + . urlencode($parameterName) + . '-' + . urlencode($id); + + $form .= '<label for="' + . $idArg + . '">' + . filter_var($inputEntry['name'], FILTER_SANITIZE_FULL_SPECIAL_CHARS) + . '</label>' + . PHP_EOL; + + if (!isset($inputEntry['type']) || $inputEntry['type'] === 'text') { + $form .= self::getTextInput($inputEntry, $idArg, $id); + } elseif ($inputEntry['type'] === 'number') { + $form .= self::getNumberInput($inputEntry, $idArg, $id); + } elseif ($inputEntry['type'] === 'list') { + $form .= self::getListInput($inputEntry, $idArg, $id); + } elseif ($inputEntry['type'] === 'checkbox') { + $form .= self::getCheckboxInput($inputEntry, $idArg, $id); + } + + if (isset($inputEntry['title'])) { + $title_filtered = filter_var($inputEntry['title'], FILTER_SANITIZE_FULL_SPECIAL_CHARS); + $form .= '<i class="info" title="' . $title_filtered . '">i</i>'; + } else { + $form .= '<i class="no-info"></i>'; + } + } + + $form .= '</div>'; + } + + if ($isActive) { + $form .= '<button type="submit" name="format" formtarget="_blank" value="Html">Generate feed</button>'; + } else { + $form .= '<span style="font-weight: bold;">Inactive</span>'; + } + + return $form . '</form>' . PHP_EOL; + } + + /** + * Get input field attributes + * + * @param array $entry The current entry + * @return string The input field attributes + */ + private static function getInputAttributes($entry) + { + $retVal = ''; + + if (isset($entry['required']) && $entry['required'] === true) { + $retVal .= ' required'; + } + + if (isset($entry['pattern'])) { + $retVal .= ' pattern="' . $entry['pattern'] . '"'; + } + + return $retVal; + } + + /** + * Get text input + * + * @param array $entry The current entry + * @param string $id The field ID + * @param string $name The field name + * @return string The text input field + */ + private static function getTextInput($entry, $id, $name) + { + return '<input ' + . self::getInputAttributes($entry) + . ' id="' + . $id + . '" type="text" value="' + . filter_var($entry['defaultValue'], FILTER_SANITIZE_FULL_SPECIAL_CHARS) + . '" placeholder="' + . filter_var($entry['exampleValue'], FILTER_SANITIZE_FULL_SPECIAL_CHARS) + . '" name="' + . $name + . '" />' + . PHP_EOL; + } + + /** + * Get number input + * + * @param array $entry The current entry + * @param string $id The field ID + * @param string $name The field name + * @return string The number input field + */ + private static function getNumberInput($entry, $id, $name) + { + return '<input ' + . self::getInputAttributes($entry) + . ' id="' + . $id + . '" type="number" value="' + . filter_var($entry['defaultValue'], FILTER_SANITIZE_NUMBER_INT) + . '" placeholder="' + . filter_var($entry['exampleValue'], FILTER_SANITIZE_NUMBER_INT) + . '" name="' + . $name + . '" />' + . PHP_EOL; + } + + /** + * Get list input + * + * @param array $entry The current entry + * @param string $id The field ID + * @param string $name The field name + * @return string The list input field + */ + private static function getListInput($entry, $id, $name) + { + if (isset($entry['required']) && $entry['required'] === true) { + Debug::log('The "required" attribute is not supported for lists.'); + unset($entry['required']); + } + + $list = '<select ' + . self::getInputAttributes($entry) + . ' id="' + . $id + . '" name="' + . $name + . '" >'; + + foreach ($entry['values'] as $name => $value) { + if (is_array($value)) { + $list .= '<optgroup label="' . htmlentities($name) . '">'; + foreach ($value as $subname => $subvalue) { + if ( + $entry['defaultValue'] === $subname + || $entry['defaultValue'] === $subvalue + ) { + $list .= '<option value="' + . $subvalue + . '" selected>' + . $subname + . '</option>'; + } else { + $list .= '<option value="' + . $subvalue + . '">' + . $subname + . '</option>'; + } + } + $list .= '</optgroup>'; + } else { + if ( + $entry['defaultValue'] === $name + || $entry['defaultValue'] === $value + ) { + $list .= '<option value="' + . $value + . '" selected>' + . $name + . '</option>'; + } else { + $list .= '<option value="' + . $value + . '">' + . $name + . '</option>'; + } + } + } + + $list .= '</select>'; + + return $list; + } + + /** + * Get checkbox input + * + * @param array $entry The current entry + * @param string $id The field ID + * @param string $name The field name + * @return string The checkbox input field + */ + private static function getCheckboxInput($entry, $id, $name) + { + if (isset($entry['required']) && $entry['required'] === true) { + Debug::log('The "required" attribute is not supported for checkboxes.'); + unset($entry['required']); + } + + return '<input ' + . self::getInputAttributes($entry) + . ' id="' + . $id + . '" type="checkbox" name="' + . $name + . '" ' + . ($entry['defaultValue'] === 'checked' ? 'checked' : '') + . ' />' + . PHP_EOL; + } + + /** + * Gets a single bridge card + * + * @param string $bridgeName The bridge name + * @param array $formats A list of formats + * @param bool $isActive Indicates if the bridge is active or not + * @return string The bridge card + */ + public static function displayBridgeCard($bridgeName, $formats, $isActive = true) + { + $bridgeFac = new \BridgeFactory(); + + $bridge = $bridgeFac->create($bridgeName); + + if ($bridge == false) { + return ''; + } + + $isHttps = strpos($bridge->getURI(), 'https') === 0; + + $uri = $bridge->getURI(); + $name = $bridge->getName(); + $icon = $bridge->getIcon(); + $description = $bridge->getDescription(); + $parameters = $bridge->getParameters(); + $donationUri = $bridge->getDonationURI(); + $maintainer = $bridge->getMaintainer(); + + $donationsAllowed = Configuration::getConfig('admin', 'donations'); + + if (defined('PROXY_URL') && PROXY_BYBRIDGE) { + $parameters['global']['_noproxy'] = [ + 'name' => 'Disable proxy (' . ((defined('PROXY_NAME') && PROXY_NAME) ? PROXY_NAME : PROXY_URL) . ')', + 'type' => 'checkbox' + ]; + } + + if (CUSTOM_CACHE_TIMEOUT) { + $parameters['global']['_cache_timeout'] = [ + 'name' => 'Cache timeout in seconds', + 'type' => 'number', + 'defaultValue' => $bridge->getCacheTimeout() + ]; + } + + $card = <<<CARD <section id="bridge-{$bridgeName}" data-ref="{$name}"> <h2><a href="{$uri}">{$name}</a></h2> <p class="description">{$description}</p> @@ -330,38 +347,39 @@ This bridge is not fetching its content through a secure connection</div>'; <label class="showmore" for="showmore-{$bridgeName}">Show more</label> CARD; - // If we don't have any parameter for the bridge, we print a generic form to load it. - if (count($parameters) === 0) { - $card .= self::getForm($bridgeName, $formats, $isActive, $isHttps); - - // Display form with cache timeout and/or noproxy options (if enabled) when bridge has no parameters - } else if (count($parameters) === 1 && array_key_exists('global', $parameters)) { - $card .= self::getForm($bridgeName, $formats, $isActive, $isHttps, '', $parameters['global']); - } else { - - foreach($parameters as $parameterName => $parameter) { - if(!is_numeric($parameterName) && $parameterName === 'global') - continue; - - if(array_key_exists('global', $parameters)) - $parameter = array_merge($parameter, $parameters['global']); - - if(!is_numeric($parameterName)) - $card .= '<h5>' . $parameterName . '</h5>' . PHP_EOL; - - $card .= self::getForm($bridgeName, $formats, $isActive, $isHttps, $parameterName, $parameter); - } - - } - - $card .= '<label class="showless" for="showmore-' . $bridgeName . '">Show less</label>'; - if($donationUri !== '' && $donationsAllowed) { - $card .= '<p class="maintainer">' . $maintainer . ' ~ <a href="' . $donationUri . '">Donate</a></p>'; - } else { - $card .= '<p class="maintainer">' . $maintainer . '</p>'; - } - $card .= '</section>'; - - return $card; - } + // If we don't have any parameter for the bridge, we print a generic form to load it. + if (count($parameters) === 0) { + $card .= self::getForm($bridgeName, $formats, $isActive, $isHttps); + + // Display form with cache timeout and/or noproxy options (if enabled) when bridge has no parameters + } elseif (count($parameters) === 1 && array_key_exists('global', $parameters)) { + $card .= self::getForm($bridgeName, $formats, $isActive, $isHttps, '', $parameters['global']); + } else { + foreach ($parameters as $parameterName => $parameter) { + if (!is_numeric($parameterName) && $parameterName === 'global') { + continue; + } + + if (array_key_exists('global', $parameters)) { + $parameter = array_merge($parameter, $parameters['global']); + } + + if (!is_numeric($parameterName)) { + $card .= '<h5>' . $parameterName . '</h5>' . PHP_EOL; + } + + $card .= self::getForm($bridgeName, $formats, $isActive, $isHttps, $parameterName, $parameter); + } + } + + $card .= '<label class="showless" for="showmore-' . $bridgeName . '">Show less</label>'; + if ($donationUri !== '' && $donationsAllowed) { + $card .= '<p class="maintainer">' . $maintainer . ' ~ <a href="' . $donationUri . '">Donate</a></p>'; + } else { + $card .= '<p class="maintainer">' . $maintainer . '</p>'; + } + $card .= '</section>'; + + return $card; + } } |