LyricExtension/Source Code Dev

From PeacockWiki

(Difference between revisions)
Jump to: navigation, search
Revision as of 05:48, 1 June 2006 (edit)
Trevorp (Talk | contribs)

← Previous diff
Current revision (06:04, 11 June 2006) (edit)
Trevorp (Talk | contribs)

 
Line 4: Line 4:
# #
# Simple lyric parser extension for mediawiki. # Simple lyric parser extension for mediawiki.
-# Written by Trevor Peacock, 1 June 2006+# Written by Trevor Peacock, 11 June 2006
-# version 0.2+# version 0.3
# Tested on MediaWiki 1.6devel, PHP 5.0.5 (apache2handler) # Tested on MediaWiki 1.6devel, PHP 5.0.5 (apache2handler)
 +#
 +# Official Site
 +# http://wiki.peacocktech.com/wiki/LyricExtension
# #
# developed to support the notation of lyrics in mediawiki. # developed to support the notation of lyrics in mediawiki.
Line 15: Line 18:
# * Optional CSS styling embedded in every page # * Optional CSS styling embedded in every page
# * CSS styling not embedded in meta tage, rather @import-ed from extension file # * CSS styling not embedded in meta tage, rather @import-ed from extension file
 +# * Support for lyricnote and spoken/speech tags
 +#
 +# Thanks to Sean Columbo for his assistance
 +# http://lyricwiki.org/User:Sean_Colombo
# #
# To install, copy this file into "extensions" directory, and add # To install, copy this file into "extensions" directory, and add
Line 34: Line 41:
$name=explode('\\', $name[count($name)-1]); $name=explode('\\', $name[count($name)-1]);
return $name[count($name)-1]; return $name[count($name)-1];
-} 
- 
-################################################################################ 
-# CSS section 
-# 
-# This section has no configuration, and can be ignored. 
-# 
-function get_css() 
-{ 
- return 
- "#lyric {\n". 
- " padding: 1em;\n". 
- " border: 1px solid silver;\n". 
- " color: black;\n". 
- " background-color: #ffffcc;\n". 
- "}\n"; 
-} 
- 
-#if(strcasecmp(filename(__FILE__), filename($_SERVER['SCRIPT_NAME']))==0) 
-if(!isset($wgScriptPath)) 
-{ 
- header("Content-type: text/css"); 
- echo get_css(); 
} }
Line 97: Line 81:
global $wgParser; global $wgParser;
$wgParser->setHook("lyric", "renderLyric"); $wgParser->setHook("lyric", "renderLyric");
 + $wgParser->setHook("lyrics", "renderLyric");
 + $wgParser->setHook("spoken", "renderLyricSpeech");
 + $wgParser->setHook("speech", "renderLyricSpeech");
 + $wgParser->setHook("lyricnote", "renderLyricNote");
 +}
 +
 +function renderWikiText($input, &$parser)
 +{
 + return $parser->parse($input, $parser->mTitle, $parser->mOptions, true, false)->getText();
} }
#render <lyric> text #render <lyric> text
-function renderLyric($input, $argv)+function breakText($input)
 +{
 + return str_replace(array("\r\n", "\r","\n"), "<br/>", trim($input));
 +}
 + 
 +function renderLyric($input, $argv, &$parser)
{ {
#make new lines in wikitext new lines in html #make new lines in wikitext new lines in html
- $transform=str_replace(array("\r\n", "\r","\n"), "<br/>", trim($input));+ $transform=breakText($input);
#define css lyric style #define css lyric style
Line 109: Line 107:
#parse embedded wikitext #parse embedded wikitext
- global $wgOut;+ #dirty dirty hack: how else to pass parameter to subsequent calls?
- return $wgOut->parse($transform, false);+ $parser->mTitle->mRestrictions['inlyric']=1;
 + $output=renderWikiText($transform, $parser);
 + unset($parser->mTitle->mRestrictions['inlyric']);
 + return $output;
 +}
 + 
 +function renderCSSTag($input, $argv, &$parser, $tag)
 +{
 +#var_dump($parser->mTitle);
 + #define css lyric style
 + if(!isset($parser->mTitle->mRestrictions['inlyric']))
 + {
 + #http://svn.wikimedia.org/doc/classParser.html#ee79d906f7320ab444b48d19c9d20f1e
 + #above instructs parse is not to be called recursivly. Am i breaking this?
 +# $transform="<lyric>"."<div id=\"$tag\">".$input."</div>"."</lyric>";
 + $transform="<lyric>"."<$tag>".$input."</$tag>"."</lyric>";
 + #parse embedded wikitext
 + $output=renderWikiText(breakText($transform), $parser);
 + return $output;
 + }
 + else
 + {
 + return "<div id=\"$tag\">".renderWikiText(breakText($input), $parser)."</div>";
 + }
 +}
 + 
 +#render <speech> text
 +function renderLyricSpeech($input, $argv, &$parser)
 +{
 + return renderCSSTag($input, $argv, &$parser, 'spoken');
 +}
 + 
 +#render <note> text
 +function renderLyricNote($input, $argv, &$parser)
 +{
 + return renderCSSTag($input, $argv, &$parser, 'lyricnote');
} }
Line 130: Line 163:
function LyricCss(&$css) { function LyricCss(&$css) {
$css = "/*<![CDATA[*/". $css = "/*<![CDATA[*/".
-# "\n".get_css()."\n". 
" @import \"$wgScriptPath/extensions/".filename(__FILE__)."\"; ". " @import \"$wgScriptPath/extensions/".filename(__FILE__)."\"; ".
"/*]]>*/"; "/*]]>*/";
return true; return true;
 +}
 +
 +################################################################################
 +# CSS section
 +#
 +# This section has no configuration, and can be ignored.
 +#
 +
 +if(!isset($wgScriptPath))
 +{
 + header("Content-type: text/css");
 + ?>#lyric {
 + padding: 1em;
 + border: 1px solid silver;
 + color: black;
 + background-color: #ffffcc;
 +}
 +
 +#lyricnote {
 + padding: 0em;
 + border: 0px;
 + color: black;
 + background-color: #cccccc;
 +}
 +
 +#spoken {
 + padding: 0em;
 + border: 0px;
 + color: black;
 + background-color: #ffffff;
 +}
 +<?php
} }
?> ?>
</pre> </pre>

Current revision

<?php

#
# Simple lyric parser extension for mediawiki.
# Written by Trevor Peacock, 11 June 2006
# version 0.3
# Tested on MediaWiki 1.6devel, PHP 5.0.5 (apache2handler)
#
# Official Site
# http://wiki.peacocktech.com/wiki/LyricExtension
#
# developed to support the notation of lyrics in mediawiki.
# see http://lyricwiki.org/User:TrevorP/Notation
#
# Features:
#  * Allows basic lyric notation
#  * Optional CSS styling embedded in every page
#  * CSS styling not embedded in meta tage, rather @import-ed from extension file
#  * Support for lyricnote and spoken/speech tags
#
# Thanks to Sean Columbo for his assistance
# http://lyricwiki.org/User:Sean_Colombo
#
# To install, copy this file into "extensions" directory, and add
# the following line to the end of LocalSettings.php
# (above the  ? >  )
#
#   require("extensions/lyric.php");
#

################################################################################
# Functions
#
# This section has no configuration, and can be ignored.
#

function filename($name)
{
  $name=explode('/', $name);
  $name=explode('\\', $name[count($name)-1]);
  return $name[count($name)-1];
}

################################################################################
# Extension Credits Definition
#
# This section has no configuration, and can be ignored.
#

if(isset($wgScriptPath))
{
$wgExtensionCredits["parserhook"][]=array(
  'name' => 'Lyric Extension',
  'version' => '0.1',
  'url' => 'http://wiki.peacocktech.com/wiki/LyricExtension',
  'author' => '[http://about.peacocktech.com/trevorp/ Trevor Peacock]',
  'description' => 'Adds features allowing easy notation of lyrics in mediawiki' );
}

################################################################################
# Lyric Render Section
#
# This section has no configuration, and can be ignored.
#
# This section renders <lyric> tags. It forces a html break on every line,
# and styles the section with a css id.
# this id can either be in the mediawiki css files, or defined by the extension
#

if(isset($wgScriptPath))
{
#Instruct mediawiki to call LyricExtension to initialise new extension
$wgExtensionFunctions[] = "LyricExtension";
}

#Install extension
function LyricExtension()
{
  #install hook on the element <lyric>
  global $wgParser;
  $wgParser->setHook("lyric", "renderLyric");
  $wgParser->setHook("lyrics", "renderLyric");
  $wgParser->setHook("spoken", "renderLyricSpeech");
  $wgParser->setHook("speech", "renderLyricSpeech");
  $wgParser->setHook("lyricnote", "renderLyricNote");
}

function renderWikiText($input, &$parser)
{
  return $parser->parse($input, $parser->mTitle, $parser->mOptions, true, false)->getText();
}

#render <lyric> text
function breakText($input)
{
  return str_replace(array("\r\n", "\r","\n"), "<br/>", trim($input));
}

function renderLyric($input, $argv, &$parser)
{
  #make new lines in wikitext new lines in html
  $transform=breakText($input);

  #define css lyric style
  $transform="<div id=\"lyric\">".$transform."</div>";

  #parse embedded wikitext
  #dirty dirty hack: how else to pass parameter to subsequent calls?
  $parser->mTitle->mRestrictions['inlyric']=1;
  $output=renderWikiText($transform, $parser);
  unset($parser->mTitle->mRestrictions['inlyric']);
  return $output;
}

function renderCSSTag($input, $argv, &$parser, $tag)
{
#var_dump($parser->mTitle);
  #define css lyric style
  if(!isset($parser->mTitle->mRestrictions['inlyric']))
  {
    #http://svn.wikimedia.org/doc/classParser.html#ee79d906f7320ab444b48d19c9d20f1e
    #above instructs parse is not to be called recursivly. Am i breaking this?
#    $transform="<lyric>"."<div id=\"$tag\">".$input."</div>"."</lyric>";
    $transform="<lyric>"."<$tag>".$input."</$tag>"."</lyric>";
    #parse embedded wikitext
    $output=renderWikiText(breakText($transform), $parser);
    return $output;
  }
  else
  {
    return "<div id=\"$tag\">".renderWikiText(breakText($input), $parser)."</div>";
  }
}

#render <speech> text
function renderLyricSpeech($input, $argv, &$parser)
{
  return renderCSSTag($input, $argv, &$parser, 'spoken');
}

#render <note> text
function renderLyricNote($input, $argv, &$parser)
{
  return renderCSSTag($input, $argv, &$parser, 'lyricnote');
}

################################################################################
# CSS Styling Section
#
# This section may require configuration.
#
# This section adds a css style to all pages to style lyric sections
#

# If you wish to manually define the style in the css templates,
# add a "#" at the start of this line:
if(isset($wgScriptPath))
{
$wgHooks['SkinTemplateSetupPageCss'][] = 'LyricCss';
}

function LyricCss(&$css) {
  $css = "/*<![CDATA[*/".
  " @import \"$wgScriptPath/extensions/".filename(__FILE__)."\"; ".
  "/*]]>*/";
  return true;
}

################################################################################
# CSS section
#
# This section has no configuration, and can be ignored.
#

if(!isset($wgScriptPath))
{
  header("Content-type: text/css");
  ?>#lyric {
	padding: 1em;
	border: 1px solid silver;
	color: black;
	background-color: #ffffcc;
}

#lyricnote {
	padding: 0em;
	border: 0px;
	color: black;
	background-color: #cccccc;
}

#spoken {
	padding: 0em;
	border: 0px;
	color: black;
	background-color: #ffffff;
}
<?php
}

?>
Personal tools