Exemple #1
0
        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;
            }
        }
Exemple #2
0
        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);
            }
        }
Exemple #3
0
        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);
            }
        }
Exemple #4
0
        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);
        }
Exemple #5
0
        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;
            }
        }
Exemple #6
0
 private static bool ParseInteger(StylesheetEntry entry, out int result)
 {
     return(int.TryParse(entry.Text, NumberStyles.Integer, CultureInfo.InvariantCulture, out result) && result >= 0);
 }
Exemple #7
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);
        }