42 Commits
1.0.3 ... 1.1.0

Author SHA1 Message Date
7d5d311ecb Merge pull request #19 from progsource/release_1.1.0
updated version info for 1.1.0
2019-02-19 03:12:53 +01:00
1f00ae90b2 updated version info for 1.1.0 2019-02-19 03:06:12 +01:00
b167316d52 Merge pull request #18 from progsource/appveyor
try out appveyor
2019-02-19 02:51:43 +01:00
3484198ade appveyor - use debug 2019-02-19 02:43:15 +01:00
c5c37a7627 appveyor - now? 2019-02-19 02:34:39 +01:00
0762f6cc5d appveyor - build this now.... 2019-02-19 02:31:16 +01:00
92db217966 appveyor - guess where the sln might be 2019-02-19 02:25:57 +01:00
b5a6628f44 appveyor - try to specify sln 2019-02-19 02:23:21 +01:00
371dc41aff appveyor do cmake before build 2019-02-19 02:21:00 +01:00
519c81eaab appveyor in test_script it is already in tmp 2019-02-19 02:12:54 +01:00
77a74fef56 appveyor on init the repo isn't cloned yet 2019-02-19 02:10:38 +01:00
81090b8ca7 init submodules for appveyor 2019-02-19 02:09:23 +01:00
0b00ee7137 VS 15 is 2017 version... 2019-02-19 02:06:19 +01:00
af6dd8f65a try out appveyor 2019-02-19 02:02:58 +01:00
ab567fc2f1 Merge pull request #17 from patrickelectric/windows
blockparser: Add missing includes to fix msvc builds
2019-02-19 01:27:59 +01:00
62c840bb77 blockparser: Add missing includes to fix msvc builds
Signed-off-by: Patrick José Pereira <patrickelectric@gmail.com>
2019-02-13 15:47:16 -02:00
8f0ec363fd Merge pull request #12 from patrickelectric/travis
Update travis gcc version and add macox/clang test
2018-10-25 20:11:16 +02:00
a84da9de61 emphasizedparser: Underscore does not need backslash
Signed-off-by: Patrick José Pereira <patrickelectric@gmail.com>
2018-10-25 14:51:50 -03:00
7c26aa0431 strongparser: Underscore does not need backslash
Signed-off-by: Patrick José Pereira <patrickelectric@gmail.com>
2018-10-25 14:51:49 -03:00
3c54e901c3 travis: Add macox/clang test
Signed-off-by: Patrick José Pereira <patrickelectric@gmail.com>
2018-10-25 14:51:49 -03:00
dae4b5bb35 travis: Move to gcc-7
Signed-off-by: Patrick José Pereira <patrickelectric@gmail.com>
2018-10-25 14:51:49 -03:00
0af145ab8f Merge pull request #15 from progsource/add-lineparser-dtro
added dtor to lineparser
2018-10-25 17:51:41 +02:00
8294841cf5 added dtor to lineparser 2018-10-25 17:45:52 +02:00
e6bd0bdb4f Merge pull request #14 from progsource/add-dtor
added BlockParser dtor
2018-10-25 17:35:40 +02:00
348532acb8 added BlockParser dtor 2018-10-25 17:26:25 +02:00
6af5374138 Merge pull request #13 from patrickelectric/test_italic
test_maddy_parser: Add italic test
2018-10-25 17:15:48 +02:00
c7eef2b34a test_maddy_parser: Add italic test
Signed-off-by: Patrick José Pereira <patrickelectric@gmail.com>
2018-10-25 12:01:25 -03:00
be681034e0 Merge pull request #10 from patrickelectric/add_italic
Add italic parser
2018-10-25 16:48:59 +02:00
78652f64d5 Merge branch 'master' into add_italic 2018-10-25 16:42:33 +02:00
b5f24f01a3 Merge pull request #9 from patrickelectric/more_bold
Add __ tag in bold parser and test
2018-10-25 16:41:54 +02:00
eae3b270c0 docs: Update italic and emphasized documentation
Signed-off-by: Patrick José Pereira <patrickelectric@gmail.com>
2018-10-25 11:36:22 -03:00
2562d780b8 test_maddy_parser: Update main test with emphasized tag
Signed-off-by: Patrick José Pereira <patrickelectric@gmail.com>
2018-10-25 11:36:22 -03:00
6e7aec7947 test_maddy_emphasizedparser: Update tests
Signed-off-by: Patrick José Pereira <patrickelectric@gmail.com>
2018-10-25 11:36:22 -03:00
ee42f7eae9 emphasizedparser: Move from *this* to _this_
Signed-off-by: Patrick José Pereira <patrickelectric@gmail.com>
2018-10-25 11:36:22 -03:00
e8ba8f661a test_maddy_italicparser: Add tests for the italic parser
Signed-off-by: Patrick José Pereira <patrickelectric@gmail.com>
2018-10-25 11:36:22 -03:00
9b37255346 italicparser: Add first version
Signed-off-by: Patrick José Pereira <patrickelectric@gmail.com>
2018-10-25 11:36:22 -03:00
a85ba0eec7 docs: Update strong documentation
Signed-off-by: Patrick José Pereira <patrickelectric@gmail.com>
2018-10-25 11:34:12 -03:00
7e56e82b6a AUTHORS: Add my name
Signed-off-by: Patrick José Pereira <patrickelectric@gmail.com>
2018-10-25 11:34:12 -03:00
62365f1c7c test_maddy_strongparser: Add tests to __ tag
Signed-off-by: Patrick José Pereira <patrickelectric@gmail.com>
2018-10-25 11:34:12 -03:00
eb2b4fa929 strongparser: Add __ tag
Signed-off-by: Patrick José Pereira <patrickelectric@gmail.com>
2018-10-25 11:34:08 -03:00
a19845cdb5 Merge pull request #11 from patrickelectric/fix_clang
blackparser: Add missing include
2018-10-25 08:48:53 +02:00
22c656f855 blackparser: Add missing include
Fix clang build

Signed-off-by: Patrick José Pereira <patrickelectric@gmail.com>
2018-10-22 20:16:13 -03:00
18 changed files with 269 additions and 61 deletions

View File

@ -8,5 +8,5 @@ indent_style = space
insert_final_newline = true
trim_trailing_whitespace = true
[*.{h,hh,hpp,c,cc,cpp,cxx}]
[*.{h,hh,hpp,c,cc,cpp,cxx,yml}]
indent_size = 2

View File

@ -1,14 +1,28 @@
dist: trusty
sudo: false
language: cpp
compiler: g++
install: export CXX="g++-6"
addons:
apt:
sources:
- ubuntu-toolchain-r-test
packages:
- g++-6
matrix:
include:
- os: linux
dist: xenial
sudo: require
addons:
apt:
sources:
- sourceline: 'ppa:ubuntu-toolchain-r/test'
packages:
- g++-7
env:
- MATRIX_EVAL="CC=gcc-7 && CXX=g++-7"
- os: osx
osx_image: xcode10
compiler: clang
env:
- MATRIX_EVAL="CC=clang && CXX=clang++"
before_install:
# This is necessary to solve https://github.com/travis-ci/travis-ci/issues/9649
- eval "${MATRIX_EVAL}"
script:
- mkdir tmp

View File

@ -5,3 +5,4 @@ licensing terms detailed in LICENSE.
a license to everyone to use it as detailed in LICENSE.)
M. Petra Baranski (info@progsource.de)
Patrick José Pereira (patrickelectric@gmail.com)

View File

@ -25,10 +25,17 @@ file(GLOB_RECURSE MADDY_TESTS_FILES ${CMAKE_CURRENT_SOURCE_DIR}/tests/maddy/*.cp
# ------------------------------------------------------------------------------
set(
CMAKE_CXX_FLAGS
"${CMAKE_CXX_FLAGS} -g -std=c++${MADDY_CPP_VERSION} -Wall -Wpedantic -Wextra -Wno-ignored-qualifiers -fno-rtti -fno-exceptions -fsanitize=address -fno-omit-frame-pointer"
)
if (UNIX)
set(
CMAKE_CXX_FLAGS
"${CMAKE_CXX_FLAGS} -g -std=c++${MADDY_CPP_VERSION} -Wall -Wpedantic -Wextra -Wno-ignored-qualifiers -fno-rtti -fno-exceptions -fsanitize=address -fno-omit-frame-pointer"
)
else()
set(
CMAKE_CXX_FLAGS
"${CMAKE_CXX_FLAGS} -std=c++${MADDY_CPP_VERSION}"
)
endif()
# ------------------------------------------------------------------------------

View File

@ -1,4 +1,4 @@
Copyright 2017 M. Petra Baranski
Copyright 2017, 2018, 2019 M. Petra Baranski
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in

View File

@ -1,8 +1,9 @@
# maddy
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
[![Version: 1.0.3](https://img.shields.io/badge/Version-1.0.3-brightgreen.svg)](https://semver.org/)
[![Build Status](https://travis-ci.org/progsource/maddy.svg?branch=master)](https://travis-ci.org/progsource/maddy)
[![Version: 1.1.0](https://img.shields.io/badge/Version-1.1.0-brightgreen.svg)](https://semver.org/)
[![Travis Build Status](https://travis-ci.org/progsource/maddy.svg?branch=master)](https://travis-ci.org/progsource/maddy)
[![Appveyor Build Status](https://ci.appveyor.com/api/projects/status/04m0lg27kigv1pg8/branch/master?svg=true)](https://ci.appveyor.com/project/progsource/maddy/branch/master)
maddy is a C++ Markdown to HTML **header-only** parser library.
@ -66,6 +67,6 @@ make test # or run the executable in ../build/MaddyTests
There are different possibilities:
* Create a GitHub issue
* [Create a GitHub issue](https://github.com/progsource/maddy/issues/new)
* Create a pull request with an own branch (don't forget to put yourself in the
AUTHORS file)

15
appveyor.yml Normal file
View File

@ -0,0 +1,15 @@
image: Visual Studio 2017
install:
- cmd: git submodule update --init --recursive
before_build:
- cmd: mkdir tmp
- cmd: cd tmp
- cmd: cmake -G "Visual Studio 15 Win64" ..
build:
project: $(APPVEYOR_BUILD_FOLDER)\tmp\$(APPVEYOR_PROJECT_NAME).sln
test_script:
- cmd: ctest -VV -C "Debug"

View File

@ -221,16 +221,28 @@ results in
```
**bold text**
__bold text__
```
results in
```html
<strong>bold text</strong>
<strong>bold text</strong>
```
## italic
```
*italic text*
```
results in
```html
<i>italic text</i>
```
## emphasized
```
*emphasized text*
_emphasized text_
```
results in
```html

View File

@ -7,7 +7,11 @@
// -----------------------------------------------------------------------------
#include <functional>
#include <sstream>
#include <string>
// windows compatibility includes
#include <cctype>
#include <algorithm>
// -----------------------------------------------------------------------------
@ -44,6 +48,13 @@ public:
, getBlockParserForLineCallback(getBlockParserForLineCallback)
{}
/**
* dtor
*
* @method
*/
virtual ~BlockParser() {}
/**
* AddLine
*
@ -146,24 +157,26 @@ protected:
{
bool hasMetNonSpace = false;
uint32_t indentation = std::count_if(
line.begin(),
line.end(),
[&hasMetNonSpace](unsigned char c)
{
if (hasMetNonSpace)
uint32_t indentation = static_cast<uint32_t>(
std::count_if(
line.begin(),
line.end(),
[&hasMetNonSpace](unsigned char c)
{
if (hasMetNonSpace)
{
return false;
}
if (std::isspace(c))
{
return true;
}
hasMetNonSpace = true;
return false;
}
if (std::isspace(c))
{
return true;
}
hasMetNonSpace = true;
return false;
}
)
);
return indentation;

View File

@ -30,7 +30,7 @@ public:
/**
* Parse
*
* From Markdown: `text *text*`
* From Markdown: `text _text_`
*
* To HTML: `text <em>text</em>`
*
@ -41,7 +41,7 @@ public:
void
Parse(std::string& line) override
{
static std::regex re("(?!.*`.*|.*<code>.*)\\*(?!.*`.*|.*<\\/code>.*)([^\\*]*)\\*(?!.*`.*|.*<\\/code>.*)");
static std::regex re("(?!.*`.*|.*<code>.*)_(?!.*`.*|.*<\\/code>.*)([^_]*)_(?!.*`.*|.*<\\/code>.*)");
static std::string replacement = "<em>$1</em>";
line = std::regex_replace(line, re, replacement);

View File

@ -0,0 +1,50 @@
/*
* This project is licensed under the MIT license. For more information see the
* LICENSE file.
*/
#pragma once
// -----------------------------------------------------------------------------
#include <string>
#include <regex>
#include "maddy/lineparser.h"
// -----------------------------------------------------------------------------
namespace maddy {
// -----------------------------------------------------------------------------
/**
* ItalicParser
*
* @class
*/
class ItalicParser : public LineParser
{
public:
/**
* Parse
*
* From Markdown: `text *text*`
*
* To HTML: `text <i>text</i>`
*
* @method
* @param {std::string&} line The line to interpret
* @return {void}
*/
void
Parse(std::string& line) override
{
std::regex re("(?!.*`.*|.*<code>.*)\\*(?!.*`.*|.*<\\/code>.*)([^\\*]*)\\*(?!.*`.*|.*<\\/code>.*)");
static std::string replacement = "<i>$1</i>";
line = std::regex_replace(line, re, replacement);
}
}; // class ItalicParser
// -----------------------------------------------------------------------------
} // namespace maddy

View File

@ -22,6 +22,13 @@ namespace maddy {
class LineParser
{
public:
/**
* dtor
*
* @method
*/
virtual ~LineParser() {}
/**
* Parse
*

View File

@ -25,6 +25,7 @@
#include "maddy/emphasizedparser.h"
#include "maddy/imageparser.h"
#include "maddy/inlinecodeparser.h"
#include "maddy/italicparser.h"
#include "maddy/linkparser.h"
#include "maddy/strikethroughparser.h"
#include "maddy/strongparser.h"
@ -56,6 +57,7 @@ public:
: emphasizedParser(std::make_shared<EmphasizedParser>())
, imageParser(std::make_shared<ImageParser>())
, inlineCodeParser(std::make_shared<InlineCodeParser>())
, italicParser(std::make_shared<ItalicParser>())
, linkParser(std::make_shared<LinkParser>())
, strikeThroughParser(std::make_shared<StrikeThroughParser>())
, strongParser(std::make_shared<StrongParser>())
@ -112,6 +114,7 @@ private:
std::shared_ptr<EmphasizedParser> emphasizedParser;
std::shared_ptr<ImageParser> imageParser;
std::shared_ptr<InlineCodeParser> inlineCodeParser;
std::shared_ptr<ItalicParser> italicParser;
std::shared_ptr<LinkParser> linkParser;
std::shared_ptr<StrikeThroughParser> strikeThroughParser;
std::shared_ptr<StrongParser> strongParser;
@ -131,6 +134,8 @@ private:
this->strikeThroughParser->Parse(line);
this->inlineCodeParser->Parse(line);
this->italicParser->Parse(line);
}
std::shared_ptr<BlockParser>

View File

@ -30,9 +30,9 @@ public:
/**
* Parse
*
* From Markdown: `text **text**`
* From Markdown: `text **text** __text__`
*
* To HTML: `text <strong>text</strong>`
* To HTML: `text <strong>text</strong> <strong>text</strong>`
*
* @method
* @param {std::string&} line The line to interpret
@ -41,10 +41,16 @@ public:
void
Parse(std::string& line) override
{
static std::regex re("(?!.*`.*|.*<code>.*)\\*\\*(?!.*`.*|.*<\\/code>.*)([^\\*\\*]*)\\*\\*(?!.*`.*|.*<\\/code>.*)");
static std::vector<std::regex> res
{
std::regex{"(?!.*`.*|.*<code>.*)\\*\\*(?!.*`.*|.*<\\/code>.*)([^\\*\\*]*)\\*\\*(?!.*`.*|.*<\\/code>.*)"},
std::regex{"(?!.*`.*|.*<code>.*)__(?!.*`.*|.*<\\/code>.*)([^__]*)__(?!.*`.*|.*<\\/code>.*)"}
};
static std::string replacement = "<strong>$1</strong>";
line = std::regex_replace(line, re, replacement);
for (const auto& re : res)
{
line = std::regex_replace(line, re, replacement);
}
}
}; // class StrongParser

View File

@ -12,7 +12,7 @@
TEST(MADDY_EMPHASIZEDPARSER, ItReplacesMarkdownWithEmphasizedHTML)
{
std::string text = "some text *bla* text testing *it* out";
std::string text = "some text _bla_ text testing _it_ out";
std::string expected = "some text <em>bla</em> text testing <em>it</em> out";
auto emphasizedParser = std::make_shared<maddy::EmphasizedParser>();
@ -23,7 +23,7 @@ TEST(MADDY_EMPHASIZEDPARSER, ItReplacesMarkdownWithEmphasizedHTML)
TEST(MADDY_EMPHASIZEDPARSER, ItDoesNotParseInsideInlineCode)
{
std::string text = "some text `*bla*` `/**text*/` testing *it* out";
std::string text = "some text `*bla*` `/**text*/` testing _it_ out";
std::string expected = "some text `*bla*` `/**text*/` testing <em>it</em> out";
auto emphasizedParser = std::make_shared<maddy::EmphasizedParser>();

View File

@ -0,0 +1,23 @@
/*
* This project is licensed under the MIT license. For more information see the
* LICENSE file.
*/
#include <memory>
#include "gmock/gmock.h"
#include "maddy/italicparser.h"
// -----------------------------------------------------------------------------
TEST(MADDY_ITALICPARSER, ItReplacesMarkdownWithItalicHTML)
{
std::string text = "some text *bla* text testing *it* out";
std::string expected = "some text <i>bla</i> text testing <i>it</i> out";
auto italicParser = std::make_shared<maddy::ItalicParser>();
italicParser->Parse(text);
ASSERT_EQ(text, expected);
}

View File

@ -11,9 +11,9 @@ const std::string testMarkdown = "# This is a test\n\
This should result in a praragraph\n\
it's that simple.\n\
\n\
* an unordered list\n\
* an *unordered* list\n\
* with some **hierarchy**\n\
1. and an *ordered*\n\
1. and an _ordered_\n\
* list\n\
* directly\n\
* inside\n\
@ -67,4 +67,4 @@ foot a|foot b|foot c\n\
\n\
";
const std::string testHtml = "<h1>This is a test</h1><p>This should result in a praragraph it's that simple. </p><ul><li>an unordered list<ul><li>with some <strong>hierarchy</strong><ol><li>and an <em>ordered</em></li><li>list</li><li>directly</li></ol></li><li>inside</li></ul></li></ul><pre><code>\nvar c = 'blub';\n</code></pre><blockquote><p>A Quote </p><p>With some <s>text</s> blocks inside </p><ul><li>even a list </li><li>should be </li><li>possible </li></ul></blockquote><p>And well <code>inline code</code> should also work. </p><h2>Another Headline</h2><p>And not to forget <a href=\"http://progsource.de\">link to progsource</a> should work. And well - let's see how an image would be shown: </p><p><img src=\"http://progsource.de/img/progsource.png\" alt=\"an image\"/> </p><hr/><h3>and more headlines</h3><ul class=\"checklist\"><li><label><input type=\"checkbox\"/> how</label></li><li><label><input type=\"checkbox\"/> about<ul class=\"checklist\"><li><label><input type=\"checkbox\"/> a</label></li><li><label><input type=\"checkbox\" checked=\"checked\"/> nice</label></li></ul></label></li><li><label><input type=\"checkbox\" checked=\"checked\"/> check</label></li><li><label><input type=\"checkbox\"/> list</label></li></ul><h4>even a table</h4><table><thead><tr><th>Left header</th><th>middle header</th><th>last header</th></tr></thead><tbody><tr><td>cell 1</td><td>cell <strong>2</strong></td><td>cell 3</td></tr><tr><td>cell 4</td><td>cell 5</td><td>cell 6</td></tr></tbody><tfoot><tr><td>foot a</td><td>foot b</td><td>foot c</td></tr></tfoot></table><h5>h5</h5><h6>h6</h6>";
const std::string testHtml = "<h1>This is a test</h1><p>This should result in a praragraph it's that simple. </p><ul><li>an <i>unordered</i> list<ul><li>with some <strong>hierarchy</strong><ol><li>and an <em>ordered</em></li><li>list</li><li>directly</li></ol></li><li>inside</li></ul></li></ul><pre><code>\nvar c = 'blub';\n</code></pre><blockquote><p>A Quote </p><p>With some <s>text</s> blocks inside </p><ul><li>even a list </li><li>should be </li><li>possible </li></ul></blockquote><p>And well <code>inline code</code> should also work. </p><h2>Another Headline</h2><p>And not to forget <a href=\"http://progsource.de\">link to progsource</a> should work. And well - let's see how an image would be shown: </p><p><img src=\"http://progsource.de/img/progsource.png\" alt=\"an image\"/> </p><hr/><h3>and more headlines</h3><ul class=\"checklist\"><li><label><input type=\"checkbox\"/> how</label></li><li><label><input type=\"checkbox\"/> about<ul class=\"checklist\"><li><label><input type=\"checkbox\"/> a</label></li><li><label><input type=\"checkbox\" checked=\"checked\"/> nice</label></li></ul></label></li><li><label><input type=\"checkbox\" checked=\"checked\"/> check</label></li><li><label><input type=\"checkbox\"/> list</label></li></ul><h4>even a table</h4><table><thead><tr><th>Left header</th><th>middle header</th><th>last header</th></tr></thead><tbody><tr><td>cell 1</td><td>cell <strong>2</strong></td><td>cell 3</td></tr><tr><td>cell 4</td><td>cell 5</td><td>cell 6</td></tr></tbody><tfoot><tr><td>foot a</td><td>foot b</td><td>foot c</td></tr></tfoot></table><h5>h5</h5><h6>h6</h6>";

View File

@ -12,33 +12,87 @@
TEST(MADDY_STRONGPARSER, ItReplacesMarkdownWithStrongHTML)
{
std::string text = "some text **bla** text testing **it** out";
std::string expected = "some text <strong>bla</strong> text testing <strong>it</strong> out";
struct testIt
{
std::string text;
std::string expected;
};
std::vector<testIt> tests
{
{
"some text **bla** text testing **it** out",
"some text <strong>bla</strong> text testing <strong>it</strong> out"
},
{
"some text __bla__ text testing __it__ out",
"some text <strong>bla</strong> text testing <strong>it</strong> out"
},
};
auto strongParser = std::make_shared<maddy::StrongParser>();
strongParser->Parse(text);
ASSERT_EQ(expected, text);
for (auto& test : tests)
{
strongParser->Parse(test.text);
ASSERT_EQ(test.expected, test.text);
}
}
TEST(MADDY_STRONGPARSER, ItReplacesEmphasizedMarkdownNotWithStrongHTML)
{
std::string text = "some text *bla* text testing **it** out";
std::string expected = "some text *bla* text testing <strong>it</strong> out";
struct testIt
{
std::string text;
std::string expected;
};
std::vector<testIt> tests
{
{
"some text *bla* text testing **it** out",
"some text *bla* text testing <strong>it</strong> out"
},
{
"some text _bla_ text testing __it__ out",
"some text _bla_ text testing <strong>it</strong> out"
},
};
auto strongParser = std::make_shared<maddy::StrongParser>();
strongParser->Parse(text);
ASSERT_EQ(expected, text);
for (auto& test : tests)
{
strongParser->Parse(test.text);
ASSERT_EQ(test.expected, test.text);
}
}
TEST(MADDY_STRONGPARSER, ItDoesNotParseInsideInlineCode)
{
std::string text = "some text **bla** `/**text**/` testing `**it**` out";
std::string expected = "some text **bla** `/**text**/` testing `**it**` out";
struct testIt
{
std::string text;
std::string expected;
};
std::vector<testIt> tests
{
{
"some text **bla** `/**text**/` testing `**it**` out",
"some text **bla** `/**text**/` testing `**it**` out",
},
{
"some text _bla_ text testing __it__ out",
"some text _bla_ text testing <strong>it</strong> out"
},
};
auto strongParser = std::make_shared<maddy::StrongParser>();
strongParser->Parse(text);
ASSERT_EQ(expected, text);
for (auto& test : tests)
{
strongParser->Parse(test.text);
ASSERT_EQ(test.expected, test.text);
}
}