mirror of
https://github.com/chatmail/core.git
synced 2026-05-20 07:16:31 +03:00
feat: add message parser api to jsonrpc and cffi
api: cffi add `dc_parse_message_text_to_ast_json` and `dc_msg_get_parsed_text_as_json api: jsonrpc: add `get_parsed_message_text_ast_json` and `parse_text_to_ast_json`
This commit is contained in:
@@ -3993,6 +3993,36 @@ int64_t dc_msg_get_sort_timestamp (const dc_msg_t* msg);
|
||||
char* dc_msg_get_text (const dc_msg_t* msg);
|
||||
|
||||
|
||||
#define MESSAGE_PARSER_MODE_ONLY_TEXT 0x00
|
||||
#define MESSAGE_PARSER_MODE_DESKTOP_SET 0x01
|
||||
#define MESSAGE_PARSER_MODE_MARKDOWN 0x02
|
||||
|
||||
/**
|
||||
* Parse text with the message parser.
|
||||
*
|
||||
* @memberof dc_context_t
|
||||
* @param input The text to parse.
|
||||
* @param mode Sets the parsing mode, you can choose between MESSAGE_PARSER_MODE_ONLY_TEXT, MESSAGE_PARSER_MODE_DESKTOP_SET and MESSAGE_PARSER_MODE_MARKDOWN.
|
||||
* Look at https://github.com/deltachat/message-parser/blob/master/spec.md#modes-of-the-parser to learn more about the parser modes.
|
||||
* @return Abstract Syntax Tree for your message that you can use to display parts of a message specially like links.
|
||||
* This ast is returned in json (look at the sourcecode for reference for the format: https://github.com/deltachat/message-parser/blob/master/src/parser/mod.rs#L11)
|
||||
*/
|
||||
char* dc_parse_message_text_to_ast_json (const char* input, int mode);
|
||||
|
||||
|
||||
/**
|
||||
* Parse the text of a message with the message parser.
|
||||
*
|
||||
* @memberof dc_msg_t
|
||||
* @param msg The message object.
|
||||
* @param mode Sets the parsing mode, you can choose between MESSAGE_PARSER_MODE_ONLY_TEXT, MESSAGE_PARSER_MODE_DESKTOP_SET and MESSAGE_PARSER_MODE_MARKDOWN.
|
||||
* Look at https://github.com/deltachat/message-parser/blob/master/spec.md#modes-of-the-parser to learn more about the parser modes.
|
||||
* @return Abstract Syntax Tree for your message that you can use to display parts of a message specially like links.
|
||||
* This ast is returned in json (look at the sourcecode for reference for the format: https://github.com/deltachat/message-parser/blob/master/src/parser/mod.rs#L11)
|
||||
*/
|
||||
char* dc_msg_get_parsed_text_as_json (const dc_msg_t* msg, int mode);
|
||||
|
||||
|
||||
/**
|
||||
* Get the subject of the e-mail.
|
||||
* If there is no subject associated with the message, an empty string is returned.
|
||||
|
||||
@@ -31,6 +31,7 @@ use deltachat::ephemeral::Timer as EphemeralTimer;
|
||||
use deltachat::imex::BackupProvider;
|
||||
use deltachat::key::{DcKey, DcSecretKey};
|
||||
use deltachat::message::MsgId;
|
||||
use deltachat::message_parser::parser;
|
||||
use deltachat::net::read_url_blob;
|
||||
use deltachat::qr_code_generator::{generate_backup_qr, get_securejoin_qr_svg};
|
||||
use deltachat::reaction::{get_msg_reactions, send_reaction, Reactions};
|
||||
@@ -3356,6 +3357,58 @@ pub unsafe extern "C" fn dc_msg_get_text(msg: *mut dc_msg_t) -> *mut libc::c_cha
|
||||
ffi_msg.message.get_text().strdup()
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub unsafe extern "C" fn dc_parse_message_text_to_ast_json(
|
||||
text: *const libc::c_char,
|
||||
mode: u32,
|
||||
) -> *mut libc::c_char {
|
||||
if text.is_null() {
|
||||
eprintln!("ignoring careless call to dc_parse_message_text_to_ast_json()");
|
||||
}
|
||||
let text = to_string_lossy(text);
|
||||
let result = match mode {
|
||||
0 /* OnlyText */ => parser::parse_only_text(&text),
|
||||
1 /* DesktopSet */ => parser::parse_desktop_set(&text),
|
||||
2 /* Markdown */ => parser::parse_markdown_text(&text),
|
||||
_ => {
|
||||
eprintln!("ignoring careless call to dc_parse_message_text_to_ast_json() - invalid mode");
|
||||
return "".strdup();
|
||||
}
|
||||
};
|
||||
if let Ok(result) = serde_json::to_string(&result) {
|
||||
result.strdup()
|
||||
} else {
|
||||
"".strdup()
|
||||
}
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub unsafe extern "C" fn dc_msg_get_parsed_text_as_json(
|
||||
msg: *mut dc_msg_t,
|
||||
mode: u32,
|
||||
) -> *mut libc::c_char {
|
||||
if msg.is_null() {
|
||||
eprintln!("ignoring careless call to dc_msg_get_parsed_text_as_json()");
|
||||
return "".strdup();
|
||||
}
|
||||
let ffi_msg = &*msg;
|
||||
let text = ffi_msg.message.get_text();
|
||||
let result = match mode {
|
||||
0 /* OnlyText */ => parser::parse_only_text(&text),
|
||||
1 /* DesktopSet */ => parser::parse_desktop_set(&text),
|
||||
2 /* Markdown */ => parser::parse_markdown_text(&text),
|
||||
_ => {
|
||||
eprintln!("ignoring careless call to dc_msg_get_parsed_text_as_json() - invalid mode");
|
||||
return "".strdup();
|
||||
}
|
||||
};
|
||||
if let Ok(result) = serde_json::to_string(&result) {
|
||||
result.strdup()
|
||||
} else {
|
||||
"".strdup()
|
||||
}
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub unsafe extern "C" fn dc_msg_get_subject(msg: *mut dc_msg_t) -> *mut libc::c_char {
|
||||
if msg.is_null() {
|
||||
|
||||
Reference in New Issue
Block a user