public JournalFrontMatter(IEnumerable <string> tags, ReadmeExpression readmeExpression)
 {
     Tags = tags?.Distinct().OrderBy(x => x).ToList();
     readmeExpression ??= ReadmeExpression.Empty();
     Readme     = readmeExpression.FormattedExpirationDate;
     ReadmeDate = readmeExpression.ExpirationDate;
 }
        public void EmptyExpression_ReturnsNullProperties_Always()
        {
            var exp = ReadmeExpression.Empty();

            exp.ExpirationDate.Should().BeNull();
            exp.FormattedExpirationDate.Should().BeNull();
        }
Пример #3
0
        public void CreateCompiledEntry(ICollection <IJournalEntry> entries, bool overwrite)
        {
            if (entries == null || !entries.Any())
            {
                throw new ArgumentException("No entries were provided. At least one entry must be provided.", nameof(entries));
            }

            var convertedEntries = entries.Select(x => new JournalEntryFile(x.GetReader())).OrderBy(x => x.EntryDate).ToList();
            var range            = new DateRange(convertedEntries.First().EntryDate, convertedEntries.Last().EntryDate);

            var journalWriter = _readerWriterFactory.CreateWriter();
            var entryFilePath = journalWriter.GetCompiledJournalEntryFilePath(range);

            if (journalWriter.EntryExists(entryFilePath) && !overwrite)
            {
                throw new JournalEntryAlreadyExistsException(entryFilePath);
            }

            var aggregatedTags = convertedEntries.SelectMany(x => x.Tags).Distinct();
            var content        = string.Join(Environment.NewLine, convertedEntries.Select(x => x.Body));

            var frontMatter = new JournalFrontMatter(aggregatedTags, ReadmeExpression.Empty());

            journalWriter.CreateCompiled(frontMatter, entryFilePath, content);
            _systemProcess.Start(entryFilePath);
        }
Пример #4
0
        /// <summary>
        /// Creates a single journal entry comprised of all entries found which match the specified criteria.
        /// </summary>
        /// <param name="range">The date range to search for entries. Dates are inclusive. Null values assume all entries are desired.</param>
        /// <param name="tags">Filters entries by tag. Null values assumes all tags are desired.</param>
        /// <param name="tagOperator">Indicates whether all tags must be matched, or if any tag can be matched.</param>
        /// <param name="overwrite">True to overwrite an existing compiled entry with the same name. Otherwise, an exception is thrown.</param>
        public void CreateCompiledEntry(DateRange range, string[] tags, TagOperator tagOperator, bool overwrite)
        {
            List <JournalEntryFile> entries;
            var hasTags = tags != null && tags.Length > 0;

            if (hasTags)
            {
                if (tagOperator == TagOperator.All)
                {
                    entries = CreateIndex <JournalEntryFile>(range, tags)
                              .SelectMany(x => x.Entries)
                              .OrderBy(x => x)
                              .Distinct()
                              .ToList();
                }
                else
                {
                    entries = CreateIndex <JournalEntryFile>(range)
                              .Where(x => tags.Contains(x.Tag))
                              .SelectMany(x => x.Entries)
                              .OrderBy(x => x)
                              .Distinct()
                              .ToList();
                }
            }
            else
            {
                entries = CreateIndex <JournalEntryFile>(range)
                          .SelectMany(x => x.Entries)
                          .OrderBy(x => x)
                          .Distinct()
                          .ToList();
            }

            if (entries.Count == 0)
            {
                throw new InvalidOperationException("No journal entries found matching the specified criteria. Please change your criteria and try again.");
            }

            range ??= new DateRange(entries.First().EntryDate, entries.Last().EntryDate);

            var journalWriter = _readerWriterFactory.CreateWriter();
            var entryFilePath = journalWriter.GetCompiledJournalEntryFilePath(range);

            if (journalWriter.EntryExists(entryFilePath) && !overwrite)
            {
                throw new JournalEntryAlreadyExistsException(entryFilePath);
            }

            var aggregatedTags = entries.SelectMany(x => x.Tags).Distinct();
            var content        = string.Join(Environment.NewLine, entries.Select(x => x.Body));

            var frontMatter = new JournalFrontMatter(aggregatedTags, ReadmeExpression.Empty());

            journalWriter.CreateCompiled(frontMatter, entryFilePath, content);
            _systemProcess.Start(entryFilePath);
        }
        public void This_DoesNotThrowExceptions_WhenTagsAndReadmeParserAreNull()
        {
            IEnumerable <string> tags             = null;
            ReadmeExpression     readmeExpression = null;
            var frontMatter = new JournalFrontMatter(tags, readmeExpression);

            frontMatter.Tags.Should().BeNull();
            frontMatter.Readme.Should().BeNull();
            frontMatter.ReadmeDate.Should().BeNull();
            frontMatter.IsEmpty().Should().BeTrue();
        }
        public string ToString(bool asFrontMatter)
        {
            var target     = IsEmpty() ? new JournalFrontMatter(new[] { "(untagged)" }, ReadmeExpression.Empty()) : this;
            var serializer = new SerializerBuilder().ConfigureDefaultValuesHandling(DefaultValuesHandling.OmitDefaults).Build();
            var yaml       = serializer.Serialize(target).Replace("- ", "  - ").Trim();

            return(asFrontMatter ? $"{BlockIndicator}{Environment.NewLine}{yaml}{Environment.NewLine}{BlockIndicator}{Environment.NewLine}" : yaml);
        }