mirror of
https://github.com/quitesimpleorg/qsmaddy.git
synced 2025-04-18 18:29:02 +02:00
Compare commits
67 Commits
Author | SHA1 | Date | |
---|---|---|---|
167ce3943d | |||
e0e0db80d5 | |||
8ac353a9d7 | |||
2f14336692 | |||
![]() |
adb1a910d4 | ||
![]() |
f38b3cf4fa | ||
![]() |
6b632abd44 | ||
![]() |
38f802de09 | ||
![]() |
348aa81607 | ||
![]() |
ba5cb5d6c5 | ||
![]() |
fd698d1f5f | ||
![]() |
5b2f20041c | ||
![]() |
cde0137e90 | ||
![]() |
71ee49d1ea | ||
![]() |
19338d2b56 | ||
![]() |
cb75226b4a | ||
![]() |
51d61b68fe | ||
![]() |
2fe7a71bf3 | ||
![]() |
3b3e16a6bc | ||
![]() |
a03ff9c33d | ||
![]() |
77782635d4 | ||
![]() |
0fb6de703d | ||
![]() |
4e4e17d2c0 | ||
![]() |
59b808bf50 | ||
![]() |
ab0872a6cb | ||
![]() |
7d5d311ecb | ||
![]() |
1f00ae90b2 | ||
![]() |
b167316d52 | ||
![]() |
3484198ade | ||
![]() |
c5c37a7627 | ||
![]() |
0762f6cc5d | ||
![]() |
92db217966 | ||
![]() |
b5a6628f44 | ||
![]() |
371dc41aff | ||
![]() |
519c81eaab | ||
![]() |
77a74fef56 | ||
![]() |
81090b8ca7 | ||
![]() |
0b00ee7137 | ||
![]() |
af6dd8f65a | ||
![]() |
ab567fc2f1 | ||
![]() |
62c840bb77 | ||
![]() |
8f0ec363fd | ||
![]() |
a84da9de61 | ||
![]() |
7c26aa0431 | ||
![]() |
3c54e901c3 | ||
![]() |
dae4b5bb35 | ||
![]() |
0af145ab8f | ||
![]() |
8294841cf5 | ||
![]() |
e6bd0bdb4f | ||
![]() |
348532acb8 | ||
![]() |
6af5374138 | ||
![]() |
c7eef2b34a | ||
![]() |
be681034e0 | ||
![]() |
78652f64d5 | ||
![]() |
b5f24f01a3 | ||
![]() |
eae3b270c0 | ||
![]() |
2562d780b8 | ||
![]() |
6e7aec7947 | ||
![]() |
ee42f7eae9 | ||
![]() |
e8ba8f661a | ||
![]() |
9b37255346 | ||
![]() |
a85ba0eec7 | ||
![]() |
7e56e82b6a | ||
![]() |
62365f1c7c | ||
![]() |
eb2b4fa929 | ||
![]() |
a19845cdb5 | ||
![]() |
22c656f855 |
@ -8,5 +8,5 @@ indent_style = space
|
|||||||
insert_final_newline = true
|
insert_final_newline = true
|
||||||
trim_trailing_whitespace = true
|
trim_trailing_whitespace = true
|
||||||
|
|
||||||
[*.{h,hh,hpp,c,cc,cpp,cxx}]
|
[*.{h,hh,hpp,c,cc,cpp,cxx,yml}]
|
||||||
indent_size = 2
|
indent_size = 2
|
||||||
|
34
.travis.yml
34
.travis.yml
@ -1,18 +1,32 @@
|
|||||||
dist: trusty
|
|
||||||
sudo: false
|
sudo: false
|
||||||
language: cpp
|
language: cpp
|
||||||
compiler: g++
|
matrix:
|
||||||
install: export CXX="g++-6"
|
include:
|
||||||
addons:
|
- os: linux
|
||||||
apt:
|
dist: xenial
|
||||||
sources:
|
sudo: require
|
||||||
- ubuntu-toolchain-r-test
|
addons:
|
||||||
packages:
|
apt:
|
||||||
- g++-6
|
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:
|
script:
|
||||||
- mkdir tmp
|
- mkdir tmp
|
||||||
- cd tmp
|
- cd tmp
|
||||||
- cmake ..
|
- cmake ..
|
||||||
- make
|
- make -j4
|
||||||
- ../build/MaddyTests
|
- ../build/MaddyTests
|
||||||
|
4
AUTHORS
4
AUTHORS
@ -5,3 +5,7 @@ licensing terms detailed in LICENSE.
|
|||||||
a license to everyone to use it as detailed in LICENSE.)
|
a license to everyone to use it as detailed in LICENSE.)
|
||||||
|
|
||||||
M. Petra Baranski (info@progsource.de)
|
M. Petra Baranski (info@progsource.de)
|
||||||
|
Patrick José Pereira (patrickelectric@gmail.com)
|
||||||
|
Martin Kopecky (martin.kopecky357@gmail.com)
|
||||||
|
Andrew Mettlach (dmmettlach@gmail.com)
|
||||||
|
Evan Klitzke (evan@eklitzke.org)
|
||||||
|
67
CHANGELOG.md
Normal file
67
CHANGELOG.md
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
# Changelog
|
||||||
|
|
||||||
|
This file tries to follow roughly [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
||||||
|
maddy uses [semver versioning](https://semver.org/).
|
||||||
|
|
||||||
|
## Badges
|
||||||
|
|
||||||
|
*  for any bug fixes.
|
||||||
|
*  in case of vulnerabilities.
|
||||||
|
*  for new features.
|
||||||
|
*  for changes in existing functionality.
|
||||||
|
*  for soon-to-be removed features.
|
||||||
|
*  for now removed features.
|
||||||
|
|
||||||
|
## Upcoming
|
||||||
|
|
||||||
|
*  Added Changelog
|
||||||
|
*  Added contribution guideline
|
||||||
|
* ?
|
||||||
|
|
||||||
|
## version 1.1.2 2020-10-04
|
||||||
|
|
||||||
|
*  `*`, `+` and `-` are equivalent for making unordered bullet list
|
||||||
|
*  Parsing support for fully numeric ordered lists
|
||||||
|
*  make `Parser::Parse` accept istreams instead of stringstream
|
||||||
|
*  CMake is creating an interface library which you can include in your own `target_link_libraries` and the global include path is untouched from maddy.
|
||||||
|
|
||||||
|
## version 1.1.1 2019-12-27
|
||||||
|
|
||||||
|
*  BreakLineParser
|
||||||
|
*  HTMLParser
|
||||||
|
*  Added optional config with the following options:
|
||||||
|
* en-/disable the emphasized parser
|
||||||
|
* wrap/not wrap HTML in markdown within a paragraph in output
|
||||||
|
*  Updated gtest to release-1.10.0 to fix build issues
|
||||||
|
|
||||||
|
|
||||||
|
## version 1.1.0 2019-02-19
|
||||||
|
|
||||||
|
*  Added missing includes to BlockParser
|
||||||
|
*  Added missing dtor to BlockParser and LineParser
|
||||||
|
*  `__test__` can also be used to get `<strong>text</strong>`
|
||||||
|
*  Added AppVeyor CI
|
||||||
|
*  Added clang for CI
|
||||||
|
*  Single underscore `_` results in emphasized tag `<em>`, single `*` in italic tag `<i>`
|
||||||
|
|
||||||
|
## version 1.0.3 2018-01-18
|
||||||
|
|
||||||
|
*  Make sure that all parsers are finished
|
||||||
|
*  ol documentation
|
||||||
|
*  Added Travic-CI with gcc
|
||||||
|
*  Added Howto for running the tests on the README
|
||||||
|
|
||||||
|
## version 1.0.2 2017-12-26
|
||||||
|
|
||||||
|
*  Fixed inline code for directly following letters (bold, emphasized and strikethrough)
|
||||||
|
|
||||||
|
## version 1.0.1 2017-12-25
|
||||||
|
|
||||||
|
*  Fixed inline code for bold, emphasized and strikethrough
|
||||||
|
*  Fixed spelling in README
|
||||||
|
*  Use Gold Linker on Unix if available for faster compile time
|
||||||
|
*  Added Github ISSUE_TEMPLATE
|
||||||
|
|
||||||
|
## version 1.0.0 2017-12-25
|
||||||
|
|
||||||
|
initial release
|
@ -25,10 +25,17 @@ file(GLOB_RECURSE MADDY_TESTS_FILES ${CMAKE_CURRENT_SOURCE_DIR}/tests/maddy/*.cp
|
|||||||
|
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
set(
|
if (UNIX)
|
||||||
CMAKE_CXX_FLAGS
|
set(
|
||||||
"${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"
|
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()
|
||||||
|
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
@ -53,10 +60,9 @@ add_subdirectory(libs)
|
|||||||
|
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
include_directories(
|
add_library(maddy INTERFACE)
|
||||||
${LIBS_INCLUDE_DIRS}
|
target_include_directories(maddy INTERFACE
|
||||||
${MADDY_INCLUDE_DIR}
|
${MADDY_INCLUDE_DIR}
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/tests
|
|
||||||
)
|
)
|
||||||
|
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
@ -66,5 +72,9 @@ add_executable(
|
|||||||
${MADDY_TESTS_FILES}
|
${MADDY_TESTS_FILES}
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/tests/main.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/tests/main.cpp
|
||||||
)
|
)
|
||||||
target_link_libraries(MaddyTests gmock_main)
|
target_include_directories(MaddyTests PUBLIC
|
||||||
|
${LIBS_INCLUDE_DIRS}
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/tests
|
||||||
|
)
|
||||||
|
target_link_libraries(MaddyTests maddy gmock_main)
|
||||||
add_test(MaddyTests ${CMAKE_CURRENT_SOURCE_DIR}/build/MaddyTests)
|
add_test(MaddyTests ${CMAKE_CURRENT_SOURCE_DIR}/build/MaddyTests)
|
||||||
|
26
CONTRIBUTING.md
Normal file
26
CONTRIBUTING.md
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
# Contribution Guideline
|
||||||
|
|
||||||
|
First of all: I am thankful for any contribution this project gets.
|
||||||
|
|
||||||
|
## Creating Issues
|
||||||
|
|
||||||
|
You found a bug, you miss some feature in the project or have an idea how to
|
||||||
|
improve the code? Then [create a GitHub issue](https://github.com/progsource/maddy/issues/new).
|
||||||
|
|
||||||
|
## Creating Pull-Requests
|
||||||
|
|
||||||
|
* Use a branch other than master.
|
||||||
|
* Add yourself to the `AUTHORS` file.
|
||||||
|
* Try to stick with the code style the files are having right now.
|
||||||
|
* Write in your commit messages what/why you did something. Often times a one-liner might be enough, but if you want to write more, make an empty line in between like:
|
||||||
|
```
|
||||||
|
Short description
|
||||||
|
|
||||||
|
More and longer text for the commit message with some more information.
|
||||||
|
That can go over multiple lines.
|
||||||
|
```
|
||||||
|
Do not include Github issue ticket numbers inside commit messages.
|
||||||
|
* Explain for what your PR is for - like providing a use-case or something similar.
|
||||||
|
* Update documentation of the Markdown syntax if anything changed there. (`docs/definitions.md`)
|
||||||
|
* Add a changelog entry at "Upcoming" inside of `CHANGELOG.md`
|
||||||
|
* Make sure, that the tests are successful.
|
2
LICENSE
2
LICENSE
@ -1,4 +1,4 @@
|
|||||||
Copyright 2017 M. Petra Baranski
|
Copyright 2017, 2018, 2019, 2020 M. Petra Baranski
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
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
|
this software and associated documentation files (the "Software"), to deal in
|
||||||
|
72
README.md
72
README.md
@ -1,71 +1,3 @@
|
|||||||
# maddy
|
# qsmaddy
|
||||||
|
|
||||||
[](https://opensource.org/licenses/MIT)
|
Fork of [maddy](https://github.com/progsource/maddy) with some quick hacks to make it fit better for [qswiki](https://gitea.quitesimple.org/crtxcr/qswiki)
|
||||||
[](https://semver.org/)
|
|
||||||
[](https://travis-ci.org/progsource/maddy)
|
|
||||||
|
|
||||||
maddy is a C++ Markdown to HTML **header-only** parser library.
|
|
||||||
|
|
||||||
## Supported OS
|
|
||||||
|
|
||||||
It actually should work on any OS, that supports the C++14 standard library.
|
|
||||||
|
|
||||||
It is tested to work on:
|
|
||||||
|
|
||||||
* Linux (without exceptions and without RTTI)
|
|
||||||
|
|
||||||
## Dependencies
|
|
||||||
|
|
||||||
* C++14
|
|
||||||
|
|
||||||
## Why maddy?
|
|
||||||
|
|
||||||
When I was needing a Markdown parser in C++ I couldn't find any, that was
|
|
||||||
fitting my needs. So I simply wrote my own one.
|
|
||||||
|
|
||||||
## Markdown syntax
|
|
||||||
|
|
||||||
The supported syntax can be found in the [definitions docs](docs/definitions.md).
|
|
||||||
|
|
||||||
## How to use
|
|
||||||
|
|
||||||
To use maddy in your project, simply add the include path of maddy to yours
|
|
||||||
and in the code, you can then do the following:
|
|
||||||
|
|
||||||
```c++
|
|
||||||
#include <memory>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
#include "maddy/parser.h"
|
|
||||||
|
|
||||||
std::stringstream markdownInput("");
|
|
||||||
std::shared_ptr<maddy::Parser> parser = std::make_shared<maddy::Parser>();
|
|
||||||
std::string htmlOutput = parser->Parse(markdownInput);
|
|
||||||
```
|
|
||||||
|
|
||||||
## How to run the tests
|
|
||||||
|
|
||||||
*(tested on Linux with
|
|
||||||
[git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git) and
|
|
||||||
[cmake](https://cmake.org/install/) installed)*
|
|
||||||
|
|
||||||
Open your preferred terminal and type:
|
|
||||||
|
|
||||||
```shell
|
|
||||||
git clone https://github.com/progsource/maddy.git
|
|
||||||
cd maddy
|
|
||||||
git submodule update --init --recursive
|
|
||||||
mkdir tmp
|
|
||||||
cd tmp
|
|
||||||
cmake ..
|
|
||||||
make
|
|
||||||
make test # or run the executable in ../build/MaddyTests
|
|
||||||
```
|
|
||||||
|
|
||||||
## How to contribute
|
|
||||||
|
|
||||||
There are different possibilities:
|
|
||||||
|
|
||||||
* Create a GitHub issue
|
|
||||||
* Create a pull request with an own branch (don't forget to put yourself in the
|
|
||||||
AUTHORS file)
|
|
||||||
|
15
appveyor.yml
Normal file
15
appveyor.yml
Normal 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"
|
@ -7,6 +7,10 @@ destroy the output, if there was HTML in your markdown.
|
|||||||
The Parser expects you to use spaces and not tabs for indentation in the
|
The Parser expects you to use spaces and not tabs for indentation in the
|
||||||
markdown.
|
markdown.
|
||||||
|
|
||||||
|
If a line starts with `<` and `config->isHTMLWrappedInParagraph` is false, it
|
||||||
|
expects that the upcoming line is HTML and therefor will not be surrounded by a
|
||||||
|
paragraph.
|
||||||
|
|
||||||
## Headlines
|
## Headlines
|
||||||
|
|
||||||
```
|
```
|
||||||
@ -40,11 +44,13 @@ results in
|
|||||||
## Lists
|
## Lists
|
||||||
|
|
||||||
### unordered
|
### unordered
|
||||||
|
Characters "*", "+" or "-" to make an unordered "bullet" list are equivalent.
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
* unordered
|
- unordered
|
||||||
* list
|
* list
|
||||||
* items
|
+ items
|
||||||
|
|
||||||
```
|
```
|
||||||
results in
|
results in
|
||||||
@ -62,8 +68,8 @@ results in
|
|||||||
* list
|
* list
|
||||||
* items
|
* items
|
||||||
* in
|
* in
|
||||||
* an
|
+ an
|
||||||
* hierarchy
|
- hierarchy
|
||||||
|
|
||||||
```
|
```
|
||||||
results in
|
results in
|
||||||
@ -88,6 +94,26 @@ results in
|
|||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
1. ordered
|
||||||
|
2. list
|
||||||
|
3. items
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
results in
|
||||||
|
|
||||||
|
```html
|
||||||
|
|
||||||
|
<ol>
|
||||||
|
<li>ordered</li>
|
||||||
|
<li>list</li>
|
||||||
|
<li>items</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
1. ordered
|
1. ordered
|
||||||
* list
|
* list
|
||||||
* items
|
* items
|
||||||
@ -221,16 +247,30 @@ results in
|
|||||||
|
|
||||||
```
|
```
|
||||||
**bold text**
|
**bold text**
|
||||||
|
__bold text__
|
||||||
```
|
```
|
||||||
results in
|
results in
|
||||||
```html
|
```html
|
||||||
<strong>bold text</strong>
|
<strong>bold text</strong>
|
||||||
|
<strong>bold text</strong>
|
||||||
|
```
|
||||||
|
|
||||||
|
## italic
|
||||||
|
|
||||||
|
```
|
||||||
|
*italic text*
|
||||||
|
```
|
||||||
|
results in
|
||||||
|
```html
|
||||||
|
<i>italic text</i>
|
||||||
```
|
```
|
||||||
|
|
||||||
## emphasized
|
## emphasized
|
||||||
|
|
||||||
|
This can be disabled by setting `config->isEmphasizedParserEnabled = false`.
|
||||||
|
|
||||||
```
|
```
|
||||||
*emphasized text*
|
_emphasized text_
|
||||||
```
|
```
|
||||||
results in
|
results in
|
||||||
```html
|
```html
|
||||||
@ -257,6 +297,17 @@ results in
|
|||||||
<hr/>
|
<hr/>
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## break line
|
||||||
|
|
||||||
|
```
|
||||||
|
New\r\nLine
|
||||||
|
```
|
||||||
|
results in
|
||||||
|
```html
|
||||||
|
New<br>
|
||||||
|
Line
|
||||||
|
```
|
||||||
|
|
||||||
## Images
|
## Images
|
||||||
|
|
||||||
```
|
```
|
||||||
|
@ -7,7 +7,11 @@
|
|||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
|
|
||||||
#include <functional>
|
#include <functional>
|
||||||
|
#include <sstream>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
// windows compatibility includes
|
||||||
|
#include <cctype>
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
|
|
||||||
@ -44,6 +48,13 @@ public:
|
|||||||
, getBlockParserForLineCallback(getBlockParserForLineCallback)
|
, getBlockParserForLineCallback(getBlockParserForLineCallback)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* dtor
|
||||||
|
*
|
||||||
|
* @method
|
||||||
|
*/
|
||||||
|
virtual ~BlockParser() {}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* AddLine
|
* AddLine
|
||||||
*
|
*
|
||||||
@ -146,24 +157,26 @@ protected:
|
|||||||
{
|
{
|
||||||
bool hasMetNonSpace = false;
|
bool hasMetNonSpace = false;
|
||||||
|
|
||||||
uint32_t indentation = std::count_if(
|
uint32_t indentation = static_cast<uint32_t>(
|
||||||
line.begin(),
|
std::count_if(
|
||||||
line.end(),
|
line.begin(),
|
||||||
[&hasMetNonSpace](unsigned char c)
|
line.end(),
|
||||||
{
|
[&hasMetNonSpace](unsigned char c)
|
||||||
if (hasMetNonSpace)
|
|
||||||
{
|
{
|
||||||
|
if (hasMetNonSpace)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (std::isspace(c))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
hasMetNonSpace = true;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
)
|
||||||
if (std::isspace(c))
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
hasMetNonSpace = true;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
);
|
);
|
||||||
|
|
||||||
return indentation;
|
return indentation;
|
||||||
|
51
include/maddy/breaklineparser.h
Normal file
51
include/maddy/breaklineparser.h
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
/*
|
||||||
|
* 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 {
|
||||||
|
|
||||||
|
// -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* BreakLineParser
|
||||||
|
*
|
||||||
|
* @class
|
||||||
|
*/
|
||||||
|
class BreakLineParser : public LineParser
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* Parse
|
||||||
|
*
|
||||||
|
* From Markdown: `text\r\n text`
|
||||||
|
*
|
||||||
|
* To HTML: `text<br> text`
|
||||||
|
*
|
||||||
|
* @method
|
||||||
|
* @param {std::string&} line The line to interpret
|
||||||
|
* @return {void}
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
Parse(std::string& line) override
|
||||||
|
{
|
||||||
|
static std::regex re(R"((\r\n|\r))");
|
||||||
|
static std::string replacement = "<br>";
|
||||||
|
|
||||||
|
line = std::regex_replace(line, re, replacement);
|
||||||
|
}
|
||||||
|
}; // class BreakLineParser
|
||||||
|
|
||||||
|
// -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
} // namespace maddy
|
36
include/maddy/callbackreplacer.h
Normal file
36
include/maddy/callbackreplacer.h
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
/*
|
||||||
|
* This project is licensed under the MIT license. For more information see the
|
||||||
|
* LICENSE file.
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <regex>
|
||||||
|
#include <functional>
|
||||||
|
|
||||||
|
namespace maddy {
|
||||||
|
|
||||||
|
inline std::string regex_callback_replacer(std::regex ®ex, const std::string &input,
|
||||||
|
std::function<std::string(std::smatch &)> &callback)
|
||||||
|
{
|
||||||
|
std::string result;
|
||||||
|
auto tagsbegin = std::sregex_iterator(input.begin(), input.end(), regex);
|
||||||
|
auto tagsend = std::sregex_iterator();
|
||||||
|
auto matchbegin = 0;
|
||||||
|
for(std::sregex_iterator i = tagsbegin; i != tagsend; ++i)
|
||||||
|
{
|
||||||
|
std::smatch match = *i;
|
||||||
|
|
||||||
|
auto matchlength = match.length(0);
|
||||||
|
auto matchpos = match.position();
|
||||||
|
|
||||||
|
result += input.substr(matchbegin, matchpos - matchbegin);
|
||||||
|
result += callback(match);
|
||||||
|
matchbegin = matchpos + matchlength;
|
||||||
|
}
|
||||||
|
result += input.substr(matchbegin);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -30,7 +30,7 @@ public:
|
|||||||
/**
|
/**
|
||||||
* Parse
|
* Parse
|
||||||
*
|
*
|
||||||
* From Markdown: `text *text*`
|
* From Markdown: `text _text_`
|
||||||
*
|
*
|
||||||
* To HTML: `text <em>text</em>`
|
* To HTML: `text <em>text</em>`
|
||||||
*
|
*
|
||||||
@ -41,7 +41,7 @@ public:
|
|||||||
void
|
void
|
||||||
Parse(std::string& line) override
|
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>";
|
static std::string replacement = "<em>$1</em>";
|
||||||
|
|
||||||
line = std::regex_replace(line, re, replacement);
|
line = std::regex_replace(line, re, replacement);
|
||||||
|
127
include/maddy/htmlparser.h
Normal file
127
include/maddy/htmlparser.h
Normal file
@ -0,0 +1,127 @@
|
|||||||
|
/*
|
||||||
|
* This project is licensed under the MIT license. For more information see the
|
||||||
|
* LICENSE file.
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
// -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#include <functional>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include "maddy/blockparser.h"
|
||||||
|
|
||||||
|
// -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
namespace maddy {
|
||||||
|
|
||||||
|
// -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* HtmlParser
|
||||||
|
*
|
||||||
|
* @class
|
||||||
|
*/
|
||||||
|
class HtmlParser : public BlockParser
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* ctor
|
||||||
|
*
|
||||||
|
* @method
|
||||||
|
* @param {std::function<void(std::string&)>} parseLineCallback
|
||||||
|
* @param {std::function<std::shared_ptr<BlockParser>(const std::string& line)>} getBlockParserForLineCallback
|
||||||
|
*/
|
||||||
|
HtmlParser(
|
||||||
|
std::function<void(std::string&)> parseLineCallback,
|
||||||
|
std::function<std::shared_ptr<BlockParser>(const std::string& line)> getBlockParserForLineCallback
|
||||||
|
)
|
||||||
|
: BlockParser(parseLineCallback, getBlockParserForLineCallback)
|
||||||
|
, isStarted(false)
|
||||||
|
, isFinished(false)
|
||||||
|
, isGreaterThanFound(false)
|
||||||
|
{}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* IsStartingLine
|
||||||
|
*
|
||||||
|
* If the line is starting with `<`, HTML is expected to follow.
|
||||||
|
* Nothing after that will be parsed, it only is copied.
|
||||||
|
*
|
||||||
|
* @method
|
||||||
|
* @param {const std::string&} line
|
||||||
|
* @return {bool}
|
||||||
|
*/
|
||||||
|
static bool
|
||||||
|
IsStartingLine(const std::string& line)
|
||||||
|
{
|
||||||
|
return line[0] == '<';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* IsFinished
|
||||||
|
*
|
||||||
|
* `>` followed by an empty line will end the HTML block.
|
||||||
|
*
|
||||||
|
* @method
|
||||||
|
* @return {bool}
|
||||||
|
*/
|
||||||
|
bool
|
||||||
|
IsFinished() const override
|
||||||
|
{
|
||||||
|
return this->isFinished;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
bool
|
||||||
|
isInlineBlockAllowed() const override
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
isLineParserAllowed() const override
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
parseBlock(std::string& line) override
|
||||||
|
{
|
||||||
|
if (!this->isStarted)
|
||||||
|
{
|
||||||
|
this->isStarted = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!line.empty() && line[line.size() - 1] == '>')
|
||||||
|
{
|
||||||
|
this->isGreaterThanFound = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (line.empty() && this->isGreaterThanFound)
|
||||||
|
{
|
||||||
|
this->isFinished = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!line.empty() && this->isGreaterThanFound)
|
||||||
|
{
|
||||||
|
this->isGreaterThanFound = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!line.empty())
|
||||||
|
{
|
||||||
|
line += " ";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool isStarted;
|
||||||
|
bool isFinished;
|
||||||
|
bool isGreaterThanFound;
|
||||||
|
}; // class HtmlParser
|
||||||
|
|
||||||
|
// -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
} // namespace maddy
|
50
include/maddy/italicparser.h
Normal file
50
include/maddy/italicparser.h
Normal 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
|
||||||
|
{
|
||||||
|
static std::regex re("(?!.*`.*|.*<code>.*)\\*(?!.*`.*|.*<\\/code>.*)([^\\*]*)\\*(?!.*`.*|.*<\\/code>.*)");
|
||||||
|
static std::string replacement = "<i>$1</i>";
|
||||||
|
line = std::regex_replace(line, re, replacement);
|
||||||
|
}
|
||||||
|
}; // class ItalicParser
|
||||||
|
|
||||||
|
// -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
} // namespace maddy
|
@ -22,6 +22,13 @@ namespace maddy {
|
|||||||
class LineParser
|
class LineParser
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
/**
|
||||||
|
* dtor
|
||||||
|
*
|
||||||
|
* @method
|
||||||
|
*/
|
||||||
|
virtual ~LineParser() {}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parse
|
* Parse
|
||||||
*
|
*
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
#include <regex>
|
#include <regex>
|
||||||
|
|
||||||
#include "maddy/lineparser.h"
|
#include "maddy/lineparser.h"
|
||||||
|
#include "maddy/callbackreplacer.h"
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
|
|
||||||
@ -26,6 +27,16 @@ namespace maddy {
|
|||||||
*/
|
*/
|
||||||
class LinkParser : public LineParser
|
class LinkParser : public LineParser
|
||||||
{
|
{
|
||||||
|
private:
|
||||||
|
std::function<std::string(std::smatch &)> callback = [](std::smatch & match){
|
||||||
|
std::string inner = match.str(1);
|
||||||
|
std::string link = match.str(2);
|
||||||
|
return "<a href=\"" + link + "\">" + inner + "</a>";
|
||||||
|
};
|
||||||
|
|
||||||
|
std::regex re = std::regex("\\[([^\\]]*)\\]\\(([^\\]]*)\\)");
|
||||||
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/**
|
/**
|
||||||
* Parse
|
* Parse
|
||||||
@ -41,10 +52,12 @@ public:
|
|||||||
void
|
void
|
||||||
Parse(std::string& line) override
|
Parse(std::string& line) override
|
||||||
{
|
{
|
||||||
static std::regex re("\\[([^\\]]*)\\]\\(([^\\]]*)\\)");
|
line = regex_callback_replacer(re,line,callback);
|
||||||
static std::string replacement = "<a href=\"$2\">$1</a>";
|
}
|
||||||
|
|
||||||
line = std::regex_replace(line, re, replacement);
|
void setCallback(std::function<std::string(std::smatch &)> callback)
|
||||||
|
{
|
||||||
|
this->callback = callback;
|
||||||
}
|
}
|
||||||
}; // class LinkParser
|
}; // class LinkParser
|
||||||
|
|
||||||
|
@ -89,9 +89,9 @@ protected:
|
|||||||
bool isStartOfNewListItem = this->isStartOfNewListItem(line);
|
bool isStartOfNewListItem = this->isStartOfNewListItem(line);
|
||||||
uint32_t indentation = getIndentationWidth(line);
|
uint32_t indentation = getIndentationWidth(line);
|
||||||
|
|
||||||
static std::regex orderedlineRegex("^1\\. ");
|
static std::regex orderedlineRegex("^[1-9]+[0-9]*\\. ");
|
||||||
line = std::regex_replace(line, orderedlineRegex, "");
|
line = std::regex_replace(line, orderedlineRegex, "");
|
||||||
static std::regex unorderedlineRegex("^(\\* )");
|
static std::regex unorderedlineRegex("^\\* ");
|
||||||
line = std::regex_replace(line, unorderedlineRegex, "");
|
line = std::regex_replace(line, unorderedlineRegex, "");
|
||||||
|
|
||||||
if (!this->isStarted)
|
if (!this->isStarted)
|
||||||
@ -132,7 +132,7 @@ private:
|
|||||||
bool
|
bool
|
||||||
isStartOfNewListItem(const std::string& line) const
|
isStartOfNewListItem(const std::string& line) const
|
||||||
{
|
{
|
||||||
static std::regex re("^(?:1\\. |\\* ).*");
|
static std::regex re("^(?:[1-9]+[0-9]*\\. |\\* ).*");
|
||||||
return std::regex_match(line, re);
|
return std::regex_match(line, re);
|
||||||
}
|
}
|
||||||
}; // class OrderedListParser
|
}; // class OrderedListParser
|
||||||
|
@ -44,8 +44,9 @@ public:
|
|||||||
/**
|
/**
|
||||||
* IsStartingLine
|
* IsStartingLine
|
||||||
*
|
*
|
||||||
* If the line is not empty, it will be a paragraph. So this block parser has
|
* If the line is not empty, it will be a paragraph.
|
||||||
* to always run as the last one!
|
*
|
||||||
|
* This block parser has to always run as the last one!
|
||||||
*
|
*
|
||||||
* @method
|
* @method
|
||||||
* @param {const std::string&} line
|
* @param {const std::string&} line
|
||||||
|
@ -10,11 +10,14 @@
|
|||||||
#include <functional>
|
#include <functional>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
#include "maddy/parserconfig.h"
|
||||||
|
|
||||||
// BlockParser
|
// BlockParser
|
||||||
#include "maddy/checklistparser.h"
|
#include "maddy/checklistparser.h"
|
||||||
#include "maddy/codeblockparser.h"
|
#include "maddy/codeblockparser.h"
|
||||||
#include "maddy/headlineparser.h"
|
#include "maddy/headlineparser.h"
|
||||||
#include "maddy/horizontallineparser.h"
|
#include "maddy/horizontallineparser.h"
|
||||||
|
#include "maddy/htmlparser.h"
|
||||||
#include "maddy/orderedlistparser.h"
|
#include "maddy/orderedlistparser.h"
|
||||||
#include "maddy/paragraphparser.h"
|
#include "maddy/paragraphparser.h"
|
||||||
#include "maddy/quoteparser.h"
|
#include "maddy/quoteparser.h"
|
||||||
@ -22,9 +25,11 @@
|
|||||||
#include "maddy/unorderedlistparser.h"
|
#include "maddy/unorderedlistparser.h"
|
||||||
|
|
||||||
// LineParser
|
// LineParser
|
||||||
|
#include "maddy/breaklineparser.h"
|
||||||
#include "maddy/emphasizedparser.h"
|
#include "maddy/emphasizedparser.h"
|
||||||
#include "maddy/imageparser.h"
|
#include "maddy/imageparser.h"
|
||||||
#include "maddy/inlinecodeparser.h"
|
#include "maddy/inlinecodeparser.h"
|
||||||
|
#include "maddy/italicparser.h"
|
||||||
#include "maddy/linkparser.h"
|
#include "maddy/linkparser.h"
|
||||||
#include "maddy/strikethroughparser.h"
|
#include "maddy/strikethroughparser.h"
|
||||||
#include "maddy/strongparser.h"
|
#include "maddy/strongparser.h"
|
||||||
@ -52,10 +57,13 @@ public:
|
|||||||
*
|
*
|
||||||
* @method
|
* @method
|
||||||
*/
|
*/
|
||||||
Parser()
|
Parser(std::shared_ptr<ParserConfig> config = nullptr)
|
||||||
: emphasizedParser(std::make_shared<EmphasizedParser>())
|
: config(config)
|
||||||
|
, breakLineParser(std::make_shared<BreakLineParser>())
|
||||||
|
, emphasizedParser(std::make_shared<EmphasizedParser>())
|
||||||
, imageParser(std::make_shared<ImageParser>())
|
, imageParser(std::make_shared<ImageParser>())
|
||||||
, inlineCodeParser(std::make_shared<InlineCodeParser>())
|
, inlineCodeParser(std::make_shared<InlineCodeParser>())
|
||||||
|
, italicParser(std::make_shared<ItalicParser>())
|
||||||
, linkParser(std::make_shared<LinkParser>())
|
, linkParser(std::make_shared<LinkParser>())
|
||||||
, strikeThroughParser(std::make_shared<StrikeThroughParser>())
|
, strikeThroughParser(std::make_shared<StrikeThroughParser>())
|
||||||
, strongParser(std::make_shared<StrongParser>())
|
, strongParser(std::make_shared<StrongParser>())
|
||||||
@ -65,11 +73,11 @@ public:
|
|||||||
* Parse
|
* Parse
|
||||||
*
|
*
|
||||||
* @method
|
* @method
|
||||||
* @param {const std::stringstream&} markdown
|
* @param {const std::istream&} markdown
|
||||||
* @return {std::string} HTML
|
* @return {std::string} HTML
|
||||||
*/
|
*/
|
||||||
std::string
|
std::string
|
||||||
Parse(std::stringstream& markdown) const
|
Parse(std::istream& markdown) const
|
||||||
{
|
{
|
||||||
std::string result = "";
|
std::string result = "";
|
||||||
std::shared_ptr<BlockParser> currentBlockParser = nullptr;
|
std::shared_ptr<BlockParser> currentBlockParser = nullptr;
|
||||||
@ -108,10 +116,61 @@ public:
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
setBreakLineParser(std::shared_ptr<BreakLineParser> breakLineParser)
|
||||||
|
{
|
||||||
|
this->breakLineParser = breakLineParser;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
setEmphasizedParser(std::shared_ptr<EmphasizedParser> emphasizedParser)
|
||||||
|
{
|
||||||
|
this->emphasizedParser = emphasizedParser;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
setImageParser(std::shared_ptr<ImageParser> imageParser)
|
||||||
|
{
|
||||||
|
this->imageParser = imageParser;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
setInlineCodeParser(std::shared_ptr<InlineCodeParser> inlineCodeParser)
|
||||||
|
{
|
||||||
|
this->inlineCodeParser = inlineCodeParser;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
setItalicParser(std::shared_ptr<ItalicParser> italicParser)
|
||||||
|
{
|
||||||
|
this->italicParser = italicParser;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
setLinkParser(std::shared_ptr<LinkParser> linkParser)
|
||||||
|
{
|
||||||
|
this->linkParser = linkParser;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
setStrikeThroughParser(std::shared_ptr<StrikeThroughParser> strikeThroughParser)
|
||||||
|
{
|
||||||
|
this->strikeThroughParser = strikeThroughParser;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
setStrongParser(std::shared_ptr<StrongParser> strongParser)
|
||||||
|
{
|
||||||
|
this->strongParser = strongParser;
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
std::shared_ptr<ParserConfig> config;
|
||||||
|
std::shared_ptr<BreakLineParser> breakLineParser;
|
||||||
std::shared_ptr<EmphasizedParser> emphasizedParser;
|
std::shared_ptr<EmphasizedParser> emphasizedParser;
|
||||||
std::shared_ptr<ImageParser> imageParser;
|
std::shared_ptr<ImageParser> imageParser;
|
||||||
std::shared_ptr<InlineCodeParser> inlineCodeParser;
|
std::shared_ptr<InlineCodeParser> inlineCodeParser;
|
||||||
|
std::shared_ptr<ItalicParser> italicParser;
|
||||||
std::shared_ptr<LinkParser> linkParser;
|
std::shared_ptr<LinkParser> linkParser;
|
||||||
std::shared_ptr<StrikeThroughParser> strikeThroughParser;
|
std::shared_ptr<StrikeThroughParser> strikeThroughParser;
|
||||||
std::shared_ptr<StrongParser> strongParser;
|
std::shared_ptr<StrongParser> strongParser;
|
||||||
@ -126,11 +185,19 @@ private:
|
|||||||
|
|
||||||
// Attention! StrongParser has to be before EmphasizedParser
|
// Attention! StrongParser has to be before EmphasizedParser
|
||||||
this->strongParser->Parse(line);
|
this->strongParser->Parse(line);
|
||||||
this->emphasizedParser->Parse(line);
|
|
||||||
|
if (!this->config || this->config->isEmphasizedParserEnabled)
|
||||||
|
{
|
||||||
|
this->emphasizedParser->Parse(line);
|
||||||
|
}
|
||||||
|
|
||||||
this->strikeThroughParser->Parse(line);
|
this->strikeThroughParser->Parse(line);
|
||||||
|
|
||||||
this->inlineCodeParser->Parse(line);
|
this->inlineCodeParser->Parse(line);
|
||||||
|
|
||||||
|
this->italicParser->Parse(line);
|
||||||
|
|
||||||
|
this->breakLineParser->Parse(line);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<BlockParser>
|
std::shared_ptr<BlockParser>
|
||||||
@ -185,6 +252,14 @@ private:
|
|||||||
{
|
{
|
||||||
parser = this->createUnorderedListParser();
|
parser = this->createUnorderedListParser();
|
||||||
}
|
}
|
||||||
|
else if (
|
||||||
|
this->config &&
|
||||||
|
!this->config->isHTMLWrappedInParagraph &&
|
||||||
|
maddy::HtmlParser::IsStartingLine(line)
|
||||||
|
)
|
||||||
|
{
|
||||||
|
parser = std::make_shared<maddy::HtmlParser>(nullptr, nullptr);
|
||||||
|
}
|
||||||
else if (maddy::ParagraphParser::IsStartingLine(line))
|
else if (maddy::ParagraphParser::IsStartingLine(line))
|
||||||
{
|
{
|
||||||
parser = std::make_shared<maddy::ParagraphParser>(
|
parser = std::make_shared<maddy::ParagraphParser>(
|
||||||
|
31
include/maddy/parserconfig.h
Normal file
31
include/maddy/parserconfig.h
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
/*
|
||||||
|
* This project is licensed under the MIT license. For more information see the
|
||||||
|
* LICENSE file.
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
// -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
namespace maddy {
|
||||||
|
|
||||||
|
// -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ParserConfig
|
||||||
|
*
|
||||||
|
* @class
|
||||||
|
*/
|
||||||
|
struct ParserConfig
|
||||||
|
{
|
||||||
|
bool isEmphasizedParserEnabled;
|
||||||
|
bool isHTMLWrappedInParagraph;
|
||||||
|
|
||||||
|
ParserConfig()
|
||||||
|
: isEmphasizedParserEnabled(true)
|
||||||
|
, isHTMLWrappedInParagraph(true)
|
||||||
|
{}
|
||||||
|
}; // class ParserConfig
|
||||||
|
|
||||||
|
// -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
} // namespace maddy
|
@ -30,9 +30,9 @@ public:
|
|||||||
/**
|
/**
|
||||||
* Parse
|
* 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
|
* @method
|
||||||
* @param {std::string&} line The line to interpret
|
* @param {std::string&} line The line to interpret
|
||||||
@ -41,10 +41,16 @@ public:
|
|||||||
void
|
void
|
||||||
Parse(std::string& line) override
|
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>";
|
static std::string replacement = "<strong>$1</strong>";
|
||||||
|
for (const auto& re : res)
|
||||||
line = std::regex_replace(line, re, replacement);
|
{
|
||||||
|
line = std::regex_replace(line, re, replacement);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}; // class StrongParser
|
}; // class StrongParser
|
||||||
|
|
||||||
|
@ -54,7 +54,7 @@ public:
|
|||||||
static bool
|
static bool
|
||||||
IsStartingLine(const std::string& line)
|
IsStartingLine(const std::string& line)
|
||||||
{
|
{
|
||||||
static std::regex re("^\\* .*");
|
static std::regex re("^[+*-] .*");
|
||||||
return std::regex_match(line, re);
|
return std::regex_match(line, re);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -89,7 +89,7 @@ protected:
|
|||||||
bool isStartOfNewListItem = IsStartingLine(line);
|
bool isStartOfNewListItem = IsStartingLine(line);
|
||||||
uint32_t indentation = getIndentationWidth(line);
|
uint32_t indentation = getIndentationWidth(line);
|
||||||
|
|
||||||
static std::regex lineRegex("^(\\* )");
|
static std::regex lineRegex("^([+*-] )");
|
||||||
line = std::regex_replace(line, lineRegex, "");
|
line = std::regex_replace(line, lineRegex, "");
|
||||||
|
|
||||||
if (!this->isStarted)
|
if (!this->isStarted)
|
||||||
|
@ -1 +1 @@
|
|||||||
Subproject commit 5490beb0602eab560fa3969a4410e11d94bf12af
|
Subproject commit 703bd9caab50b139428cea1aaff9974ebee5742e
|
35
tests/maddy/test_maddy_breaklineparser.cpp
Normal file
35
tests/maddy/test_maddy_breaklineparser.cpp
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
/*
|
||||||
|
* This project is licensed under the MIT license. For more information see the
|
||||||
|
* LICENSE file.
|
||||||
|
*/
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
|
#include "gmock/gmock.h"
|
||||||
|
|
||||||
|
#include "maddy/breaklineparser.h"
|
||||||
|
|
||||||
|
// -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
TEST(MADDY_BREAKLINEPARSER, ItReplacesMarkdownWithBreakLineHTML)
|
||||||
|
{
|
||||||
|
std::string text =
|
||||||
|
"Test the text\r\n"
|
||||||
|
"test text to check\r\n"
|
||||||
|
"check testing to text.\r"
|
||||||
|
"Check test to test text\r"
|
||||||
|
"This is a test\r\n"
|
||||||
|
"No more test to check";
|
||||||
|
|
||||||
|
std::string expected =
|
||||||
|
"Test the text<br>"
|
||||||
|
"test text to check<br>"
|
||||||
|
"check testing to text.<br>"
|
||||||
|
"Check test to test text<br>"
|
||||||
|
"This is a test<br>"
|
||||||
|
"No more test to check";
|
||||||
|
auto breakLineParser = std::make_shared<maddy::BreakLineParser>();
|
||||||
|
|
||||||
|
breakLineParser->Parse(text);
|
||||||
|
|
||||||
|
ASSERT_EQ(text, expected);
|
||||||
|
}
|
@ -12,7 +12,7 @@
|
|||||||
|
|
||||||
TEST(MADDY_EMPHASIZEDPARSER, ItReplacesMarkdownWithEmphasizedHTML)
|
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";
|
std::string expected = "some text <em>bla</em> text testing <em>it</em> out";
|
||||||
auto emphasizedParser = std::make_shared<maddy::EmphasizedParser>();
|
auto emphasizedParser = std::make_shared<maddy::EmphasizedParser>();
|
||||||
|
|
||||||
@ -23,7 +23,7 @@ TEST(MADDY_EMPHASIZEDPARSER, ItReplacesMarkdownWithEmphasizedHTML)
|
|||||||
|
|
||||||
TEST(MADDY_EMPHASIZEDPARSER, ItDoesNotParseInsideInlineCode)
|
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";
|
std::string expected = "some text `*bla*` `/**text*/` testing <em>it</em> out";
|
||||||
auto emphasizedParser = std::make_shared<maddy::EmphasizedParser>();
|
auto emphasizedParser = std::make_shared<maddy::EmphasizedParser>();
|
||||||
|
|
||||||
|
82
tests/maddy/test_maddy_htmlparser.cpp
Normal file
82
tests/maddy/test_maddy_htmlparser.cpp
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
/*
|
||||||
|
* This project is licensed under the MIT license. For more information see the
|
||||||
|
* LICENSE file.
|
||||||
|
*/
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
|
#include "gmock/gmock.h"
|
||||||
|
|
||||||
|
#include "maddy/htmlparser.h"
|
||||||
|
|
||||||
|
// -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
class MADDY_HTMLPARSER : public ::testing::Test
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
std::shared_ptr<maddy::HtmlParser> pParser;
|
||||||
|
|
||||||
|
void
|
||||||
|
SetUp() override
|
||||||
|
{
|
||||||
|
this->pParser = std::make_shared<maddy::HtmlParser>(
|
||||||
|
nullptr,
|
||||||
|
nullptr
|
||||||
|
);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
TEST_F(MADDY_HTMLPARSER, IsFinishedReturnsFalseInTheBeginning)
|
||||||
|
{
|
||||||
|
ASSERT_FALSE(pParser->IsFinished());
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(MADDY_HTMLPARSER, IsStartingLineReturnsFalseWhenFacedWithNoSmallerThan)
|
||||||
|
{
|
||||||
|
const std::vector<std::string> markdown = {
|
||||||
|
"> quote"
|
||||||
|
, "some text"
|
||||||
|
, "* list"
|
||||||
|
, "1. numbered list"
|
||||||
|
, "|table>"
|
||||||
|
};
|
||||||
|
|
||||||
|
for (size_t i = 0; i < markdown.size(); ++i)
|
||||||
|
{
|
||||||
|
ASSERT_FALSE(maddy::HtmlParser::IsStartingLine(markdown[i]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(MADDY_HTMLPARSER, IsStartingLineReturnsTrueWhenFacedWithSmallerThan)
|
||||||
|
{
|
||||||
|
const std::string markdown = "<div id=\"test\">test element</div>";
|
||||||
|
|
||||||
|
ASSERT_TRUE(maddy::HtmlParser::IsStartingLine(markdown));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(MADDY_HTMLPARSER, ItReplacesNoHtml)
|
||||||
|
{
|
||||||
|
const std::vector<std::string> markdown {
|
||||||
|
"some text in a paragraph"
|
||||||
|
, ""
|
||||||
|
, "<div> some HTML</div>"
|
||||||
|
, ""
|
||||||
|
, "<div>more"
|
||||||
|
, "HTML"
|
||||||
|
, "</div>"
|
||||||
|
, ""
|
||||||
|
};
|
||||||
|
const std::string expected = "some text in a paragraph <div> some HTML</div><div>more HTML </div>";
|
||||||
|
|
||||||
|
for (std::string md : markdown)
|
||||||
|
{
|
||||||
|
pParser->AddLine(md);
|
||||||
|
}
|
||||||
|
ASSERT_TRUE(pParser->IsFinished());
|
||||||
|
|
||||||
|
std::stringstream& output(pParser->GetResult());
|
||||||
|
const std::string& outputString = output.str();
|
||||||
|
|
||||||
|
ASSERT_EQ(expected, outputString);
|
||||||
|
}
|
23
tests/maddy/test_maddy_italicparser.cpp
Normal file
23
tests/maddy/test_maddy_italicparser.cpp
Normal 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);
|
||||||
|
}
|
@ -96,3 +96,26 @@ TEST_F(MADDY_ORDEREDLISTPARSER, ItReplacesMarkdownWithAnHierachicalHtmlList)
|
|||||||
|
|
||||||
ASSERT_EQ(expected, outputString);
|
ASSERT_EQ(expected, outputString);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(MADDY_ORDEREDLISTPARSER, ItReplacesNumberedMarkdownListWithAnHtmlOrderedList)
|
||||||
|
{
|
||||||
|
std::vector<std::string> markdown = {
|
||||||
|
"1. a"
|
||||||
|
, "94. b"
|
||||||
|
, "103. c"
|
||||||
|
, ""
|
||||||
|
};
|
||||||
|
std::string expected = "<ol><li>a</li><li>b</li><li>c</li></ol>";
|
||||||
|
|
||||||
|
for (std::string md : markdown)
|
||||||
|
{
|
||||||
|
olParser->AddLine(md);
|
||||||
|
}
|
||||||
|
|
||||||
|
ASSERT_TRUE(olParser->IsFinished());
|
||||||
|
|
||||||
|
std::stringstream& output(olParser->GetResult());
|
||||||
|
const std::string& outputString = output.str();
|
||||||
|
|
||||||
|
ASSERT_EQ(expected, outputString);
|
||||||
|
}
|
||||||
|
@ -19,3 +19,18 @@ TEST(MADDY_PARSER, ItShouldParse)
|
|||||||
|
|
||||||
ASSERT_EQ(testHtml, output);
|
ASSERT_EQ(testHtml, output);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(MADDY_PARSER, ItShouldParseWithConfig)
|
||||||
|
{
|
||||||
|
auto config = std::make_shared<maddy::ParserConfig>();
|
||||||
|
config->isEmphasizedParserEnabled = false;
|
||||||
|
config->isHTMLWrappedInParagraph = false;
|
||||||
|
|
||||||
|
auto parser = std::make_shared<maddy::Parser>(config);
|
||||||
|
|
||||||
|
std::stringstream markdown(testMarkdown);
|
||||||
|
|
||||||
|
const std::string output = parser->Parse(markdown);
|
||||||
|
|
||||||
|
ASSERT_EQ(testHtml2, output);
|
||||||
|
}
|
||||||
|
@ -11,9 +11,9 @@ const std::string testMarkdown = "# This is a test\n\
|
|||||||
This should result in a praragraph\n\
|
This should result in a praragraph\n\
|
||||||
it's that simple.\n\
|
it's that simple.\n\
|
||||||
\n\
|
\n\
|
||||||
* an unordered list\n\
|
* an *unordered* list\n\
|
||||||
* with some **hierarchy**\n\
|
* with some **hierarchy**\n\
|
||||||
1. and an *ordered*\n\
|
1. and an _ordered_\n\
|
||||||
* list\n\
|
* list\n\
|
||||||
* directly\n\
|
* directly\n\
|
||||||
* inside\n\
|
* inside\n\
|
||||||
@ -42,6 +42,8 @@ And well - let's see how an image would be shown:\n\
|
|||||||
\n\
|
\n\
|
||||||
---\n\
|
---\n\
|
||||||
\n\
|
\n\
|
||||||
|
<a name=\"to top\"></a>\n\
|
||||||
|
\n\
|
||||||
### and more headlines\n\
|
### and more headlines\n\
|
||||||
\n\
|
\n\
|
||||||
- [ ] how\n\
|
- [ ] how\n\
|
||||||
@ -67,4 +69,5 @@ foot a|foot b|foot c\n\
|
|||||||
\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/><p><a name=\"to top\"></a> </p><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 testHtml2 = "<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 _ordered_</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/><a name=\"to top\"></a><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>";
|
||||||
|
@ -12,33 +12,87 @@
|
|||||||
|
|
||||||
TEST(MADDY_STRONGPARSER, ItReplacesMarkdownWithStrongHTML)
|
TEST(MADDY_STRONGPARSER, ItReplacesMarkdownWithStrongHTML)
|
||||||
{
|
{
|
||||||
std::string text = "some text **bla** text testing **it** out";
|
struct testIt
|
||||||
std::string expected = "some text <strong>bla</strong> text testing <strong>it</strong> out";
|
{
|
||||||
|
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>();
|
auto strongParser = std::make_shared<maddy::StrongParser>();
|
||||||
|
|
||||||
strongParser->Parse(text);
|
for (auto& test : tests)
|
||||||
|
{
|
||||||
ASSERT_EQ(expected, text);
|
strongParser->Parse(test.text);
|
||||||
|
ASSERT_EQ(test.expected, test.text);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(MADDY_STRONGPARSER, ItReplacesEmphasizedMarkdownNotWithStrongHTML)
|
TEST(MADDY_STRONGPARSER, ItReplacesEmphasizedMarkdownNotWithStrongHTML)
|
||||||
{
|
{
|
||||||
std::string text = "some text *bla* text testing **it** out";
|
struct testIt
|
||||||
std::string expected = "some text *bla* text testing <strong>it</strong> out";
|
{
|
||||||
|
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>();
|
auto strongParser = std::make_shared<maddy::StrongParser>();
|
||||||
|
|
||||||
strongParser->Parse(text);
|
for (auto& test : tests)
|
||||||
|
{
|
||||||
ASSERT_EQ(expected, text);
|
strongParser->Parse(test.text);
|
||||||
|
ASSERT_EQ(test.expected, test.text);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(MADDY_STRONGPARSER, ItDoesNotParseInsideInlineCode)
|
TEST(MADDY_STRONGPARSER, ItDoesNotParseInsideInlineCode)
|
||||||
{
|
{
|
||||||
std::string text = "some text **bla** `/**text**/` testing `**it**` out";
|
struct testIt
|
||||||
std::string expected = "some text **bla** `/**text**/` testing `**it**` out";
|
{
|
||||||
|
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>();
|
auto strongParser = std::make_shared<maddy::StrongParser>();
|
||||||
|
|
||||||
strongParser->Parse(text);
|
for (auto& test : tests)
|
||||||
|
{
|
||||||
ASSERT_EQ(expected, text);
|
strongParser->Parse(test.text);
|
||||||
|
ASSERT_EQ(test.expected, test.text);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -55,9 +55,14 @@ TEST_F(MADDY_UNORDEREDLISTPARSER, ItReplacesMarkdownWithAnHtmlUnorderedList)
|
|||||||
std::vector<std::string> markdown = {
|
std::vector<std::string> markdown = {
|
||||||
"* a"
|
"* a"
|
||||||
, "* b"
|
, "* b"
|
||||||
|
, "- c"
|
||||||
|
, "- d"
|
||||||
|
, "+ e"
|
||||||
|
, "+ f"
|
||||||
|
, "* g"
|
||||||
, ""
|
, ""
|
||||||
};
|
};
|
||||||
std::string expected = "<ul><li>a</li><li>b</li></ul>";
|
std::string expected = "<ul><li>a</li><li>b</li><li>c</li><li>d</li><li>e</li><li>f</li><li>g</li></ul>";
|
||||||
|
|
||||||
for (std::string md : markdown)
|
for (std::string md : markdown)
|
||||||
{
|
{
|
||||||
@ -80,9 +85,12 @@ TEST_F(MADDY_UNORDEREDLISTPARSER, ItReplacesMarkdownWithAnHierachicalHtmlList)
|
|||||||
, " * e"
|
, " * e"
|
||||||
, "* b"
|
, "* b"
|
||||||
, " * c"
|
, " * c"
|
||||||
|
, " + x"
|
||||||
|
, " + y"
|
||||||
|
, " - z"
|
||||||
, ""
|
, ""
|
||||||
};
|
};
|
||||||
std::string expected = "<ul><li>a<ul><li>d</li><li>e</li></ul></li><li>b<ul><li>c</li></ul></li></ul>";
|
std::string expected = "<ul><li>a<ul><li>d</li><li>e</li></ul></li><li>b<ul><li>c</li><li>x</li><li>y</li><li>z</li></ul></li></ul>";
|
||||||
|
|
||||||
for (std::string md : markdown)
|
for (std::string md : markdown)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user