// (c) Copyright Microsoft Corporation.
// This source is subject to the Microsoft Public License (Ms-PL).
// Please see http://go.microsoft.com/fwlink/?LinkID=131993 for details.
// All other rights reserved.
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Windows;
using System.Windows.Resources;
namespace testNewControls.Data
{
public static class Extension
{
public static T Next(this Random rnd, IList list)
{
return list[rnd.Next(list.Count)];
}
}
///
/// A class to return paragraphs of random sentences or a word list from lorem ipsum data.
///
public class LoremIpsum : IEnumerable
{
public enum Capitalization
{
None,
FirstWord,
AllWords
}
private static Random _rnd = new Random(42);
private static StringBuilder _builder = new StringBuilder();
private static List _sentences;
private static List _words;
///
/// Returns random lorem ipsum sentences combined into a single string.
///
/// The nunmber of sentences.
/// The paragraph, composed of random sentences.
public static string GetParagraph(int sentenceCount)
{
EnsureSentences();
_builder.Length = 0;
while (sentenceCount-- > 0)
{
_builder.Append(_rnd.Next(_sentences));
if (sentenceCount > 0)
{
_builder.Append(' ');
}
}
return _builder.ToString();
}
///
/// Return an alphabetized, lower-case list of lorem ipsum words.
///
public static ICollection Words
{
get
{
EnsureWords();
return (ICollection)_words;
}
}
///
/// Get a string composed of random lorem ipsum words. Will not end with punctuation.
///
/// Number of words.
/// How to capitalize the words.
///
public static string GetWords(int wordCount, Capitalization capitalization)
{
EnsureWords();
_builder.Length = 0;
while (wordCount-- > 0)
{
int position = _builder.Length;
_builder.Append(_rnd.Next(_words));
if (capitalization == Capitalization.AllWords || (position == 0 && capitalization == Capitalization.FirstWord))
{
_builder[position] = char.ToUpper(_builder[position]);
}
if (wordCount > 0)
{
_builder.Append(' ');
}
}
return _builder.ToString();
}
///
/// Enumerates the Words property.
///
/// The enumerator.
public IEnumerator GetEnumerator()
{
return LoremIpsum.Words.GetEnumerator();
}
///
/// Enumerates the Words property.
///
/// The enumerator.
IEnumerator IEnumerable.GetEnumerator()
{
return LoremIpsum.Words.GetEnumerator();
}
///
/// Reads the lorem ipsum sentences. Supplies some data in case reading fails, which
/// it will do at design time.
///
private static void EnsureSentences()
{
if (_sentences == null)
{
_sentences = new List();
StreamResourceInfo info = Application.GetResourceStream(new Uri("Data/LoremIpsum.txt", UriKind.Relative));
if (info != null)
{
Stream stream = info.Stream;
if (stream != null)
{
using (StreamReader reader = new StreamReader(stream))
{
while (!reader.EndOfStream)
{
_sentences.Add(reader.ReadLine());
}
};
}
}
if (_sentences.Count == 0)
{
_sentences.Add("Lorem ipsum dolor sit amet, consectetuer adipiscing elit.");
_sentences.Add("Maecenas porttitor congue massa.");
_sentences.Add("Fusce posuere, magna sed pulvinar ultricies, purus lectus malesuada libero, sit amet commodo magna eros quis urna.");
_sentences.Add("Nunc viverra imperdiet enim.");
_sentences.Add("Fusce est.");
}
}
}
///
/// Creates an alphabetized list of the words from the lorem ipsum text.
///
private static void EnsureWords()
{
char[] separators = { ' ', ',', '.' };
EnsureSentences();
if (_words == null)
{
Dictionary temp = new Dictionary();
foreach (string sentence in _sentences)
{
string[] words = sentence.Split(separators, StringSplitOptions.RemoveEmptyEntries);
foreach (string word in words)
{
temp[word.ToLower()] = null;
}
}
_words = new List(temp.Keys);
_words.Sort();
}
}
}
}