Libpasmyhtml
libPasMyHTML is delphi and object pascal wrapper around MyHTML library. Fast HTML 5 Parser. Using threads.
Install / Use
/learn @isemenkov/LibpasmyhtmlREADME
libPasMyHTML
It is delphi and object pascal bindings and wrapper around MyHTML library. MyHTML is a fast HTML 5 Parser using Threads.
Table of contents
Requirements
Library is tested for
- Embarcadero (R) Delphi 10.3 on Windows 7 Service Pack 1 (Version 6.1, Build 7601, 64-bit Edition)
- FreePascal Compiler (3.2.0) and Lazarus IDE (2.0.10) on Ubuntu Linux 5.8.0-33-generic x86_64
Installation
Get the sources and add the source directory to the project search path. For FPC add the source directory to the fpc.cfg file.
Usage
Clone the repository git clone https://github.com/isemenkov/libpasmyhtml.
Add the unit you want to use to the uses clause.
Testing
A testing framework consists of the following ingredients:
- Test runner project located in
unit-testsdirectory. - Test cases (DUnit for Delphi and FPCUnit for FPC based) for all containers classes.
Bindings
libpasmyhtml.pas file contains the MyHTML translated headers to use this library in pascal programs.
Usage example
uses
libpasmyhtml, utils.api.cstring;
const
HTMLDocument = '<!DOCTYPE html>' + sLineBreak +
'<html>' + sLineBreak +
'<head>' + sLineBreak +
'<meta charset="utf-8" />' + sLineBreak +
'<!--[if lt IE 9]><script src="https://cdnjs.cloudflare.com'+
'/ajax/libs/html5shiv/3.7.3/html5shiv.min.js"></script>' +
'<![endif]-->' + sLineBreak +
'<title>Document Title</title>' + sLineBreak +
'<meta name="keywords" content="some_keywords keywords" />' + sLineBreak +
'<meta name="description" content="description" />' + sLineBreak +
'<link href="style.css" rel="stylesheet">' + sLineBreak +
'</head>' + sLineBreak +
'<body>' + sLineBreak +
'</body>' + sLineBreak +
'</html>';
var
Node : pmyhtml_tree_node_t;
Title : string;
Error : mystatus_t;
HTML : pmyhtml_t;
Tree : pmyhtml_tree_t;
Encoding : myencoding_t;
function FindNextNodeById (ANode : pmyhtml_tree_node_t; AId : myhtml_tags_t) : pmyhtml_tree_node_t;
inline;
begin
while (ANode <> nil) and (myhtml_node_tag_id(ANode) <> myhtml_tag_id_t(AId)) do
begin
ANode := myhtml_node_next(ANode);
end;
Result := ANode;
end;
function NodeTextValue (ANode : pmyhtml_tree_node_t) : string; inline;
var
TextNode : pmyhtml_tree_node_t;
begin
if ANode <> nil then
TextNode := myhtml_node_child(ANode);
if (TextNode <> nil) and (myhtml_tags_t(myhtml_node_tag_t(TextNode)) = MyHTML_TAG__TEXT) then
begin
Result := API.CString.Create(myhtml_node_text(TextNode, nil)).ToString;
end else
Result := '';
end else
Result := '';
end;
begin
HTML := myhtml_create;
myhtml_init(HTML, MyHTML_OPTIONS_PARSE_MODE_SEPARATELY, 1, 4096);
Tree := myhtml_tree_create;
myhtml_tree_init(Tree, HTML);
myhtml_tree_parse_flags_set(Tree, MyHTML_TREE_PARSE_FLAGS_CLEAN);
Error := myhtml_parse(Tree, MyENCODING_UTF_8,
API.CString.Create(HTMLDocument).ToPAnsiChar, Length(HTMLDocument));
if Error = mystatus_t(MyHTML_STATUS_OK) then
begin
Node := myhtml_tree_get_node_head(Tree);
if Node <> nil then
begin
Node := myhtml_node_child(Node);
if Node <> nil then
begin
Node := FindNextNodeById(Node, MyHTML_TAG_TITLE);
if Node <> nil then
begin
Title := NodeTextValue(Node);
end;
end;
end;
end;
myhtml_tree_clean(Tree);
myhtml_clean(HTML);
myhtml_tree_destroy(Tree);
myhtml_destroy(HTML);
end;
Object wrapper
pasmyhtml.pas file contains the MyHTML object wrapper.
Usage example
uses
pasmyhtml;
const
HTMLDocument = '<!DOCTYPE html>' + sLineBreak +
'<html>' + sLineBreak +
'<head>' + sLineBreak +
'<meta charset="utf-8" />' + sLineBreak +
'<!--[if lt IE 9]><script src="https://cdnjs.cloudflare.com'+
'/ajax/libs/html5shiv/3.7.3/html5shiv.min.js"></script>' +
'<![endif]-->' + sLineBreak +
'<title>Document Title</title>' + sLineBreak +
'<meta name="keywords" content="some_keywords keywords" />' + sLineBreak +
'<meta name="description" content="description" />' + sLineBreak +
'<link href="style.css" rel="stylesheet">' + sLineBreak +
'</head>' + sLineBreak +
'<body>' + sLineBreak +
'</body>' + sLineBreak +
'</html>';
var
Parser : TParser;
Node : TParser.TTagNode;
Value : string;
begin
Parser := TParser.Create(MyHTML_OPTIONS_PARSE_MODE_SEPARATELY, MyENCODE_UTF_8, 1, 4096,
MyHTML_TREE_PARSE_FLAGS_CLEAN);
Node := Parser.Parse(HTMLDocument, DOCUMENT_HEAD);
Node := Node.FirstChildrenNode(TParser.TFilter.Create.Tag(MyHTML_TAG_TITLE));
if Node.IsOk then
begin
Value := Node.Value;
end;
end;
Related Skills
node-connect
347.6kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
108.4kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
347.6kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
qqbot-media
347.6kQQBot 富媒体收发能力。使用 <qqmedia> 标签,系统根据文件扩展名自动识别类型(图片/语音/视频/文件)。
