0230112星期四:
主要利用了H5的canvas功能,分為 2個js文件 html2canvas.js和canvas2image.js
項目源碼的壓縮包會在文章的最底部分享給大家。
界面代碼如下:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>html2image</title>
<meta http-equiv="Access-Control-Allow-Origin" content="*">
<script type="text/javascript" src="jquery-2.1.4.min.js"></script>
<script type="text/javascript" src="./html2canvas.js"></script>
<script src="./canvas2image.js"></script>
<script>
$(document).ready(function () {
$("#saveAsImage").click(function (e) {
saveHtml2Image("div1", 1);
});
});
function saveHtml2Image(objId, scale) {
document.body.scrollTop = 0;
var obj = $("body");
var width = obj.width();;
var height = obj.height();
var scaledCanvas = document.createElement("canvas");
scaledCanvas.width =width;
scaledCanvas.height = height;
scaledCanvas.style.width = width + "px";
scaledCanvas.style.height = height + "px";
var scaledContext = scaledCanvas.getContext("2d");
scaledContext.scale(1, 1);
var width = $(window).width();
var height = $(window).height();
html2canvas(obj, {
canvas: scaledCanvas,
width: width,
height: height,
background: "rgba(255,255,255,1)",
allowTaint:true,
onrendered: function (canvas) {
var dataUrl = Canvas2Image.saveAsJPEG(canvas, parseInt(width * scale), parseInt(height * scale));
obj.html("<img src='"+dataUrl+"' crossOrigin = 'anonymous'>")
}
});
}
</script>
</head>
<body id="div1" style="width:400px">
<div style="color:red;padding:10px 10px;" style="width:400px">
<div>
<span>
我要變圖片
</span>
</div>
<div style="clear:both;"></div>
<div>
<span>
我要變圖片
</span>
</div>
<div style="clear:both;"></div>
<input type="button" value="saveHtmlAsImage" id="saveAsImage" />
<a href="" id="downloadImage" style="display:none;">downloadImage</a>
</div>
</body>
</html>
當(dāng)今互聯(lián)網(wǎng)時代,HTML 和 Markdown 都是非常流行的標(biāo)記語言。HTML 用于構(gòu)建網(wǎng)頁結(jié)構(gòu)和內(nèi)容,而 Markdown 則以其簡潔易讀的語法被廣泛用于編寫文檔、博客文章等。在很多場景下,我們需要將 HTML 內(nèi)容轉(zhuǎn)換為 Markdown 格式,例如網(wǎng)頁內(nèi)容抓取、文檔格式轉(zhuǎn)換等。
Rust 作為一門以安全、性能和可靠性著稱的系統(tǒng)級編程語言,也提供了相應(yīng)的庫來處理 HTML 到 Markdown 的轉(zhuǎn)換。本文將介紹一個名為 htmd 的 Rust 庫,它提供了一種高效且易于使用的方式來完成這項任務(wù)。
htmd 是一個受 JavaScript 庫 turndown.js 啟發(fā)而開發(fā)的 Rust 庫,用于將 HTML 文檔轉(zhuǎn)換為 Markdown 格式。它具有以下特點(diǎn):
在使用 htmd 之前,我們需要先安裝它。將以下依賴項添加到你的 Cargo.toml 文件中:
[dependencies]
htmd = "0.1"
基本轉(zhuǎn)換
使用 htmd 進(jìn)行 HTML 到 Markdown 的基本轉(zhuǎn)換非常簡單。以下代碼展示了如何將一個 <h1> 標(biāo)簽轉(zhuǎn)換為 Markdown 中的 # 標(biāo)題:
use htmd::HtmlToMarkdown;
fn main() {
let markdown = HtmlToMarkdown::new();
let html = "<h1>這是一個標(biāo)題</h1>";
let result = markdown.convert(html).unwrap();
assert_eq!(result, "# 這是一個標(biāo)題\n");
}
跳過標(biāo)簽
在某些情況下,我們可能希望跳過 HTML 文檔中的某些標(biāo)簽,例如 <script> 和 <style> 標(biāo)簽。htmd 提供了 skip_tags 方法來實(shí)現(xiàn)這一點(diǎn):
use htmd::HtmlToMarkdown;
fn main() {
let markdown = HtmlToMarkdown::builder()
.skip_tags(vec!["script", "style"])
.build();
let html = r#"
<script>
// 一些 JavaScript 代碼
</script>
<h1>這是一個標(biāo)題</h1>
"#;
let result = markdown.convert(html).unwrap();
assert_eq!(result, "# 這是一個標(biāo)題\n");
}
自定義標(biāo)簽處理器
htmd 允許我們自定義標(biāo)簽處理器來處理特定的 HTML 標(biāo)簽。例如,我們可以定義一個處理器將 <img> 標(biāo)簽轉(zhuǎn)換為 Markdown 中的圖片語法:
use htmd::{HtmlToMarkdown, HandleResult};
use html5ever::tendril::StrTendril;
use html5ever::QualName;
fn main() {
let markdown = HtmlToMarkdown::builder()
.add_handler(
vec!["img"],
|el| {
let src = el
.attrs
.iter()
.find(|(name, _)| name.local.as_ref() == "src")
.map(|(_, value)| value.as_ref());
let alt = el
.attrs
.iter()
.find(|(name, _)| name.local.as_ref() == "alt")
.map(|(_, value)| value.as_ref());
match (src, alt) {
(Some(src), Some(alt)) => Some(format!("", alt, src)),
_ => None,
}
},
)
.build();
let html = r#"<img src="https://example.com/image.jpg" alt="圖片描述">"#;
let result = markdown.convert(html).unwrap();
assert_eq!(result, "\n");
}
多線程處理
htmd 支持多線程處理,可以充分利用多核 CPU 的性能來加速轉(zhuǎn)換過程。以下代碼展示了如何使用多線程將多個 HTML 文檔轉(zhuǎn)換為 Markdown:
use htmd::HtmlToMarkdown;
use std::sync::Arc;
use std::thread;
fn main() {
let markdown = Arc::new(HtmlToMarkdown::new());
let html_docs = vec![
"<h1>文檔 1</h1>",
"<h2>文檔 2</h2>",
"<h3>文檔 3</h3>",
];
let threads: Vec<_> = html_docs
.into_iter()
.map(|html| {
let markdown = markdown.clone();
thread::spawn(move || {
let result = markdown.convert(html).unwrap();
println!("{}", result);
})
})
.collect();
for thread in threads {
thread.join().unwrap();
}
}
htmd 是一個功能強(qiáng)大且易于使用的 Rust 庫,用于將 HTML 文檔轉(zhuǎn)換為 Markdown 格式。它提供了豐富的選項、自定義標(biāo)簽處理器和多線程支持,可以滿足各種轉(zhuǎn)換需求。如果你正在尋找一種高效可靠的 HTML 到 Markdown 轉(zhuǎn)換解決方案,htmd 絕對值得一試。
*請認(rèn)真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。