31 private bool capturePhoneticCharacters;
32 private readonly List<PhoneticInfo> phoneticsInfo;
33 private Stream stream;
41 public virtual string DocumentType {
get {
return @"http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings"; } }
71 phoneticsInfo =
new List<PhoneticInfo>();
84 public void Init(Stream stream,
Workbook workbook, IOptions readerOptions, Action<Stream, Workbook, string, IOptions, int?> inlinePluginHandler)
87 this.Workbook = workbook;
88 this.Options = readerOptions;
89 this.InlinePluginHandler = inlinePluginHandler;
90 if (readerOptions is ReaderOptions options)
92 this.capturePhoneticCharacters = options.EnforcePhoneticCharacterImport;
106 StringBuilder sb =
new StringBuilder();
107 using (XmlReader reader = XmlReader.Create(stream, XmlStreamUtils.CreateSettings()))
109 while (reader.Read())
111 if (!XmlStreamUtils.IsElement(reader,
"si"))
116 ReadSiElement(reader, sb);
117 if (capturePhoneticCharacters)
132 throw new IOException(
"The XML entry could not be read from the " + nameof(stream) +
". Please see the inner exception:", ex);
140 private void ReadSiElement(XmlReader reader, StringBuilder sb)
142 using (XmlReader siSubtree = reader.ReadSubtree())
145 while (siSubtree.Read())
147 if (siSubtree.NodeType != XmlNodeType.Element)
151 if (siSubtree.LocalName.Equals(
"rPh", StringComparison.OrdinalIgnoreCase))
153 if (capturePhoneticCharacters)
155 ReadPhoneticElement(siSubtree);
159 using (siSubtree.ReadSubtree()) { }
162 else if (siSubtree.LocalName.Equals(
"t", StringComparison.OrdinalIgnoreCase))
165 using (XmlReader tSubtree = siSubtree.ReadSubtree())
168 text = tSubtree.ReadElementContentAsString();
170 if (!
string.IsNullOrEmpty(text))
183 private void ReadPhoneticElement(XmlReader reader)
185 string start = reader.GetAttribute(
"sb");
186 string end = reader.GetAttribute(
"eb");
188 using (XmlReader rPhSubtree = reader.ReadSubtree())
191 while (rPhSubtree.Read())
193 if (rPhSubtree.NodeType == XmlNodeType.Element
194 && rPhSubtree.LocalName.Equals(
"t", StringComparison.OrdinalIgnoreCase))
196 text = rPhSubtree.ReadElementContentAsString();
200 if (!
string.IsNullOrEmpty(text))
202 phoneticsInfo.Add(
new PhoneticInfo(text, start, end));
211 private string ProcessPhoneticCharacters(StringBuilder sb)
213 if (phoneticsInfo.Count == 0)
215 return sb.ToString();
217 string text = sb.ToString();
218 StringBuilder sb2 =
new StringBuilder();
219 int currentTextIndex = 0;
220 foreach (PhoneticInfo info
in phoneticsInfo)
222 sb2.Append(text.Substring(currentTextIndex, info.StartIndex + info.Length - currentTextIndex));
223 sb2.Append(
'(').Append(info.Value).Append(
')');
224 currentTextIndex = info.StartIndex + info.Length;
226 sb2.Append(text.Substring(currentTextIndex));
228 phoneticsInfo.Clear();
229 return sb2.ToString();
240 sealed class PhoneticInfo
245 public string Value {
get;
private set; }
249 public int StartIndex {
get;
private set; }
253 public int Length {
get;
private set; }
261 public PhoneticInfo(
string value,
string start,
string end)
264 StartIndex = ParserUtils.ParseInt(start);
265 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).