示例#1
0
        private static CambridgeWordInfo.Entry ParseEntryFromEntryElement(IParentNode entryElement)
        {
            var entry = new CambridgeWordInfo.Entry();

            var headWordElement = entryElement.QuerySelector(".headword > span.hw");

            if (headWordElement == null)
            {
                headWordElement = entryElement.QuerySelector(".headword > span.phrase");
            }
            if (headWordElement != null)
            {
                entry.ActualWord = headWordElement.TextContent;
            }
            else
            {
                return(null);
            }

            var labelElement = entryElement.QuerySelector(".posgram > span.pos");

            if (labelElement != null)
            {
                entry.Label = labelElement.TextContent;
            }

            entry.Definitions = ParseDefBlocksFromEntryElement(entryElement);
            return(entry);
        }
示例#2
0
        private void InvalidateRow()
        {
            if (_wordInfo == null)
            {
                return;
            }

            _entry = _wordInfo.Entries[EntryIndex];
            SubItems.Clear();

            Text = _entry.ActualWord;
            SubItems.Add(_entry.Label);

            var definitionBlock = _entry.Definitions[DefinitionIndex];

            if (definitionBlock.Examples == null)
            {
                SubItems.Add("No examples.");
            }
            else
            {
                SubItems.Add(definitionBlock.Examples.Count.ToString());
            }
            SubItems.Add(definitionBlock.Definition);
        }
示例#3
0
        private void ProcessEditWordDefinitionDialog(EditWordDefinitionForm dialog)
        {
            CambridgeWordInfo.Entry entry;
            if (WordInfo.Entries.Count != 0 && WordInfo.Entries.Count >= dialog.EntryIndex + 1)
            {
                entry = WordInfo.Entries[dialog.EntryIndex];
                if (entry.ActualWord == dialog.Word && entry.Label == dialog.Label)
                {
                    return;
                }
            }

            entry             = new CambridgeWordInfo.Entry();
            entry.ActualWord  = dialog.Word;
            entry.Definitions = new List <CambridgeWordInfo.Block>();
            entry.Label       = dialog.Label;
            WordInfo.Entries.Add(entry);
        }
示例#4
0
        public string Render(CambridgeWordInfo wordInfo)
        {
            CambridgeWordInfo.Entry previousEntry = null;

            var blocksHtml = Resources.BlocksFormat;

            var entryBuilder = new StringBuilder();

            for (int index = 0; index < wordInfo.Entries.Count; index++)
            {
                var actualWordDoesntEqualInput = !string.Equals(wordInfo.Entries[index].ActualWord, wordInfo.InputWord,
                                                                StringComparison.CurrentCultureIgnoreCase);
                var currentActualWordIsPreviousActualWord =
                    previousEntry != null && previousEntry.ActualWord != wordInfo.Entries[index].ActualWord;

                var entryHtml = Resources.EntryFormat;

                if (index == 0 && wordInfo.InputWord == wordInfo.Entries[0].ActualWord)
                {
                    entryHtml = entryHtml.Replace("{{ActualWord}}", string.Empty);
                }
                else if (!actualWordDoesntEqualInput && !currentActualWordIsPreviousActualWord)
                {
                    entryHtml = entryHtml.Replace("{{ActualWord}}", string.Empty);
                }
                else
                {
                    entryHtml = entryHtml.Replace("{{ActualWord}}", $"<div class=\"word\">{wordInfo.Entries[index].ActualWord}</div>");
                }

                if (string.IsNullOrWhiteSpace(wordInfo.Entries[index].Label))
                {
                    entryHtml = entryHtml.Replace("<p class=\"label\">[{{Label}}]</p>", string.Empty);
                }
                else
                {
                    entryHtml = entryHtml.Replace("{{Label}}", wordInfo.Entries[index].Label);
                }

                var scopeBuilder = new StringBuilder();
                foreach (var definition in wordInfo.Entries[index].Definitions)
                {
                    var scopeFormat = Resources.ScopeFormat.Replace("{{Definition}}", definition.Definition);
                    if (definition.Examples == null)
                    {
                        scopeFormat = scopeFormat.Replace("<div class=\"examples\">{{Examples}}</div>", string.Empty);
                    }
                    else
                    {
                        var examplesBuilder = new StringBuilder();
                        foreach (var example in definition.Examples)
                        {
                            if (string.IsNullOrWhiteSpace(example))
                            {
                                continue;
                            }

                            int offset = 0;
                            if (wordInfo.Entries[index].ActualWord.StartsWith("-"))
                            {
                                offset = 1;
                            }

                            var pattern          = $"\\b\\w*{wordInfo.Entries[index].ActualWord.Substring(offset, wordInfo.Entries[index].ActualWord.Length - (2 + offset))}\\w*\\b";
                            var replacement      = "<span class=\"highlighted\">$&</span>";
                            var formattedExample = Regex.Replace(example, pattern, replacement, RegexOptions.IgnoreCase);
                            examplesBuilder.AppendLine(Resources.ExampleFormat.Replace("{{Example}}", formattedExample));
                        }
                        scopeFormat = scopeFormat.Replace("{{Examples}}", examplesBuilder.ToString());
                    }
                    scopeBuilder.Append(scopeFormat);
                }
                entryHtml = entryHtml.Replace("{{Scope}}", scopeBuilder.ToString());
                entryBuilder.AppendLine(entryHtml);

                previousEntry = wordInfo.Entries[index];
            }

            return(HtmlMinifier.Minify(blocksHtml.Replace("{{Blocks}}", entryBuilder.ToString())));
        }