private static void ParseTextProperties(UsfmMarker qTag, StylesheetEntry entry) { string text = entry.Text.ToLowerInvariant(); string[] parts = text.Split(); foreach (string part in parts) { if (part.Trim() == "") { continue; } UsfmTextProperties textProperty; if (TextPropertyMappings.TryGetValue(part, out textProperty)) { qTag.TextProperties |= textProperty; } } if ((qTag.TextProperties & UsfmTextProperties.Nonpublishable) > 0) { qTag.TextProperties &= ~UsfmTextProperties.Publishable; } }
private void Parse(string stylesheetFileName) { List <StylesheetEntry> entries = SplitStylesheet(File.ReadAllLines(stylesheetFileName)); HashSet <string> foundStyles = new HashSet <string>(); for (int i = 0; i < entries.Count; ++i) { StylesheetEntry entry = entries[i]; if (entry.Marker != "marker") { continue; } string[] parts = entry.Text.Split(); if (parts.Length > 1 && parts[1] == "-") { // If the entry looks like "\marker xy -" remove the tag and its end tag if any _markers.Remove(parts[0]); _markers.Remove(parts[0] + "*"); continue; } UsfmMarker marker = CreateMarker(entry.Text); UsfmMarker endMarker = ParseMarkerEntry(marker, entries, i + 1); if (endMarker != null && !_markers.ContainsKey(endMarker.Marker)) { _markers[endMarker.Marker] = endMarker; } foundStyles.Add(entry.Text); } }
private void Parse(string stylesheetFileName) { IEnumerable <string> lines; if (File.Exists(stylesheetFileName)) { lines = File.ReadAllLines(stylesheetFileName); } else { string fileName = Path.GetFileName(stylesheetFileName); if (fileName == "usfm.sty" || fileName == "usfm_sb.sty") { lines = GetEmbeddedStylesheet(fileName); } else { throw new ArgumentException("The stylesheet does not exist.", nameof(stylesheetFileName)); } } List <StylesheetEntry> entries = SplitStylesheet(lines); HashSet <string> foundStyles = new HashSet <string>(); for (int i = 0; i < entries.Count; ++i) { StylesheetEntry entry = entries[i]; if (entry.Marker != "marker") { continue; } string[] parts = entry.Text.Split(); if (parts.Length > 1 && parts[1] == "-") { // If the entry looks like "\marker xy -" remove the tag and its end tag if any _markers.Remove(parts[0]); _markers.Remove(parts[0] + "*"); continue; } UsfmMarker marker = CreateMarker(entry.Text); UsfmMarker endMarker = ParseMarkerEntry(marker, entries, i + 1); if (endMarker != null && !_markers.ContainsKey(endMarker.Marker)) { _markers[endMarker.Marker] = endMarker; } foundStyles.Add(entry.Text); } }
private static bool ParseFloat(StylesheetEntry entry, out int result) { float floatResult; if (float.TryParse(entry.Text, NumberStyles.Float | NumberStyles.AllowThousands, CultureInfo.InvariantCulture, out floatResult)) { result = (int)(floatResult * 1000); return(true); } result = 0; return(false); }
private static void ParseTextType(UsfmMarker qTag, StylesheetEntry entry) { if (entry.Text.Equals("chapternumber", StringComparison.OrdinalIgnoreCase)) { qTag.TextProperties |= UsfmTextProperties.Chapter; } if (entry.Text.Equals("versenumber", StringComparison.CurrentCultureIgnoreCase)) { qTag.TextProperties |= UsfmTextProperties.Verse; } UsfmTextType textType; if (TextTypeMappings.TryGetValue(entry.Text, out textType)) { qTag.TextType = textType; } }
private static bool ParseInteger(StylesheetEntry entry, out int result) { return(int.TryParse(entry.Text, NumberStyles.Integer, CultureInfo.InvariantCulture, out result) && result >= 0); }
private static UsfmMarker ParseMarkerEntry(UsfmMarker marker, List <StylesheetEntry> stylesheetEntries, int entryIndex) { // The following items are present for conformance with // Paratext release 5.0 stylesheets. Release 6.0 and later // follows the guidelines set in InitPropertyMaps. // Make sure \id gets book property if (marker.Marker == "id") { marker.TextProperties |= UsfmTextProperties.Book; } UsfmMarker endMarker = null; while (entryIndex < stylesheetEntries.Count) { StylesheetEntry entry = stylesheetEntries[entryIndex]; ++entryIndex; if (entry.Marker == "marker") { break; } switch (entry.Marker) { case "name": marker.Name = entry.Text; break; case "description": marker.Description = entry.Text; break; case "fontname": marker.FontName = entry.Text; break; case "fontsize": if (entry.Text == "-") { marker.FontSize = 0; } else { int fontSize; if (ParseInteger(entry, out fontSize)) { marker.FontSize = fontSize; } } break; case "xmltag": marker.XmlTag = entry.Text; break; case "encoding": marker.Encoding = entry.Text; break; case "linespacing": int lineSpacing; if (ParseInteger(entry, out lineSpacing)) { marker.LineSpacing = lineSpacing; } break; case "spacebefore": int spaceBefore; if (ParseInteger(entry, out spaceBefore)) { marker.SpaceBefore = spaceBefore; } break; case "spaceafter": int spaceAfter; if (ParseInteger(entry, out spaceAfter)) { marker.SpaceAfter = spaceAfter; } break; case "leftmargin": int leftMargin; if (ParseInteger(entry, out leftMargin)) { marker.LeftMargin = leftMargin; } break; case "rightmargin": int rightMargin; if (ParseInteger(entry, out rightMargin)) { marker.RightMargin = rightMargin; } break; case "firstlineindent": int firstLineIndent; if (ParseFloat(entry, out firstLineIndent)) { marker.FirstLineIndent = firstLineIndent; } break; case "rank": if (entry.Text == "-") { marker.Rank = 0; } else { int rank; if (ParseInteger(entry, out rank)) { marker.Rank = rank; } } break; case "bold": marker.Bold = entry.Text != "-"; break; case "smallcaps": marker.SmallCaps = entry.Text != "-"; break; case "subscript": marker.Subscript = entry.Text != "-"; break; case "italic": marker.Italic = entry.Text != "-"; break; case "regular": marker.Italic = marker.Bold = marker.Superscript = false; marker.Regular = true; break; case "underline": marker.Underline = entry.Text != "-"; break; case "superscript": marker.Superscript = entry.Text != "-"; break; case "testylename": break; // Ignore this tag, later we will use it to tie to FW styles case "notrepeatable": marker.NotRepeatable = entry.Text != "-"; break; case "textproperties": ParseTextProperties(marker, entry); break; case "texttype": ParseTextType(marker, entry); break; case "color": if (entry.Text == "-") { marker.Color = 0; } else { int color; if (ParseInteger(entry, out color)) { marker.Color = color; } } break; case "justification": UsfmJustification justification; if (JustificationMappings.TryGetValue(entry.Text, out justification)) { marker.Justification = justification; } break; case "styletype": UsfmStyleType styleType; if (StyleMappings.TryGetValue(entry.Text, out styleType)) { marker.StyleType = styleType; } break; case "occursunder": marker.OccursUnder.UnionWith(entry.Text.Split(new[] { " " }, StringSplitOptions.RemoveEmptyEntries)); break; case "endmarker": endMarker = MakeEndMarker(entry.Text); marker.EndMarker = entry.Text; break; } } // If we have not seen an end marker but this is a character style if (marker.StyleType == UsfmStyleType.Character && endMarker == null) { string endMarkerStr = marker.Marker + "*"; endMarker = MakeEndMarker(endMarkerStr); marker.EndMarker = endMarkerStr; } // Special cases if (marker.TextType == UsfmTextType.Other && (marker.TextProperties & UsfmTextProperties.Nonpublishable) == 0 && (marker.TextProperties & UsfmTextProperties.Chapter) == 0 && (marker.TextProperties & UsfmTextProperties.Verse) == 0 && (marker.StyleType == UsfmStyleType.Character || marker.StyleType == UsfmStyleType.Paragraph)) { marker.TextProperties |= UsfmTextProperties.Publishable; } return(endMarker); }