BridgeCard.php 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. <?php
  2. final class BridgeCard {
  3. private static function buildFormatButtons($formats) {
  4. $buttons = '';
  5. foreach($formats as $name) {
  6. $buttons .= '<button type="submit" name="format" value="'
  7. . $name
  8. . '">'
  9. . $name
  10. . '</button>'
  11. . PHP_EOL;
  12. }
  13. return $buttons;
  14. }
  15. private static function getFormHeader($bridgeName, $isHttps = false) {
  16. $form = <<<EOD
  17. <form method="GET" action="?">
  18. <input type="hidden" name="action" value="display" />
  19. <input type="hidden" name="bridge" value="{$bridgeName}" />
  20. EOD;
  21. if(!$isHttps) {
  22. $form .= '<div class="secure-warning">Warning :
  23. This bridge is not fetching its content through a secure connection</div>';
  24. }
  25. return $form;
  26. }
  27. private static function getForm($bridgeName,
  28. $formats,
  29. $isActive = false,
  30. $isHttps = false,
  31. $parameterName = '',
  32. $parameters = array()) {
  33. $form = BridgeCard::getFormHeader($bridgeName, $isHttps);
  34. foreach($parameters as $id => $inputEntry) {
  35. if(!isset($inputEntry['exampleValue']))
  36. $inputEntry['exampleValue'] = '';
  37. if(!isset($inputEntry['defaultValue']))
  38. $inputEntry['defaultValue'] = '';
  39. $idArg = 'arg-'
  40. . urlencode($bridgeName)
  41. . '-'
  42. . urlencode($parameterName)
  43. . '-'
  44. . urlencode($id);
  45. $form .= '<label for="'
  46. . $idArg
  47. . '">'
  48. . filter_var($inputEntry['name'], FILTER_SANITIZE_STRING)
  49. . ' : </label>'
  50. . PHP_EOL;
  51. if(!isset($inputEntry['type']) || $inputEntry['type'] === 'text') {
  52. $form .= BridgeCard::getTextInput($inputEntry, $idArg, $id);
  53. } elseif($inputEntry['type'] === 'number') {
  54. $form .= BridgeCard::getNumberInput($inputEntry, $idArg, $id);
  55. } else if($inputEntry['type'] === 'list') {
  56. $form .= BridgeCard::getListInput($inputEntry, $idArg, $id);
  57. } elseif($inputEntry['type'] === 'checkbox') {
  58. $form .= BridgeCard::getCheckboxInput($inputEntry, $idArg, $id);
  59. }
  60. }
  61. if($isActive) {
  62. $form .= BridgeCard::buildFormatButtons($formats);
  63. } else {
  64. $form .= '<span style="font-weight: bold;">Inactive</span>';
  65. }
  66. return $form . '</form>' . PHP_EOL;
  67. }
  68. private static function getInputAttributes($entry) {
  69. $retVal = '';
  70. if(isset($entry['required']) && $entry['required'] === true)
  71. $retVal .= ' required';
  72. if(isset($entry['pattern']))
  73. $retVal .= ' pattern="' . $entry['pattern'] . '"';
  74. if(isset($entry['title']))
  75. $retVal .= ' title="' . filter_var($entry['title'], FILTER_SANITIZE_STRING) . '"';
  76. return $retVal;
  77. }
  78. private static function getTextInput($entry, $id, $name) {
  79. return '<input '
  80. . BridgeCard::getInputAttributes($entry)
  81. . ' id="'
  82. . $id
  83. . '" type="text" value="'
  84. . filter_var($entry['defaultValue'], FILTER_SANITIZE_STRING)
  85. . '" placeholder="'
  86. . filter_var($entry['exampleValue'], FILTER_SANITIZE_STRING)
  87. . '" name="'
  88. . $name
  89. . '" /><br>'
  90. . PHP_EOL;
  91. }
  92. private static function getNumberInput($entry, $id, $name) {
  93. return '<input '
  94. . BridgeCard::getInputAttributes($entry)
  95. . ' id="'
  96. . $id
  97. . '" type="number" value="'
  98. . filter_var($entry['defaultValue'], FILTER_SANITIZE_NUMBER_INT)
  99. . '" placeholder="'
  100. . filter_var($entry['exampleValue'], FILTER_SANITIZE_NUMBER_INT)
  101. . '" name="'
  102. . $name
  103. . '" /><br>'
  104. . PHP_EOL;
  105. }
  106. private static function getListInput($entry, $id, $name) {
  107. $list = '<select '
  108. . BridgeCard::getInputAttributes($entry)
  109. . ' id="'
  110. . $id
  111. . '" name="'
  112. . $name
  113. . '" >';
  114. foreach($entry['values'] as $name => $value) {
  115. if(is_array($value)) {
  116. $list .= '<optgroup label="' . htmlentities($name) . '">';
  117. foreach($value as $subname => $subvalue) {
  118. if($entry['defaultValue'] === $subname
  119. || $entry['defaultValue'] === $subvalue) {
  120. $list .= '<option value="'
  121. . $subvalue
  122. . '" selected>'
  123. . $subname
  124. . '</option>';
  125. } else {
  126. $list .= '<option value="'
  127. . $subvalue
  128. . '">'
  129. . $subname
  130. . '</option>';
  131. }
  132. }
  133. $list .= '</optgroup>';
  134. } else {
  135. if($entry['defaultValue'] === $name
  136. || $entry['defaultValue'] === $value) {
  137. $list .= '<option value="'
  138. . $value
  139. . '" selected>'
  140. . $name
  141. . '</option>';
  142. } else {
  143. $list .= '<option value="'
  144. . $value
  145. . '">'
  146. . $name
  147. . '</option>';
  148. }
  149. }
  150. }
  151. $list .= '</select><br>';
  152. return $list;
  153. }
  154. private static function getCheckboxInput($entry, $id, $name) {
  155. return '<input '
  156. . BridgeCard::getInputAttributes($entry)
  157. . ' id="'
  158. . $id
  159. . '" type="checkbox" name="'
  160. . $name
  161. . '" '
  162. . ($entry['defaultValue'] === 'checked' ?: '')
  163. . ' /><br>'
  164. . PHP_EOL;
  165. }
  166. static function displayBridgeCard($bridgeName, $formats, $isActive = true){
  167. $bridge = Bridge::create($bridgeName);
  168. if($bridge == false)
  169. return '';
  170. $isHttps = strpos($bridge->getURI(), 'https') === 0;
  171. $uri = $bridge->getURI();
  172. $name = $bridge->getName();
  173. $description = $bridge->getDescription();
  174. $parameters = $bridge->getParameters();
  175. if(defined('PROXY_URL') && PROXY_BYBRIDGE) {
  176. $parameters['global']['_noproxy'] = array(
  177. 'name' => 'Disable proxy (' . ((defined('PROXY_NAME') && PROXY_NAME) ? PROXY_NAME : PROXY_URL) . ')',
  178. 'type' => 'checkbox'
  179. );
  180. }
  181. if(CUSTOM_CACHE_TIMEOUT) {
  182. $parameters['global']['_cache_timeout'] = array(
  183. 'name' => 'Cache timeout in seconds',
  184. 'type' => 'number',
  185. 'defaultValue' => $bridge->getCacheTimeout()
  186. );
  187. }
  188. $card = <<<CARD
  189. <section id="bridge-{$bridgeName}" data-ref="{$bridgeName}">
  190. <h2><a href="{$uri}">{$name}</a></h2>
  191. <p class="description">{$description}</p>
  192. <input type="checkbox" class="showmore-box" id="showmore-{$bridgeName}" />
  193. <label class="showmore" for="showmore-{$bridgeName}">Show more</label>
  194. CARD;
  195. // If we don't have any parameter for the bridge, we print a generic form to load it.
  196. if(count($parameters) === 0
  197. || count($parameters) === 1 && array_key_exists('global', $parameters)) {
  198. $card .= BridgeCard::getForm($bridgeName, $formats, $isActive, $isHttps);
  199. } else {
  200. foreach($parameters as $parameterName => $parameter) {
  201. if(!is_numeric($parameterName) && $parameterName === 'global')
  202. continue;
  203. if(array_key_exists('global', $parameters))
  204. $parameter = array_merge($parameter, $parameters['global']);
  205. if(!is_numeric($parameterName))
  206. $card .= '<h5>' . $parameterName . '</h5>' . PHP_EOL;
  207. $card .= BridgeCard::getForm($bridgeName, $formats, $isActive, $isHttps, $parameterName, $parameter);
  208. }
  209. }
  210. $card .= '<label class="showless" for="showmore-' . $bridgeName . '">Show less</label>';
  211. $card .= '<p class="maintainer">' . $bridge->getMaintainer() . '</p>';
  212. $card .= '</section>';
  213. return $card;
  214. }
  215. }