MediaWiki
REL1_22
|
00001 <?php 00030 class Licenses extends HTMLFormField { 00034 protected $msg; 00035 00039 protected $licenses = array(); 00040 00044 protected $html; 00052 public function __construct( $params ) { 00053 parent::__construct( $params ); 00054 00055 $this->msg = empty( $params['licenses'] ) ? wfMessage( 'licenses' )->inContentLanguage()->plain() : $params['licenses']; 00056 $this->selected = null; 00057 00058 $this->makeLicenses(); 00059 } 00060 00064 protected function makeLicenses() { 00065 $levels = array(); 00066 $lines = explode( "\n", $this->msg ); 00067 00068 foreach ( $lines as $line ) { 00069 if ( strpos( $line, '*' ) !== 0 ) { 00070 continue; 00071 } else { 00072 list( $level, $line ) = $this->trimStars( $line ); 00073 00074 if ( strpos( $line, '|' ) !== false ) { 00075 $obj = new License( $line ); 00076 $this->stackItem( $this->licenses, $levels, $obj ); 00077 } else { 00078 if ( $level < count( $levels ) ) { 00079 $levels = array_slice( $levels, 0, $level ); 00080 } 00081 if ( $level == count( $levels ) ) { 00082 $levels[$level - 1] = $line; 00083 } elseif ( $level > count( $levels ) ) { 00084 $levels[] = $line; 00085 } 00086 } 00087 } 00088 } 00089 } 00090 00095 protected function trimStars( $str ) { 00096 $numStars = strspn( $str, '*' ); 00097 return array( $numStars, ltrim( substr( $str, $numStars ), ' ' ) ); 00098 } 00099 00105 protected function stackItem( &$list, $path, $item ) { 00106 $position =& $list; 00107 if ( $path ) { 00108 foreach ( $path as $key ) { 00109 $position =& $position[$key]; 00110 } 00111 } 00112 $position[] = $item; 00113 } 00114 00119 protected function makeHtml( $tagset, $depth = 0 ) { 00120 foreach ( $tagset as $key => $val ) { 00121 if ( is_array( $val ) ) { 00122 $this->html .= $this->outputOption( 00123 $key, '', 00124 array( 00125 'disabled' => 'disabled', 00126 'style' => 'color: GrayText', // for MSIE 00127 ), 00128 $depth 00129 ); 00130 $this->makeHtml( $val, $depth + 1 ); 00131 } else { 00132 $this->html .= $this->outputOption( 00133 $val->text, $val->template, 00134 array( 'title' => '{{' . $val->template . '}}' ), 00135 $depth 00136 ); 00137 } 00138 } 00139 } 00140 00148 protected function outputOption( $message, $value, $attribs = null, $depth = 0 ) { 00149 $msgObj = $this->msg( $message ); 00150 $text = $msgObj->exists() ? $msgObj->text() : $message; 00151 $attribs['value'] = $value; 00152 if ( $value === $this->selected ) { 00153 $attribs['selected'] = 'selected'; 00154 } 00155 00156 $val = str_repeat( /*   */ "\xc2\xa0", $depth * 2 ) . $text; 00157 return str_repeat( "\t", $depth ) . Xml::element( 'option', $attribs, $val ) . "\n"; 00158 } 00159 00167 public function getLicenses() { 00168 return $this->licenses; 00169 } 00170 00178 public function getInputHTML( $value ) { 00179 $this->selected = $value; 00180 00181 $this->html = $this->outputOption( wfMessage( 'nolicense' )->text(), '', 00182 (bool)$this->selected ? null : array( 'selected' => 'selected' ) ); 00183 $this->makeHtml( $this->getLicenses() ); 00184 00185 $attribs = array( 00186 'name' => $this->mName, 00187 'id' => $this->mID 00188 ); 00189 if ( !empty( $this->mParams['disabled'] ) ) { 00190 $attibs['disabled'] = 'disabled'; 00191 } 00192 00193 return Html::rawElement( 'select', $attribs, $this->html ); 00194 } 00195 } 00196 00200 class License { 00204 var $template; 00205 00209 var $text; 00210 00216 function __construct( $str ) { 00217 list( $text, $template ) = explode( '|', strrev( $str ), 2 ); 00218 00219 $this->template = strrev( $template ); 00220 $this->text = strrev( $text ); 00221 } 00222 }