From a062a026b4798fae385ff7946fae46b6ad195677 Mon Sep 17 00:00:00 2001 From: Kathy Date: Thu, 16 Jun 2011 10:35:50 +0000 Subject: [PATCH] --- PROMS/Volian.Controls.Library/DisplayText.cs | 45 +++++++++++++++++--- 1 file changed, 40 insertions(+), 5 deletions(-) diff --git a/PROMS/Volian.Controls.Library/DisplayText.cs b/PROMS/Volian.Controls.Library/DisplayText.cs index 100e3b8c..405c5bb8 100644 --- a/PROMS/Volian.Controls.Library/DisplayText.cs +++ b/PROMS/Volian.Controls.Library/DisplayText.cs @@ -248,6 +248,7 @@ namespace Volian.Controls.Library } private string DoROAdjustments(string text) { + Regex regRefObj = new Regex(@"\#Link\:ReferencedObject:([0-9]*) ([0-9a-zA-Z]*) ([0-9]*)", RegexOptions.Singleline); string strippedText = StaticStripRtfCommands(text); string lookFor = string.Format(@""); MatchCollection matches = Regex.Matches(text, lookFor); @@ -260,17 +261,51 @@ namespace Volian.Controls.Library string beforeRO = StaticStripRtfCommands(text.Substring(0, g.Index)); string afterRO = StaticStripRtfCommands(text.Substring(g.Index + g.Length)); string newvalue = DoROFormatFlags(g.ToString(), beforeRO, afterRO); - newvalue = ReplaceSpaceWithHardspace(newvalue); + Match myMatch = regRefObj.Match(m.ToString()); + int dbid = System.Convert.ToInt32(myMatch.Groups[2].Value.Substring(0, 4), 16); + int rodbid = int.Parse(myMatch.Groups[3].Value); + ROFstInfo myROFst = _MyItemInfo.MyDocVersion.GetROFst(rodbid); + if (myROFst.IsSetpointDB(dbid)) newvalue = ReplaceSpaceWithHardspace(newvalue); if (g.ToString() != newvalue) text = text.Substring(0, g.Index) + newvalue + text.Substring(g.Index + g.Length); } } return text; } - private static Regex _RegExReplaceSpaceWithHardspace = new Regex(@"((\\[^\\ \?]+)*\\[^\\ \?]+[ ?])?( )"); + // Replace spaces with hardspaces, but DO NOT replace the end of an Rtf Command with a hardspace private string ReplaceSpaceWithHardspace(string newvalue) { - return _RegExReplaceSpaceWithHardspace.Replace(newvalue, @"$1\u160?"); + string oldvalue = newvalue; + int spindx = newvalue.IndexOf(" "); + int lstindx = -1; + while (spindx >= 0) + { + if (!EndsRtfCommand(newvalue, spindx, lstindx)) + { + newvalue = newvalue.Remove(spindx, 1); + newvalue = newvalue.Insert(spindx, @"\u160?"); + } + lstindx = spindx; + spindx = (spindx + 1 >= newvalue.Length)?spindx = -1: newvalue.IndexOf(" ", spindx+1); + } + return newvalue; + } + + private bool EndsRtfCommand(string str, int spindx, int previndx) + { + // get text from last space to current, or from beginning of string to current: + int start = previndx < 0 ? 0 : previndx+1; + string substring = str.Substring(start, spindx-start); + if (substring.Contains(@"\")) + { + // is space ending an rtf command. + int startCmd = substring.LastIndexOf(@"\"); + string Cmd = substring.Substring(startCmd); + char tst = Cmd[1]; + // consider rtf commands up/dn/b/ul/i + if (tst == 'u' || tst == 'd' || tst == 'b' || tst == 'u' || tst == 'i') return true; + } + return false; } private string DoTransitionAdjustments(string text) { @@ -1495,13 +1530,13 @@ namespace Volian.Controls.Library { return link.Contains("#Link:Transition"); } - private static Regex regRefObj = new Regex(@"\#Link\:ReferencedObject\:([0-9]*) ([0-9]*) ([0-9]*)", RegexOptions.Singleline); + private static Regex regRefObj = new Regex(@"\#Link\:ReferencedObject:([0-9]*) ([0-9a-zA-Z]*) ([0-9]*)", RegexOptions.Singleline); private static bool IsSetpointRO(string link, DocVersionInfo myDocVersion) { Match myMatch = regRefObj.Match(link); if (myMatch.Success) { - int dbid = int.Parse(myMatch.Groups[2].Value.Substring(0, 4)); + int dbid = System.Convert.ToInt32(myMatch.Groups[2].Value.Substring(0, 4), 16); int rodbid = int.Parse(myMatch.Groups[3].Value); ROFstInfo myROFst = myDocVersion.GetROFst(rodbid); return myROFst.IsSetpointDB(dbid);