An easy to use Unity 3D library for creating illustrated Interactive Fiction games and more.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

108 lines
2.1 KiB

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using Fungus.Script;
namespace Fungus
{
/**
* Parses a text file using a simple format and adds string values to the global string table.
* The format is:
* $FirstString
* The first string text goes here
* $SecondString
* The second string text goes here
* # This is a comment line and will be ignored by the parser
*/
public class StringsParser : MonoBehaviour
{
public TextAsset stringsFile;
private enum ParseMode
{
Idle,
Text,
};
void Start()
{
ProcessText(stringsFile.text);
}
void ProcessText(string text)
{
// Split text into lines. Add a newline at end to ensure last command is always parsed
string[] lines = Regex.Split(text + "\n", "(?<=\n)");
string blockBuffer = "";
ParseMode mode = ParseMode.Idle;
string blockTag = "";
for (int i = 0; i < lines.Length; ++i)
{
string line = lines[i];
bool newBlock = line.StartsWith("$");
if (mode == ParseMode.Idle && !newBlock)
{
// Ignore any text not preceded by a label tag
continue;
}
string newBlockTag = "";
if (newBlock)
{
newBlockTag = line.Replace ("\n", "");
}
bool endOfFile = (i == lines.Length-1);
bool storeBlock = false;
if (newBlock)
{
storeBlock = true;
}
else if (mode == ParseMode.Text && endOfFile)
{
storeBlock = true;
if (!line.StartsWith("#"))
{
blockBuffer += line;
}
}
else
{
if (!line.StartsWith("#"))
{
blockBuffer += line;
}
}
if (storeBlock)
{
if (blockTag.Length > 0 && blockBuffer.Length > 0)
{
// Trim off last newline
blockBuffer = blockBuffer.TrimEnd( '\r', '\n', ' ', '\t');
GlobalVariables.SetString(blockTag, blockBuffer);
}
// Prepare to parse next block
mode = ParseMode.Idle;
if (newBlock)
{
mode = ParseMode.Text;
blockTag = newBlockTag;
}
blockBuffer = "";
}
}
}
}
}