31 private bool capturePhoneticCharacters;
32 private readonly List<PhoneticInfo> phoneticsInfo;
33 private Stream stream;
66 phoneticsInfo =
new List<PhoneticInfo>();
79 public void Init(Stream stream,
Workbook workbook, IOptions readerOptions, Action<Stream, Workbook, string, IOptions, int?> inlinePluginHandler)
82 this.Workbook = workbook;
83 this.Options = readerOptions;
84 this.InlinePluginHandler = inlinePluginHandler;
85 if (readerOptions is ReaderOptions options)
87 this.capturePhoneticCharacters = options.EnforcePhoneticCharacterImport;
101 StringBuilder sb =
new StringBuilder();
102 using (XmlReader reader = XmlReader.Create(stream, XmlStreamUtils.CreateSettings()))
104 while (reader.Read())
106 if (!XmlStreamUtils.IsElement(reader,
"si"))
111 ReadSiElement(reader, sb);
112 if (capturePhoneticCharacters)
127 throw new IOException(
"The XML entry could not be read from the " + nameof(stream) +
". Please see the inner exception:", ex);
135 private void ReadSiElement(XmlReader reader, StringBuilder sb)
137 using (XmlReader siSubtree = reader.ReadSubtree())
140 while (siSubtree.Read())
142 if (siSubtree.NodeType != XmlNodeType.Element)
146 if (siSubtree.LocalName.Equals(
"rPh", StringComparison.OrdinalIgnoreCase))
148 if (capturePhoneticCharacters)
150 ReadPhoneticElement(siSubtree);
154 using (siSubtree.ReadSubtree()) { }
157 else if (siSubtree.LocalName.Equals(
"t", StringComparison.OrdinalIgnoreCase))
160 using (XmlReader tSubtree = siSubtree.ReadSubtree())
163 text = tSubtree.ReadElementContentAsString();
165 if (!
string.IsNullOrEmpty(text))
178 private void ReadPhoneticElement(XmlReader reader)
180 string start = reader.GetAttribute(
"sb");
181 string end = reader.GetAttribute(
"eb");
183 using (XmlReader rPhSubtree = reader.ReadSubtree())
186 while (rPhSubtree.Read())
188 if (rPhSubtree.NodeType == XmlNodeType.Element
189 && rPhSubtree.LocalName.Equals(
"t", StringComparison.OrdinalIgnoreCase))
191 text = rPhSubtree.ReadElementContentAsString();
195 if (!
string.IsNullOrEmpty(text))
197 phoneticsInfo.Add(
new PhoneticInfo(text, start, end));
206 private string ProcessPhoneticCharacters(StringBuilder sb)
208 if (phoneticsInfo.Count == 0)
210 return sb.ToString();
212 string text = sb.ToString();
213 StringBuilder sb2 =
new StringBuilder();
214 int currentTextIndex = 0;
215 foreach (PhoneticInfo info
in phoneticsInfo)
217 sb2.Append(text.Substring(currentTextIndex, info.StartIndex + info.Length - currentTextIndex));
218 sb2.Append(
'(').Append(info.Value).Append(
')');
219 currentTextIndex = info.StartIndex + info.Length;
221 sb2.Append(text.Substring(currentTextIndex));
223 phoneticsInfo.Clear();
224 return sb2.ToString();
235 sealed class PhoneticInfo
240 public string Value {
get;
private set; }
244 public int StartIndex {
get;
private set; }
248 public int Length {
get;
private set; }
256 public PhoneticInfo(
string value,
string start,
string end)
259 StartIndex = ParserUtils.ParseInt(start);
260 Length = ParserUtils.ParseInt(end) - StartIndex;
Action< Stream, Workbook, string, IOptions, int?> InlinePluginHandler
Reference to the ReaderPlugInHandler, to be used for post operations in the Execute method.
void Init(Stream stream, Workbook workbook, IOptions readerOptions, Action< Stream, Workbook, string, IOptions, int?> inlinePluginHandler)
Initialization method (interface implementation).