1
0
Fork 0
mirror of https://github.com/KingDuckZ/kamokan.git synced 2024-11-27 00:43:47 +00:00

Use source-highlight library for syntax colorizing.

This commit is contained in:
King_DuckZ 2017-04-07 23:57:32 +01:00
parent ef9e74c473
commit ed25d60351
5 changed files with 83 additions and 5 deletions

View file

@ -1,5 +1,5 @@
cmake_minimum_required(VERSION 3.3 FATAL_ERROR) cmake_minimum_required(VERSION 3.3 FATAL_ERROR)
list (APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules) list (APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules)
project(tawashi_top) project(tawashi_top)
set(TAWSHI_SOURCE_ROOT "${CMAKE_CURRENT_SOURCE_DIR}") set(TAWSHI_SOURCE_ROOT "${CMAKE_CURRENT_SOURCE_DIR}")

View file

@ -0,0 +1,40 @@
# Copyright 2017 by Michele Santullo
#
# Try to find sourge-highlight
# Usage of this module as follows:
#
# find_package(SourceHighlight)
#
# The following variables will be defined:
#
# SourceHighlight_FOUND - system has source-highlight
# SourceHighlight_INCLUDE_DIR - the libsource-highlight include directory
# SourceHighlight_LIBRARIES - The libraries needed to use libsource-highlight
find_path(SourceHighlight_ROOT_DIR
NAMES include/srchilite/sourcehighlight.h
)
find_path(SourceHighlight_INCLUDE_DIR
NAMES srchilite/sourcehighlight.h
HINTS ${SourceHighlight_ROOT_DIR}/include
)
find_library(SourceHighlight_LIBRARIES
NAMES source-highlight
HINTS ${SourceHighlight_ROOT_DIR}/lib
)
if(SourceHighlight_INCLUDE_DIR AND SourceHighlight_LIBRARIES AND Ncurses_LIBRARY)
set(SourceHighlight_FOUND ON)
else(SourceHighlight_INCLUDE_DIR AND SourceHighlight_LIBRARIES AND Ncurses_LIBRARY)
find_library(SourceHighlight_LIBRARIES NAMES readline)
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(SourceHighlight DEFAULT_MSG SourceHighlight_INCLUDE_DIR SourceHighlight_LIBRARIES )
mark_as_advanced(SourceHighlight_INCLUDE_DIR SourceHighlight_LIBRARIES)
endif(SourceHighlight_INCLUDE_DIR AND SourceHighlight_LIBRARIES AND Ncurses_LIBRARY)
mark_as_advanced(
SourceHighlight_INCLUDE_DIR
SourceHighlight_LIBRARIES
)

View file

@ -2,6 +2,7 @@ project(tawashi CXX)
find_package(Boost 1.53.0 REQUIRED COMPONENTS program_options filesystem system) find_package(Boost 1.53.0 REQUIRED COMPONENTS program_options filesystem system)
find_package(CURL REQUIRED) find_package(CURL REQUIRED)
find_package(SourceHighlight REQUIRED)
set(CMAKE_CXX_STANDARD 14) set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_STANDARD_REQUIRED ON)
@ -25,11 +26,13 @@ target_include_directories(${PROJECT_NAME} SYSTEM
PRIVATE ${Boost_INCLUDE_DIRS} PRIVATE ${Boost_INCLUDE_DIRS}
PRIVATE ${TAWASHI_SOURCE_ROOT}/lib/bette-enums PRIVATE ${TAWASHI_SOURCE_ROOT}/lib/bette-enums
PRIVATE ${CURL_INCLUDE_DIR} PRIVATE ${CURL_INCLUDE_DIR}
PRIVATE ${SourceHighlight_INCLUDE_DIR}
) )
target_link_libraries(${PROJECT_NAME} target_link_libraries(${PROJECT_NAME}
PRIVATE ${Boost_LIBRARIES} PRIVATE ${Boost_LIBRARIES}
PRIVATE incredis PRIVATE incredis
${CURL_LIBRARIES} PRIVATE ${CURL_LIBRARIES}
PRIVATE ${SourceHighlight_LIBRARIES}
) )
target_compile_definitions(${PROJECT_NAME} target_compile_definitions(${PROJECT_NAME}
PRIVATE BOOST_SPIRIT_USE_PHOENIX_V3=1 PRIVATE BOOST_SPIRIT_USE_PHOENIX_V3=1

View file

@ -18,14 +18,34 @@
#include "pastie_response.hpp" #include "pastie_response.hpp"
#include "incredis/incredis.hpp" #include "incredis/incredis.hpp"
#include <ciso646> #include <ciso646>
#include <srchilite/sourcehighlight.h>
#include <srchilite/langmap.h>
#include <sstream>
namespace tawashi { namespace tawashi {
PastieResponse::PastieResponse (redis::IncRedis& parRedis) : PastieResponse::PastieResponse (redis::IncRedis& parRedis) :
Response(Response::ContentType, "text/plain"), Response(Response::ContentType, "text/html"),
m_redis(parRedis) m_redis(parRedis),
m_plain_text(false)
{ {
} }
void PastieResponse::on_process() {
auto env = cgi_env().query_string_split();
if (env["m"] == "plain") {
this->change_type(Response::ContentType, "text/plain");
m_plain_text = true;
}
else {
srchilite::LangMap lang_map("/usr/share/source-highlight", "lang.map");
lang_map.open();
if (not cgi_env().query_string().empty())
m_lang_file = lang_map.getFileName(cgi_env().query_string());
else
m_lang_file = "default.lang";
}
}
void PastieResponse::on_send (std::ostream& parStream) { void PastieResponse::on_send (std::ostream& parStream) {
using opt_string = redis::IncRedis::opt_string; using opt_string = redis::IncRedis::opt_string;
@ -38,6 +58,18 @@ namespace tawashi {
if (not pastie) { if (not pastie) {
} }
if (m_plain_text) {
parStream << *pastie; parStream << *pastie;
} }
else {
srchilite::SourceHighlight highlighter;
highlighter.setDataDir("/usr/share/source-highlight");
highlighter.setGenerateEntireDoc(false);
highlighter.setGenerateLineNumbers(true);
const auto lang = m_lang_file;
std::istringstream iss(*pastie);
highlighter.highlight(iss, parStream, lang);
}
}
} //namespace tawashi } //namespace tawashi

View file

@ -30,8 +30,11 @@ namespace tawashi {
PastieResponse (redis::IncRedis& parRedis); PastieResponse (redis::IncRedis& parRedis);
private: private:
virtual void on_process() override;
virtual void on_send (std::ostream& parStream) override; virtual void on_send (std::ostream& parStream) override;
redis::IncRedis& m_redis; redis::IncRedis& m_redis;
std::string m_lang_file;
bool m_plain_text;
}; };
} //namespace tawashi } //namespace tawashi