music21j-port
Version:
A toolkit for computer-aided musicology, Javascript version
1,050 lines (854 loc) • 27.4 kB
HTML
<html lang="en">
<head>
<meta charset="utf-8">
<title>Music21j Source: music21/scale.js</title>
<!--[if lt IE 9]>
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<link type="text/css" rel="stylesheet" href="styles/sunlight.default.css">
<link type="text/css" rel="stylesheet" href="styles/site.spruce.css">
</head>
<body>
<div class="container-fluid">
<div class="navbar navbar-fixed-top navbar-inverse">
<div class="navbar-inner">
<a class="brand" href="index.html">Music21j</a>
<ul class="nav">
<li class="dropdown">
<a href="namespaces.list.html" class="dropdown-toggle" data-toggle="dropdown">Namespaces<b
class="caret"></b></a>
<ul class="dropdown-menu ">
<li>
<a href="music21.html">music21</a>
</li>
<li>
<a href="music21.articulations.html">music21.articulations</a>
</li>
<li>
<a href="music21.audioSearch.html">music21.audioSearch</a>
</li>
<li>
<a href="music21.base.html">music21.base</a>
</li>
<li>
<a href="music21.beam.html">music21.beam</a>
</li>
<li>
<a href="music21.chord.html">music21.chord</a>
</li>
<li>
<a href="music21.clef.html">music21.clef</a>
</li>
<li>
<a href="music21.common.html">music21.common</a>
</li>
<li>
<a href="music21.duration.html">music21.duration</a>
</li>
<li>
<a href="music21.dynamics.html">music21.dynamics</a>
</li>
<li>
<a href="music21.expressions.html">music21.expressions</a>
</li>
<li>
<a href="music21.fromPython.html">music21.fromPython</a>
</li>
<li>
<a href="music21.instrument.html">music21.instrument</a>
</li>
<li>
<a href="music21.interval.html">music21.interval</a>
</li>
<li>
<a href="music21.key.html">music21.key</a>
</li>
<li>
<a href="music21.keyboard.html">music21.keyboard</a>
</li>
<li>
<a href="music21.meter.html">music21.meter</a>
</li>
<li>
<a href="music21.miditools.html">music21.miditools</a>
</li>
<li>
<a href="music21.note.html">music21.note</a>
</li>
<li>
<a href="music21.pitch.html">music21.pitch</a>
</li>
<li>
<a href="music21.prebase.html">music21.prebase</a>
</li>
<li>
<a href="music21.renderOptions.html">music21.renderOptions</a>
</li>
<li>
<a href="music21.roman.html">music21.roman</a>
</li>
<li>
<a href="music21.scale.html">music21.scale</a>
</li>
<li>
<a href="music21.sites.html">music21.sites</a>
</li>
<li>
<a href="music21.stream.html">music21.stream</a>
</li>
<li>
<a href="music21.tempo.html">music21.tempo</a>
</li>
<li>
<a href="music21.tie.html">music21.tie</a>
</li>
<li>
<a href="music21.tinyNotation.html">music21.tinyNotation</a>
</li>
<li>
<a href="music21.vfShow.html">music21.vfShow</a>
</li>
<li>
<a href="music21.webmidi.html">music21.webmidi</a>
</li>
</ul>
</li>
<li class="dropdown">
<a href="classes.list.html" class="dropdown-toggle" data-toggle="dropdown">Classes<b
class="caret"></b></a>
<ul class="dropdown-menu ">
<li>
<a href="music21.articulations.Accent.html">music21.articulations.Accent</a>
</li>
<li>
<a href="music21.articulations.Articulation.html">music21.articulations.Articulation</a>
</li>
<li>
<a href="music21.articulations.DynamicArticulation.html">music21.articulations.DynamicArticulation</a>
</li>
<li>
<a href="music21.articulations.LengthArticulation.html">music21.articulations.LengthArticulation</a>
</li>
<li>
<a href="music21.articulations.Marcato.html">music21.articulations.Marcato</a>
</li>
<li>
<a href="music21.articulations.PitchArticulation.html">music21.articulations.PitchArticulation</a>
</li>
<li>
<a href="music21.articulations.Spiccato.html">music21.articulations.Spiccato</a>
</li>
<li>
<a href="music21.articulations.Staccatissimo.html">music21.articulations.Staccatissimo</a>
</li>
<li>
<a href="music21.articulations.Staccato.html">music21.articulations.Staccato</a>
</li>
<li>
<a href="music21.articulations.StrongAccent.html">music21.articulations.StrongAccent</a>
</li>
<li>
<a href="music21.articulations.Tenuto.html">music21.articulations.Tenuto</a>
</li>
<li>
<a href="music21.articulations.TimbreArticulation.html">music21.articulations.TimbreArticulation</a>
</li>
<li>
<a href="music21.base.Music21Object.html">music21.base.Music21Object</a>
</li>
<li>
<a href="music21.beam.Beam.html">music21.beam.Beam</a>
</li>
<li>
<a href="music21.beam.Beams.html">music21.beam.Beams</a>
</li>
<li>
<a href="music21.chord.Chord.html">music21.chord.Chord</a>
</li>
<li>
<a href="music21.clef.AltoClef.html">music21.clef.AltoClef</a>
</li>
<li>
<a href="music21.clef.BassClef.html">music21.clef.BassClef</a>
</li>
<li>
<a href="music21.clef.Clef.html">music21.clef.Clef</a>
</li>
<li>
<a href="music21.clef.MezzoSopranoClef.html">music21.clef.MezzoSopranoClef</a>
</li>
<li>
<a href="music21.clef.PercussionClef.html">music21.clef.PercussionClef</a>
</li>
<li>
<a href="music21.clef.SopranoClef.html">music21.clef.SopranoClef</a>
</li>
<li>
<a href="music21.clef.TenorClef.html">music21.clef.TenorClef</a>
</li>
<li>
<a href="music21.clef.Treble8vaClef.html">music21.clef.Treble8vaClef</a>
</li>
<li>
<a href="music21.clef.Treble8vbClef.html">music21.clef.Treble8vbClef</a>
</li>
<li>
<a href="music21.clef.TrebleClef.html">music21.clef.TrebleClef</a>
</li>
<li>
<a href="music21.duration.Duration.html">music21.duration.Duration</a>
</li>
<li>
<a href="music21.duration.Tuplet.html">music21.duration.Tuplet</a>
</li>
<li>
<a href="music21.dynamics.Dynamic.html">music21.dynamics.Dynamic</a>
</li>
<li>
<a href="music21.expressions.Expression.html">music21.expressions.Expression</a>
</li>
<li>
<a href="music21.expressions.Fermata.html">music21.expressions.Fermata</a>
</li>
<li>
<a href="music21.fromPython.Converter.html">music21.fromPython.Converter</a>
</li>
<li>
<a href="music21.instrument.Instrument.html">music21.instrument.Instrument</a>
</li>
<li>
<a href="music21.interval.ChromaticInterval.html">music21.interval.ChromaticInterval</a>
</li>
<li>
<a href="music21.interval.DiatonicInterval.html">music21.interval.DiatonicInterval</a>
</li>
<li>
<a href="music21.interval.GenericInterval.html">music21.interval.GenericInterval</a>
</li>
<li>
<a href="music21.interval.Interval.html">music21.interval.Interval</a>
</li>
<li>
<a href="music21.key.Key.html">music21.key.Key</a>
</li>
<li>
<a href="music21.key.KeySignature.html">music21.key.KeySignature</a>
</li>
<li>
<a href="music21.keyboard.BlackKey.html">music21.keyboard.BlackKey</a>
</li>
<li>
<a href="music21.keyboard.Key.html">music21.keyboard.Key</a>
</li>
<li>
<a href="music21.keyboard.Keyboard.html">music21.keyboard.Keyboard</a>
</li>
<li>
<a href="music21.keyboard.WhiteKey.html">music21.keyboard.WhiteKey</a>
</li>
<li>
<a href="music21.meter.TimeSignature.html">music21.meter.TimeSignature</a>
</li>
<li>
<a href="music21.miditools.Event.html">music21.miditools.Event</a>
</li>
<li>
<a href="music21.miditools.MidiPlayer.html">music21.miditools.MidiPlayer</a>
</li>
<li>
<a href="music21.note.GeneralNote.html">music21.note.GeneralNote</a>
</li>
<li>
<a href="music21.note.Lyric.html">music21.note.Lyric</a>
</li>
<li>
<a href="music21.note.Note.html">music21.note.Note</a>
</li>
<li>
<a href="music21.note.NotRest.html">music21.note.NotRest</a>
</li>
<li>
<a href="music21.note.Rest.html">music21.note.Rest</a>
</li>
<li>
<a href="music21.pitch.Accidental.html">music21.pitch.Accidental</a>
</li>
<li>
<a href="music21.pitch.Pitch.html">music21.pitch.Pitch</a>
</li>
<li>
<a href="music21.prebase.ProtoM21Object.html">music21.prebase.ProtoM21Object</a>
</li>
<li>
<a href="music21.renderOptions.RenderOptions.html">music21.renderOptions.RenderOptions</a>
</li>
<li>
<a href="music21.roman.RomanNumeral.html">music21.roman.RomanNumeral</a>
</li>
<li>
<a href="music21.stream.Measure.html">music21.stream.Measure</a>
</li>
<li>
<a href="music21.stream.Part.html">music21.stream.Part</a>
</li>
<li>
<a href="music21.stream.Score.html">music21.stream.Score</a>
</li>
<li>
<a href="music21.stream.Stream.html">music21.stream.Stream</a>
</li>
<li>
<a href="music21.stream.Voice.html">music21.stream.Voice</a>
</li>
<li>
<a href="music21.tempo.Metronome.html">music21.tempo.Metronome</a>
</li>
<li>
<a href="music21.tie.Tie.html">music21.tie.Tie</a>
</li>
<li>
<a href="music21.vfShow.Renderer.html">music21.vfShow.Renderer</a>
</li>
<li>
<a href="music21.vfShow.RenderStack.html">music21.vfShow.RenderStack</a>
</li>
<li>
<a href="Notation.html">Notation</a>
</li>
<li>
<a href="Page.html">Page</a>
</li>
<li>
<a href="Recorder.html">Recorder</a>
</li>
</ul>
</li>
<li class="dropdown">
<a href="global.html" class="dropdown-toggle" data-toggle="dropdown">Global<b
class="caret"></b></a>
<ul class="dropdown-menu ">
<li>
<a href="global.html#getM21attribute">getM21attribute</a>
</li>
<li>
<a href="global.html#layout">layout</a>
</li>
<li>
<a href="global.html#midiNumDiffFromFrequency">midiNumDiffFromFrequency</a>
</li>
<li>
<a href="global.html#recorderWorkerJs">recorderWorkerJs</a>
</li>
<li>
<a href="global.html#unpickler">unpickler</a>
</li>
<li>
<a href="global.html#warnBanner">warnBanner</a>
</li>
</ul>
</li>
</ul>
</div>
</div>
<div class="row-fluid">
<div class="span12">
<div id="main">
<h1 class="page-title">Source: music21/scale.js</h1>
<section>
<article>
<pre
class="sunlight-highlight-javascript linenums">/**
* music21j -- Javascript reimplementation of Core music21p features.
* music21/scale -- Scales
*
* Does not implement the full range of scales from music21p
*
* Copyright (c) 2013-17, Michael Scott Cuthbert and cuthbertLab
* Based on music21 (=music21p), Copyright (c) 2006–17, Michael Scott Cuthbert and cuthbertLab
*
*/
import { base } from './base.js';
import { common } from './common.js';
import { debug } from './debug.js';
import { interval } from './interval.js';
import { pitch } from './pitch.js';
import { Music21Exception } from './exceptions21.js';
// const DIRECTION_BI = 'bi';
// const DIRECTION_DESCENDING = 'descending';
// const DIRECTION_ASCENDING = 'ascending';
/**
* Scale module. See {@link music21.scale} namespace
*
* @exports music21/scale
*/
/**
* Scale namespace. Right now only supports very simple scales.
*
* @namespace music21.scale
* @memberof music21
* @requires music21/base
* @requires music21/common
* @requires music21/debug
* @requires music21/interval
* @requires music21/pitch
*/
export class Scale extends base.Music21Object {
constructor() {
super();
this.type = 'Scale';
}
get name() {
return this.type;
}
get isConcrete() {
return false;
}
}
export class AbstractScale extends Scale {
constructor() {
super();
this._net = []; // simplified -- no IntervalNetwork, just list of intervals
this.tonicDegree = 1;
this.octaveDuplicating = true;
this.deterministic = true;
this._alteredDegrees = {};
this._oneOctaveRealizationCache = undefined;
}
equals(other) {
if (
common.arrayEquals(this.classes, other.classes)
&& this.tonicDegree === other.tonicDegree
&& common.arrayEquals(this._net, other._net)
) {
return true;
} else {
return false;
}
}
buildNetworkFromPitches(pitchList) {
const pitchListReal = [];
for (const p of pitchList) {
if (typeof p === 'string') {
pitchListReal.push(new pitch.Pitch(p));
} else if (p.classes.includes('Note')) {
pitchListReal.push(p.pitch);
} else {
pitchListReal.push(p);
}
}
pitchList = pitchListReal;
const pLast = pitchList[pitchList.length - 1];
if (pLast.name === pitchList[0]) {
const p = pitchList[0].clone();
if (pLast.ps > pitchList[0]) {
// ascending;
while (p.ps < pLast.ps) {
p.octave += 1;
}
} else {
while (p.ps < pLast.ps) {
p.octave += -1;
}
}
pitchList.push(p);
}
const intervalList = [];
for (let i = 0; i < pitchList.length - 1; i++) {
const thisInterval = new interval.Interval(
pitchList[i],
pitchList[i + 1]
);
intervalList.push(thisInterval);
}
this._net = intervalList;
}
getDegreeMaxUnique() {
return this._net.length;
}
getRealization(
pitchObj,
unused_stepOfPitch,
unused_minPitch,
unused_maxPitch,
unused_direction,
unused_reverse
) {
// if (direction === undefined) {
// direction = DIRECTION_ASCENDING;
// }
// if (stepOfPitch === undefined) {
// stepOfPitch = 1;
// }
if (typeof pitchObj === 'string') {
pitchObj = new pitch.Pitch(pitchObj);
} else {
pitchObj = pitchObj.clone();
}
const post = [pitchObj];
for (const intV of this._net) {
pitchObj = intV.transposePitch(pitchObj);
post.push(pitchObj);
}
return post;
}
getPitchFromNodeDegree(pitchReference, unused_nodeName, nodeDegreeTarget) {
const zeroIndexDegree = nodeDegreeTarget - 1;
for (let i = 0; i < zeroIndexDegree; i++) {
const thisIntv = this._net[i % this._net.length];
pitchReference = thisIntv.transposePitch(pitchReference);
}
return pitchReference;
}
getRelativeNodeDegree(
pitchReference,
unused_nodeName,
pitchTarget,
unused_comparisonAttribute,
unused_direction
) {
if (typeof pitchTarget === 'string') {
pitchTarget = new pitch.Pitch(pitchTarget);
}
let realizedPitches;
if (this._oneOctaveRealizationCache !== undefined) {
realizedPitches = this._oneOctaveRealizationCache;
} else {
realizedPitches = this.getRealization(pitchReference);
this._oneOctaveRealizationCache = realizedPitches;
}
const realizedNames = [];
for (const p of realizedPitches) {
realizedNames.push(p.name);
}
const realizedIndex = realizedNames.indexOf(pitchTarget.name);
if (realizedIndex === -1) {
return undefined;
} else {
return realizedIndex + 1;
}
}
}
export class AbstractDiatonicScale extends AbstractScale {
constructor(mode) {
super();
this.type = 'Abstract diatonic';
this.tonicDegree = undefined;
this.dominantDegree = undefined;
this.octaveDuplicating = true;
this._buildNetwork(mode);
}
_buildNetwork(mode) {
const srcList = ['M2', 'M2', 'm2', 'M2', 'M2', 'M2', 'm2'];
let intervalList;
this.tonicDegree = 1;
this.dominantDegree = 5;
if (['major', 'ionian', undefined].includes(mode)) {
intervalList = srcList;
this.relativeMajorDegree = 1;
this.relativeMinorDegree = 6;
} else if (['minor', 'aeolian'].includes(mode)) {
intervalList = srcList.slice(5, 7);
intervalList.push(...srcList.slice(0, 5));
this.relativeMajorDegree = 3;
this.relativeMinorDegree = 1;
}
this._net = [];
for (const intVStr of intervalList) {
this._net.push(new interval.Interval(intVStr));
}
}
}
export class AbstractHarmonicMinorScale extends AbstractScale {
constructor() {
super();
this.type = 'Abstract harmonic minor';
this.octaveDuplicating = true;
this._buildNetwork();
}
_buildNetwork() {
const intervalList = ['M2', 'm2', 'M2', 'M2', 'm2', 'A2', 'm2'];
this._net = [];
for (const intVStr of intervalList) {
this._net.push(new interval.Interval(intVStr));
}
}
}
// temporary, until bidirectional scales are created
// no need for descending, since minor takes care of that.
export class AbstractAscendingMelodicMinorScale extends AbstractScale {
constructor() {
super();
this.type = 'Abstract ascending melodic minor';
this.octaveDuplicating = true;
this._buildNetwork();
}
_buildNetwork() {
const intervalList = ['M2', 'm2', 'M2', 'M2', 'M2', 'M2', 'm2'];
this._net = [];
for (const intVStr of intervalList) {
this._net.push(new interval.Interval(intVStr));
}
}
}
export class ConcreteScale extends Scale {
constructor(tonic) {
super();
if (typeof tonic === 'string') {
tonic = new pitch.Pitch(tonic);
}
this.tonic = tonic;
this.abstract = undefined;
}
// when adding functionality here, must also be added to key.Key.
get isConcrete() {
if (this.tonic !== undefined) {
return true;
} else {
return false;
}
}
getTonic() {
return this.tonic;
}
// transpose
// tune
// No .romanNumeral function because of circular imports...
// romanNumeral(degree) {
// return new roman.RomanNumeral(degree, this);
// }
getPitches(unused_minPitch, unused_maxPitch, unused_direction) {
let pitchObj;
if (this.tonic === undefined) {
pitchObj = new pitch.Pitch('C4');
} else {
pitchObj = this.tonic;
}
return this.abstract.getRealization(pitchObj);
}
pitchFromDegree(
degree,
unused_minPitch,
unused_maxPitch,
unused_direction,
unused_equateTermini
) {
return this.abstract.getPitchFromNodeDegree(
this.tonic,
this.abstract.tonicDegree,
degree
);
}
getScaleDegreeFromPitch(
pitchTarget,
unused_direction,
unused_comparisonAttribute
) {
return this.abstract.getRelativeNodeDegree(
this.tonic,
this.abstract.tonicDegree,
pitchTarget
);
}
}
export class DiatonicScale extends ConcreteScale {
constructor(tonic) {
super(tonic); // a.k.a. ^2 :-)
this.abstract = new AbstractDiatonicScale();
this.type = 'diatonic';
}
}
export class MajorScale extends DiatonicScale {
constructor(tonic) {
super(tonic); // a.k.a. ^2 :-)
this.type = 'major';
this.abstract._buildNetwork(this.type);
}
}
export class MinorScale extends DiatonicScale {
constructor(tonic) {
super(tonic); // a.k.a. ^2 :-)
this.type = 'minor';
this.abstract._buildNetwork(this.type);
}
}
export class HarmonicMinorScale extends ConcreteScale {
constructor(tonic) {
super(tonic); // a.k.a. ^2 :-)
this.type = 'harmonic minor';
this.abstract = new AbstractHarmonicMinorScale();
}
}
export class AscendingMelodicMinorScale extends ConcreteScale {
constructor(tonic) {
super(tonic); // a.k.a. ^2 :-)
this.type = 'harmonic minor';
this.abstract = new AbstractAscendingMelodicMinorScale();
}
}
/**
* Function, not class
*
* @function music21.scale.SimpleDiatonicScale
* @param {music21.pitch.Pitch} tonic
* @param {Array<string>} scaleSteps - an array of diatonic prefixes,
* generally 'M' (major) or 'm' (minor) describing the seconds.
* @returns {Array<music21.pitch.Pitch>} an octave of scale objects.
*/
export function SimpleDiatonicScale(tonic, scaleSteps) {
if (tonic === undefined) {
tonic = new pitch.Pitch('C4');
} else if (!(tonic instanceof pitch.Pitch)) {
throw new Music21Exception(
'Cannot make a scale not from '
+ 'a music21.pitch.Pitch object: '
+ tonic
);
}
if (scaleSteps === undefined) {
scaleSteps = ['M', 'M', 'm', 'M', 'M', 'M', 'm'];
}
const gi = new interval.GenericInterval(2);
const pitches = [tonic];
let lastPitch = tonic;
for (let i = 0; i < scaleSteps.length; i++) {
const di = new interval.DiatonicInterval(scaleSteps[i], gi);
const ii = new interval.Interval(di);
const newPitch = ii.transposePitch(lastPitch);
if (debug) {
console.log('ScaleSimpleMajor -- adding pitch: ' + newPitch.name);
}
pitches.push(newPitch);
lastPitch = newPitch;
}
return pitches;
}
/**
* One octave of a major scale
*
* @function music21.scale.ScaleSimpleMajor
* @param {music21.pitch.Pitch} tonic
* @returns {Array<music21.pitch.Pitch>} an octave of scale objects.
*/
export function ScaleSimpleMajor(tonic) {
const scaleSteps = ['M', 'M', 'm', 'M', 'M', 'M', 'm'];
return SimpleDiatonicScale(tonic, scaleSteps);
}
/**
* One octave of a minor scale
*
* @function music21.scale.ScaleSimpleMinor
* @param {music21.pitch.Pitch} tonic
* @param {string} [minorType='natural'] - 'harmonic', 'harmonic-minor',
* 'melodic', 'melodic-minor', 'melodic-minor-ascending',
* 'melodic-ascending' or other (=natural/melodic-descending)
* @returns {Array<music21.pitch.Pitch>} an octave of scale objects.
*/
export function ScaleSimpleMinor(tonic, minorType) {
const scaleSteps = ['M', 'm', 'M', 'M', 'm', 'M', 'M'];
if (typeof minorType === 'string') {
// "harmonic minor" -> "harmonic-minor"
minorType = minorType.replace(/\s/g, '-');
}
if (minorType === 'harmonic' || minorType === 'harmonic-minor') {
scaleSteps[5] = 'A';
scaleSteps[6] = 'm';
} else if (
minorType === 'melodic'
|| minorType === 'melodic-ascending'
|| minorType === 'melodic-minor'
|| minorType === 'melodic-minor-ascending'
) {
scaleSteps[4] = 'M';
scaleSteps[6] = 'm';
}
return SimpleDiatonicScale(tonic, scaleSteps);
}
export const scale = {
Scale,
AbstractScale,
AbstractDiatonicScale,
AbstractHarmonicMinorScale,
AbstractAscendingMelodicMinorScale,
ConcreteScale,
DiatonicScale,
MajorScale,
MinorScale,
HarmonicMinorScale,
AscendingMelodicMinorScale,
ScaleSimpleMinor,
ScaleSimpleMajor,
SimpleDiatonicScale,
};
</pre>
</article>
</section>
</div>
<div class="clearfix"></div>
<footer>
<span class="copyright">
Music21j, Copyright © 2013-2018 Michael Scott Cuthbert and cuthbertLab.
</span>
<br />
<span class="jsdoc-message">
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a>
on Wed Jul 4th 2018 using the <a
href="https://github.com/terryweiss/docstrap">DocStrap template</a>.
</span>
</footer>
</div>
<br clear="both">
</div>
</div>
<!--<script src="scripts/sunlight.js"></script>-->
<script src="scripts/docstrap.lib.js"></script>
<script src="scripts/bootstrap-dropdown.js"></script>
<script src="scripts/toc.js"></script>
<script>
$( function () {
$( "[id*='$']" ).each( function () {
var $this = $( this );
$this.attr( "id", $this.attr( "id" ).replace( "$", "__" ) );
} );
$( "#toc" ).toc( {
anchorName : function ( i, heading, prefix ) {
return $( heading ).attr( "id" ) || ( prefix + i );
},
selectors : "h1,h2,h3,h4",
showAndHide : false,
scrollTo : "100px"
} );
$( "#toc>ul" ).addClass( "nav nav-pills nav-stacked" );
$( "#main span[id^='toc']" ).addClass( "toc-shim" );
$( '.dropdown-toggle' ).dropdown();
// $( ".tutorial-section pre, .readme-section pre" ).addClass( "sunlight-highlight-javascript" ).addClass( "linenums" );
$( ".tutorial-section pre, .readme-section pre" ).each( function () {
var $this = $( this );
var example = $this.find( "code" );
exampleText = example.html();
var lang = /{@lang (.*?)}/.exec( exampleText );
if ( lang && lang[1] ) {
exampleText = exampleText.replace( lang[0], "" );
example.html( exampleText );
lang = lang[1];
} else {
lang = "javascript";
}
if ( lang ) {
$this
.addClass( "sunlight-highlight-" + lang )
.addClass( "linenums" )
.html( example.html() );
}
} );
Sunlight.highlightAll( {
lineNumbers : true,
showMenu : true,
enableDoclinks : true
} );
} );
</script>
<!--Navigation and Symbol Display-->
<!--Google Analytics-->
</body>
</html>