/*
Yarn Spinner is licensed to you under the terms found in the file LICENSE.md.
*/
using System.Collections.Generic;
using System.Text;
using UnityEngine;
using Yarn.Markup;
#nullable enable
namespace Yarn.Unity
{
///
/// An attribute marker processor that inserts TextMeshPro style tags where
/// Yarn Spinner [style] tags appear in a line.
///
public sealed class StyleMarkerProcessor : ReplacementMarkupHandler
{
[SerializeField]
public LineProviderBehaviour? lineProvider;
///
public override ReplacementMarkerResult ProcessReplacementMarker(MarkupAttribute marker, StringBuilder childBuilder, List childAttributes, string localeCode)
{
// ok so we check if we have a property called style
// if not give up
if (!marker.TryGetProperty("style", out string? property))
{
var error = new List
{
new LineParser.MarkupDiagnostic("Unable to identify a name for the style.")
};
return new ReplacementMarkerResult(error, 0);
}
var originalLength = childBuilder.Length;
childBuilder.Insert(0, $"");
// at this point we have no errors
// but it is entirely possible that style has added visible characters
// we have no way of knowing this
// so if this is the case any attributes will now be off
// unfortunately that is a downside to using the style replacement system
// most of the time this won't be a problem
return new ReplacementMarkerResult(childBuilder.Length - originalLength);
}
// Start is called before the first frame update
void Start()
{
if (lineProvider == null)
{
var runner = DialogueRunner.FindRunner(this);
if (runner == null)
{
Debug.LogWarning("Was unable to find a dialogue runner, unable to register the style markup.");
return;
}
lineProvider = (LineProviderBehaviour)runner.LineProvider;
}
lineProvider.RegisterMarkerProcessor("style", this);
// in an ideal world instead of making you write out [style = h1] you could just do [h1]
// but TMP doesn't allow access to the list of styles, and as such also can't get their names
// so we have no way of know what the names of any style to register them
// alas
}
}
}