Skip to content

Instantly share code, notes, and snippets.

@shadeglare
Last active August 29, 2015 14:03
Show Gist options
  • Select an option

  • Save shadeglare/d45eefd846ff31b0d040 to your computer and use it in GitHub Desktop.

Select an option

Save shadeglare/d45eefd846ff31b0d040 to your computer and use it in GitHub Desktop.
module animation {
export interface Token {
identity: string;
value: string;
}
export interface InputData {
tokens: Token[];
leftActor: string;
rightActor?: string;
}
declare var uuid;
export function toAnimationRequest(inputData: InputData): string {
var leftActor = inputData.leftActor;
var rightActor = inputData.rightActor;
var tokens = inputData.tokens;
var leftActorAlias = uuid();
var rightActorAlias = rightActor ? uuid() : null;
var actors = rightActor ?
toTwoActors(leftActor, leftActorAlias, rightActor, rightActorAlias) :
toOneActor(leftActor, leftActorAlias);
if (rightActor) pluralizeTokens(tokens);
var commands = serializeCommandDocument(toCommandDocument(tokens, leftActorAlias));
var animationData = {
input: {
id: uuid(),
transparent: false,
deltaGif: true,
outputFormat: 'gif',
useTTS: false,
balloonPosition: 'top',
actors: actors,
commands: commands
}
};
return 'type=build&data=' + encodeURIComponent(JSON.stringify(animationData));
}
function pluralizeTokens(tokens: Token[]) {
tokens.forEach(token => {
if (isGagToken(token)) {
pluralizeGagToken(token);
}
});
}
function isGagToken(token: Token): boolean {
return token.identity === 'gag';
}
function pluralizeGagToken(token: Token) {
if (token.value === 'kiss1right') {
token.value = 'kiss';
} else if (token.value === 'cake1right') {
token.value = 'cake';
}
}
function toOneActor(actor: string, actorAlias: string) {
return [{
name: actorAlias,
character: actor
}];
}
function toTwoActors(leftActor: string, leftActorAlias: string, rightActor: string, rightActorAlias: string) {
return [{
name: leftActorAlias,
right: rightActorAlias,
character: leftActor
}, {
name: rightActorAlias,
left: leftActorAlias,
character: rightActor
}];
}
function toCommandDocument(tokens: Token[], actorAlias): Document {
var commandDocument = createCommandDocument();
var commandsNode = commandDocument.getElementsByTagName('commands')[0];
var dialogNode = createDialogNode(commandDocument);
var actorNode = toActorNode(commandDocument, actorAlias);
var tokenNodes = toTokenNodes(commandDocument, tokens);
dialogNode.appendChild(actorNode);
tokenNodes.forEach(tokenNode => dialogNode.appendChild(tokenNode));
commandsNode.appendChild(dialogNode);
return commandDocument;
}
function createCommandDocument(): Document {
var rawXML = '<?xml version="1.0"?><commands version="1.0.0"></commands>';
return new DOMParser().parseFromString(rawXML, 'text/xml');
}
function serializeCommandDocument(commandsDocument: Document): string {
return new XMLSerializer().serializeToString(commandsDocument);
}
function createDialogNode(document: Document): Node {
return document.createElement('dialog');
}
function toActorNode(document: Document, actorAlias: string): Node {
var node = document.createElement('actor');
node.textContent = actorAlias;
return node;
}
function toTokenNodes(document: Document, tokens: Token[]): Node[] {
return tokens.map(function(token) {
if (token.identity === 'text') {
return toTextNode(document, token);
} else {
return toSmileNode(document, token);
}
});
}
function toSmileNode(document: Document, token: Token): Node {
var node = document.createElement(token.identity);
node.textContent = token.value;
return node;
}
function toTextNode(document: Document, token: Token): Node {
return document.createTextNode(token.value);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment