From e07548d703798bfd661c1ab89cc3b48c936d0a77 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Thu, 4 Mar 2010 20:08:25 +0000
Subject: move linden notecard parsing from LSL_Api.cs to SLUtil so that region
modules can use it
---
OpenSim/Framework/SLUtil.cs | 99 ++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 98 insertions(+), 1 deletion(-)
(limited to 'OpenSim/Framework')
diff --git a/OpenSim/Framework/SLUtil.cs b/OpenSim/Framework/SLUtil.cs
index 9d5c30a..ff5f8b9 100644
--- a/OpenSim/Framework/SLUtil.cs
+++ b/OpenSim/Framework/SLUtil.cs
@@ -1,4 +1,5 @@
using System;
+using System.Collections.Generic;
using OpenMetaverse;
namespace OpenSim.Framework
@@ -181,5 +182,101 @@ namespace OpenSim.Framework
}
#endregion SL / file extension / content-type conversions
+
+ ///
+ /// Parse a notecard in Linden format to a string of ordinary text.
+ ///
+ ///
+ ///
+ public static string ParseNotecardToString(string rawInput)
+ {
+ return string.Join("\n", ParseNotecardToList(rawInput).ToArray());
+ }
+
+ ///
+ /// Parse a notecard in Linden format to a list of ordinary lines.
+ ///
+ ///
+ ///
+ public static List ParseNotecardToList(string rawInput)
+ {
+ string[] input = rawInput.Replace("\r", "").Split('\n');
+ int idx = 0;
+ int level = 0;
+ List output = new List();
+ string[] words;
+
+ while (idx < input.Length)
+ {
+ if (input[idx] == "{")
+ {
+ level++;
+ idx++;
+ continue;
+ }
+
+ if (input[idx]== "}")
+ {
+ level--;
+ idx++;
+ continue;
+ }
+
+ switch (level)
+ {
+ case 0:
+ words = input[idx].Split(' '); // Linden text ver
+ // Notecards are created *really* empty. Treat that as "no text" (just like after saving an empty notecard)
+ if (words.Length < 3)
+ return output;
+
+ int version = int.Parse(words[3]);
+ if (version != 2)
+ return output;
+ break;
+ case 1:
+ words = input[idx].Split(' ');
+ if (words[0] == "LLEmbeddedItems")
+ break;
+ if (words[0] == "Text")
+ {
+ int len = int.Parse(words[2]);
+ idx++;
+
+ int count = -1;
+
+ while (count < len)
+ {
+ // int l = input[idx].Length;
+ string ln = input[idx];
+
+ int need = len-count-1;
+ if (ln.Length > need)
+ ln = ln.Substring(0, need);
+
+ output.Add(ln);
+ count += ln.Length + 1;
+ idx++;
+ }
+
+ return output;
+ }
+ break;
+ case 2:
+ words = input[idx].Split(' '); // count
+ if (words[0] == "count")
+ {
+ int c = int.Parse(words[1]);
+ if (c > 0)
+ return output;
+ break;
+ }
+ break;
+ }
+ idx++;
+ }
+
+ return output;
+ }
}
-}
+}
\ No newline at end of file
--
cgit v1.1