/**
  * Changes the Edit tab and adds the VisualEditor tab.
  *
  * This is attached to the MediaWiki 'SkinTemplateNavigation' hook.
  *
  * @param SkinTemplate $skin
  * @param array $links Navigation links
  * @return boolean
  */
 public static function onSkinTemplateNavigation(SkinTemplate &$skin, array &$links)
 {
     // Only do this if the user has VE enabled
     if (!$skin->getUser()->getOption('visualeditor-enable') || $skin->getUser()->getOption('visualeditor-betatempdisable')) {
         return true;
     }
     $config = ConfigFactory::getDefaultInstance()->makeConfig('visualeditor');
     if (!isset($links['views']['edit'])) {
         // There's no edit link, nothing to do
         return true;
     }
     $title = $skin->getRelevantTitle();
     if (defined('EP_NS') && $title->inNamespace(EP_NS)) {
         return true;
     }
     $tabMessages = $config->get('VisualEditorTabMessages');
     // Rebuild the $links['views'] array and inject the VisualEditor tab before or after
     // the edit tab as appropriate. We have to rebuild the array because PHP doesn't allow
     // us to splice into the middle of an associative array.
     $newViews = array();
     foreach ($links['views'] as $action => $data) {
         if ($action === 'edit') {
             // Build the VisualEditor tab
             $existing = $title->exists() || $title->inNamespace(NS_MEDIAWIKI) && $title->getDefaultMessageText() !== false;
             $action = $existing ? 'edit' : 'create';
             $veParams = $skin->editUrlOptions();
             unset($veParams['action']);
             // Remove action=edit
             $veParams['veaction'] = 'edit';
             // Set veaction=edit
             $veTabMessage = $tabMessages[$action];
             $veTabText = $veTabMessage === null ? $data['text'] : $skin->msg($veTabMessage)->text();
             $veTab = array('href' => $title->getLocalURL($veParams), 'text' => $veTabText, 'primary' => true, 'class' => '');
             // Alter the edit tab
             $editTab = $data;
             if ($title->inNamespace(NS_FILE) && WikiPage::factory($title) instanceof WikiFilePage && !WikiPage::factory($title)->isLocal()) {
                 $editTabMessage = $tabMessages[$action . 'localdescriptionsource'];
             } else {
                 $editTabMessage = $tabMessages[$action . 'source'];
             }
             if ($editTabMessage !== null) {
                 $editTab['text'] = $skin->msg($editTabMessage)->text();
             }
             // Inject the VE tab before or after the edit tab
             if ($config->get('VisualEditorTabPosition') === 'before') {
                 $editTab['class'] .= ' collapsible';
                 $newViews['ve-edit'] = $veTab;
                 $newViews['edit'] = $editTab;
             } else {
                 $veTab['class'] .= ' collapsible';
                 $newViews['edit'] = $editTab;
                 $newViews['ve-edit'] = $veTab;
             }
         } else {
             // Just pass through
             $newViews[$action] = $data;
         }
     }
     $links['views'] = $newViews;
     return true;
 }
예제 #2
0
 /**
  * Changes the Edit tab and adds the VisualEditor tab.
  *
  * This is attached to the MediaWiki 'SkinTemplateNavigation' hook.
  *
  * @param SkinTemplate $skin
  * @param array $links Navigation links
  * @return boolean
  */
 public static function onSkinTemplateNavigation(SkinTemplate &$skin, array &$links)
 {
     $config = ConfigFactory::getDefaultInstance()->makeConfig('visualeditor');
     // Exit if the user doesn't have VE enabled
     if (!$skin->getUser()->getOption('visualeditor-enable') || $skin->getUser()->getOption('visualeditor-betatempdisable') || $config->get('VisualEditorDisableForAnons') && $skin->getUser()->isAnon()) {
         return true;
     }
     // Exit if there's no edit link for whatever reason (e.g. protected page)
     if (!isset($links['views']['edit'])) {
         return true;
     }
     $availableNamespaces = $config->get('VisualEditorAvailableNamespaces');
     $title = $skin->getRelevantTitle();
     $namespaceEnabled = $title->inNamespaces(array_keys(array_filter($availableNamespaces)));
     $pageContentModel = $title->getContentModel();
     // Don't exit if this page isn't VE-enabled, since we should still
     // change "Edit" to "Edit source".
     $isAvailable = $namespaceEnabled && $pageContentModel === CONTENT_MODEL_WIKITEXT;
     // HACK: Exit if we're in the Education Program namespace (even though it's content)
     if (defined('EP_NS') && $title->inNamespace(EP_NS)) {
         return true;
     }
     $tabMessages = $config->get('VisualEditorTabMessages');
     // Rebuild the $links['views'] array and inject the VisualEditor tab before or after
     // the edit tab as appropriate. We have to rebuild the array because PHP doesn't allow
     // us to splice into the middle of an associative array.
     $newViews = array();
     foreach ($links['views'] as $action => $data) {
         if ($action === 'edit') {
             // Build the VisualEditor tab
             $existing = $title->exists() || $title->inNamespace(NS_MEDIAWIKI) && $title->getDefaultMessageText() !== false;
             $action = $existing ? 'edit' : 'create';
             $veParams = $skin->editUrlOptions();
             unset($veParams['action']);
             // Remove action=edit
             $veParams['veaction'] = 'edit';
             // Set veaction=edit
             $veTabMessage = $tabMessages[$action];
             $veTabText = $veTabMessage === null ? $data['text'] : $skin->msg($veTabMessage)->text();
             $veTab = array('href' => $title->getLocalURL($veParams), 'text' => $veTabText, 'primary' => true, 'class' => '');
             // Alter the edit tab
             $editTab = $data;
             if ($title->inNamespace(NS_FILE) && WikiPage::factory($title) instanceof WikiFilePage && !WikiPage::factory($title)->isLocal()) {
                 $editTabMessage = $tabMessages[$action . 'localdescriptionsource'];
             } else {
                 $editTabMessage = $tabMessages[$action . 'source'];
             }
             if ($editTabMessage !== null) {
                 $editTab['text'] = $skin->msg($editTabMessage)->text();
             }
             if ($isAvailable) {
                 // Inject the VE tab before or after the edit tab
                 if ($config->get('VisualEditorTabPosition') === 'before') {
                     $editTab['class'] .= ' collapsible';
                     $newViews['ve-edit'] = $veTab;
                     $newViews['edit'] = $editTab;
                 } else {
                     $veTab['class'] .= ' collapsible';
                     $newViews['edit'] = $editTab;
                     $newViews['ve-edit'] = $veTab;
                 }
             } else {
                 // Don't add ve-edit, but do update the edit tab (e.g. "Edit source").
                 $newViews['edit'] = $editTab;
             }
         } else {
             // Just pass through
             $newViews[$action] = $data;
         }
     }
     $links['views'] = $newViews;
     return true;
 }