Add sections feature

This commit is contained in:
Bruno Dias 2015-05-13 21:31:30 -03:00
parent 5ee0231d1c
commit 87f1fd6741
4 changed files with 59 additions and 13 deletions

View File

@ -173,6 +173,28 @@ situation('progress-bar', {
choices: ['return']
});
situation('continuation', {
content: `
# Continuation and Sections
Each situation is output to the screen as its own section. You can
go to [the next situation](continuation-continue) to see a situation
that adds to the existing section, instead of writing a new one.
`,
optionText: 'Continuations and Sections',
tags: ['testing-option']
});
situation ('continuation-continue', {
content: `
This feature allows situations to be individually styled. The \`classes\`
attribute of a situation controls additional classes to be added to the
section.
`,
continueSection: true,
choices: ['return']
});
/*
Custom quality definition. We make a constructor for an object that supplies
the QualityDefinition interface Undum expects, and then pass that to

View File

@ -160,9 +160,17 @@ RaconteurSituation.prototype.enter = function (character, system, f) {
if (this.before) this.before(character, system, f);
if (this.content) {
system.write(
markdown.render(
this.content.fcall(this, character, system, f).normaliseTabs()));
let classes = this.classes ? ' ' + this.classes.join(' ') : '';
let renderedContent = markdown.render(
this.content.fcall(this, character, system, f).normaliseTabs());
if (this.extendSection) {
system.writeInto(renderedContent, '#current-situation');
}
else {
$('#current-situation').removeAttr('id');
let output = `<section id="current-situation" class="situation-${this.name}${classes}">\n${renderedContent}</section>`;
system.write(output);
}
}
if (this.after) this.after(character, system, f);
@ -193,12 +201,7 @@ RaconteurSituation.prototype.act = function (character, system, action) {
writer: function (ref) {
let content = that.writers[ref].fcall(that, character, system, action);
let output = markdown.render(content).fade();
if ($('.options').length) {
// Write before the options list if one is currently shown.
system.writeBefore(output, '.options');
} else {
system.write(output);
}
system.writeInto(output, '#current-situation');
},
replacer: function (ref) {
let content = that.writers[ref].fcall(that, character, system, action);

View File

@ -1,3 +1,5 @@
'use strict'
var elements = require('raconteur/elements.js');
var a = elements.a, span = elements.span;

View File

@ -3,7 +3,10 @@ var situation = require('raconteur/situation.js');
describe ('situation', function () {
var test_situation = situation('test-situation', {
content: "This is the content of the *testing* situation.",
choices: ['#foo']
choices: ['#foo'],
writers: {
testwriter: "*Foo*"
}
});
var system_spy;
@ -11,11 +14,13 @@ describe ('situation', function () {
beforeEach(function () {
system_spy = {
write: function () {return;},
writeInto: function () {return;},
getSituationIdChoices: function () {return;},
writeChoices: function () {return;}
};
spyOn(system_spy, 'write');
spyOn(system_spy, 'writeInto');
spyOn(system_spy, 'getSituationIdChoices').and.returnValue(['foo', 'foo-bar']);
spyOn(system_spy, 'writeChoices');
});
@ -24,11 +29,11 @@ describe ('situation', function () {
expect(test_situation.name).toBe('test-situation');
});
it('parses its content as markdown', function () {
it('parses its content as markdown inside a <section>', function () {
test_situation.enter({}, system_spy, '');
expect(system_spy.write)
.toHaveBeenCalledWith("<p>This is the content of the <em>testing</em> situation.</p>\n");
.toHaveBeenCalledWith('<section id="current-situation" class="situation-test-situation">\n<p>This is the content of the <em>testing</em> situation.</p>\n</section>');
});
it('is agnostic about whether content is a string or a function', function () {
@ -36,7 +41,15 @@ describe ('situation', function () {
test_situation.enter({}, system_spy, '');
expect(system_spy.write)
.toHaveBeenCalledWith("<p>Foo and bar.</p>\n");
.toHaveBeenCalledWith('<section id="current-situation" class="situation-test-situation">\n<p>Foo and bar.</p>\n</section>');
});
it('adds classes to a <section> if the classList attribute is specified', function () {
test_situation.classes = ['foo', 'bar'];
test_situation.enter({}, system_spy, '');
expect(system_spy.write)
.toHaveBeenCalledWith('<section id="current-situation" class="situation-test-situation foo bar">\n<p>Foo and bar.</p>\n</section>');
});
it('generates a list of choices', function () {
@ -47,4 +60,10 @@ describe ('situation', function () {
expect(system_spy.writeChoices).toHaveBeenCalledWith(['foo', 'foo-bar']);
});
it('writes into the current situation when a default writer is called', function () {
test_situation.act({}, system_spy, '_writer_testwriter');
expect(system_spy.writeInto).toHaveBeenCalled();
});
});