#if USE_ARTICY
// Copyright (c) Pixel Crushers. All rights reserved.
using UnityEngine;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using System.Linq;
namespace PixelCrushers.DialogueSystem.Articy
{
///
/// This static utility class contains tools for working with Articy data.
///
public static class ArticyTools
{
///
/// InitializeLuaSubtables() converts fields whose titles start with this string into subtables.
///
public const string SubtableFieldPrefix = "SUBTABLE__";
///
/// Convert articy markup codes to rich text codes that Unity can display.
///
public static bool convertMarkupToRichText = true;
///
/// Checks the first few lines of a string in articy:draft XML format for a schema identifier.
///
///
/// true if it contains the schema identifier.
///
///
/// XML data to check.
///
///
/// Schema identifier to check for.
///
public static bool DataContainsSchemaId(string xmlData, string schemaId)
{
StringReader xmlStream = new StringReader(xmlData);
if (xmlStream != null)
{
for (int i = 0; i < 5; i++)
{
string s = xmlStream.ReadLine();
if (!string.IsNullOrEmpty(s) && s.Contains(schemaId)) return true;
}
//--- Not compatible with UWP10: xmlStream.Close();
}
return false;
}
private static string[] htmlTags = new string[] { "", "
", "", "", "", "", "
", "",
"", "
", "
", "", "" };
///
/// Removes HTML tags from a string.
///
///
/// The string without HTML.
///
///
/// The HTML-filled string.
///
public static string RemoveHtml(string s)
{
// This is a rather inefficient first pass, but it gets the job done.
// On the roadmap: Replace with http://www.codeproject.com/Articles/298519/Fast-Token-Replacement-in-Csharp
if (!string.IsNullOrEmpty(s))
{
if (convertMarkupToRichText) s = ReplaceMarkup(s);
foreach (string htmlTag in htmlTags)
{
s = s.Replace(htmlTag, string.Empty);
}
if (s.Contains("")) s = ReplaceHtmlCharacterCodes(s);
s = s.Replace(""", "\"");
s = s.Replace("&", "&");
s = s.Replace("<", "<");
s = s.Replace(">", ">");
s = s.Replace(" ", " ");
s = s.Trim();
}
return s;
}
///
/// Selectively replaces HTML character codes (numeric character references) that articy uses.
///
public static string ReplaceHtmlCharacterCodes(string s)
{
var text = s;
Regex regex = new Regex(@"[0-9]+;");
text = regex.Replace(text, delegate (Match match)
{
string codeString = match.Value.Substring(2, match.Value.Length - 3);
int numericCode;
if (!int.TryParse(codeString, out numericCode)) return match.Value;
return char.ConvertFromUtf32(numericCode).ToString();
});
return text;
}
//==================================================================
// Code contributed by Racoon7:
const RegexOptions Options = RegexOptions.CultureInvariant | RegexOptions.ExplicitCapture | RegexOptions.IgnoreCase;
static readonly Regex StylesRegex = new Regex(@"", Options); // Get the part of text dealing with styles
static readonly Regex StyleRegex = new Regex(@"#(?s[1-9]\d*) {(?