Markdown
- Краен срок:
- 03.12.2013 17:00
- Точки:
- 10
Срокът за предаване на решения е отминал
MarkdownParser
В тази задача ще се наложи да парсваме markdown документи. За целта ще ви предоставим статия, написана на markdown, от която вие трябва да извлечете заглавия, линкове, имена и друга основни за статията неща.
type MarkdownParser
func NewMarkdownParser(text string) *MarkdownParser
Връща указател към MarkdownParser
.
func (mp *MarkdownParser) Headers() []string
Връща всички H1 хедъри като слайс от стрингове. Обърнете внимание, че има два начина, по които може да се дефинира H1 хедър.
func (mp *MarkdownParser) SubHeadersOf(header string) []string
Приема H1 хедър и връща слайс от стринговете на всички H2 хедъри, които са дефинирани след подадения H1 хедър и преди следващия такъв. H3, H4, H5 и H6 хедъри не ни интересуват. Обърнете внимание, че има два начина, по които може да се дефинира H2 хедър.
func (mp *MarkdownParser) Names() []string
Връща всички имена в текста. За име приемаме две или повече поредни думи с главни букви (допустими са тирета между две думи с или без интервал между тях), игнорирайки първата дума в изречението. В този смисъл следните са имена:
- Иван Павлов
- Георги Кранев
- Иван Ковачев Павлов
- Едсон Арантес Ду Насименто - Пеле
- Mozilla Firefox
Забележка: От првилото да игнорирате първата дума в изречение следва, че в изречението "Георги Кранев е много забавен." няма име.
func (mp *MarkdownParser) PhoneNumbers() []string
Връща всички телефонни номера в текста. Не се интересуваме от броя цифри, нито от префиските им (демек не очакваме само български номера). Преди цифрите може да има плюс и отваряща скоба, а между тях - интервали, скоби и тирета. В този смисъл следните са телефонни номера:
- 0889123456
- +359889123456
- (089) 123-456
- 0 (889) 123 - 456
- +4531223 2332 123
- 123 3456 621
func (mp *MarkdownParser) Links() []string
Връща всички изходящи линкове. Пишейки "линк" си мислим за Uniform resource locator.
Т.е. очакваният формат е scheme://domain:port/path?query_string#fragment_id
.
От тези само схемата, домейнът и пътят са задължителни(/ е валиден път).
Запознайте се с това къде какви символи са позволени.
func (mp *MarkdownParser) Emails() []string
Връща всички Email адреси в текста. Не очакваме да напишете регулярен израз, който да валидира абсолютно всички email адреси.
Валиден email адрес ще наричаме всяка последователност от символи, която:
- започва с малка, главна буква или цифра
- опционално могат да следват до 200 други букви, цифри, долни черти, плюсове, точки или тирета
- символ @
- валиден домейн
func (mp *MarkdownParser) GenerateTableOfContents() string
Връща съдържанието на подадения текст, като номериран списък. Всяка точка в номерирания списък е H1 хедър. Под-точка на тази точка е H2 хедър, под-под-точка е H3 хедър на предния H2 хедър и т.н. до H6.
Пример
За целите на примера, ще подадем условието на това домашно като вход:
>>> mdParser := NewMarkdownParser(data)
>>> mdParser.Headers()
<<< []string{"MarkdownParser"}
>>> mdParser.SubHeadersOf("MarkdownParser")
<<< []string{"type MarkdownParser", "Пример"}
>>> mdParser.GenerateTableOfContents()
<<< 1. MarkdownParser
<<< 1.1 type MarkdownParser
<<< 1.1.1 `func NewMarkdownParser(text string) *MarkdownParser`
<<< 1.1.2 `func (mp *MarkdownParser) Headers() []string`
<<< 1.1.3 `func (mp *MarkdownParser) SubHeadersOf(header string) []string`
<<< 1.1.4 `func (mp *MarkdownParser) Names() []string`
<<< 1.1.5 `func (mp *MarkdownParser) PhoneNumbers() []string`
<<< 1.1.6 `func (mp *MarkdownParser) Links() []string`
<<< 1.1.7 `func (mp *MarkdownParser) Emails() []string`
<<< 1.1.8 `func (mp *MarkdownParser) GenerateTableOfContents() string`
<<< 1.2 Пример