Skip to content

Commit fcf5383

Browse files
committed
Enhance documentation with syntax highlighting and improved styling
- Add Highlight.js (vs2015 theme) for syntax highlighting - Replace hardcoded HTML spans with library-based highlighting - Add language modules: cpp, c, bash, shell, cmake - Update documentation page styling - Set overall background to #E8E8E8 (light grey) - Set code blocks to #1E1E1E (dark grey, VSCode style) - Set sidebar to #F5F5F5 - Remove CSS color inheritance that was blocking syntax colors - Improve Installation section display - Change to fixed 2-column layout for better readability - Increase card padding and font sizes - Optimize to prevent horizontal scrolling - Fix language tags - Change 'cmd' to 'shell' in markdown files - Add shell language module to support Windows commands
1 parent 71c8216 commit fcf5383

6 files changed

Lines changed: 142 additions & 75 deletions

File tree

docs/content/documentation.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ cv::Mat mat = ccap::convertRgbFrameToMat(*frame);
177177

178178
Uses DirectShow for camera access. Requires MSVC 2019 or later.
179179

180-
```cmd
180+
```shell
181181
cl your_code.c /I"path\to\ccap\include" ^
182182
/link "path\to\ccap\lib\ccap.lib" ole32.lib oleaut32.lib uuid.lib
183183
```

docs/content/documentation.zh.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ cv::Mat mat = ccap::convertRgbFrameToMat(*frame);
177177

178178
使用 DirectShow 访问相机。需要 MSVC 2019 或更高版本。
179179

180-
```cmd
180+
```shell
181181
cl your_code.c /I"path\to\ccap\include" ^
182182
/link "path\to\ccap\lib\ccap.lib" ole32.lib oleaut32.lib uuid.lib
183183
```

docs/css/style.css

Lines changed: 47 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -471,26 +471,26 @@ nav {
471471
}
472472

473473
.code-block {
474-
background: var(--code-bg-dark);
474+
background: #1E1E1E;
475475
border-radius: 12px;
476476
padding: 30px;
477477
overflow-x: auto;
478478
max-width: 800px;
479479
margin: 0 auto;
480+
border: 1px solid #333;
480481
}
481482

482483
.code-block pre {
483484
font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', monospace;
484485
font-size: 0.9rem;
485486
line-height: 1.7;
487+
margin: 0;
486488
}
487489

488-
.code-block .keyword { color: #c792ea; }
489-
.code-block .string { color: #c3e88d; }
490-
.code-block .comment { color: #676e95; }
491-
.code-block .function { color: #82aaff; }
492-
.code-block .type { color: #ffcb6b; }
493-
.code-block .number { color: #f78c6c; }
490+
.code-block code {
491+
background: transparent;
492+
color: #d4d4d4;
493+
}
494494

495495
.code-content {
496496
display: none;
@@ -507,31 +507,52 @@ nav {
507507

508508
.install-methods {
509509
display: grid;
510-
grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));
511-
gap: 24px;
510+
grid-template-columns: repeat(2, 1fr);
511+
gap: 32px;
512512
}
513513

514514
.install-method {
515-
background: var(--bg-secondary);
516-
padding: 28px;
515+
background: white;
516+
padding: 36px;
517517
border-radius: 12px;
518+
box-shadow: var(--shadow-md);
519+
transition: transform var(--transition-normal), box-shadow var(--transition-normal);
520+
min-height: 200px;
521+
display: flex;
522+
flex-direction: column;
523+
}
524+
525+
.install-method:hover {
526+
transform: translateY(-4px);
527+
box-shadow: var(--shadow-lg);
518528
}
519529

520530
.install-method h3 {
521-
margin-bottom: 16px;
531+
margin-bottom: 20px;
522532
color: var(--primary-color);
523-
font-size: 1.1rem;
533+
font-size: 1.3rem;
534+
font-weight: 600;
524535
}
525536

526537
.install-method pre {
527-
background: var(--code-bg);
528-
color: white;
529-
padding: 16px;
538+
background: #1E1E1E;
539+
padding: 24px;
530540
border-radius: 8px;
531541
overflow-x: auto;
532542
font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', monospace;
533-
font-size: 0.85rem;
534-
line-height: 1.6;
543+
font-size: 0.88rem;
544+
line-height: 1.9;
545+
margin: 0;
546+
border: 1px solid #333;
547+
flex: 1;
548+
}
549+
550+
.install-method pre code {
551+
background: transparent;
552+
color: #d4d4d4;
553+
white-space: pre;
554+
word-wrap: normal;
555+
display: block;
535556
}
536557

537558
/* Requirements Section */
@@ -664,11 +685,12 @@ html[lang="zh"] .lang-zh.flex-item {
664685
.doc-layout {
665686
display: flex;
666687
min-height: calc(100vh - var(--header-height));
688+
background: #E8E8E8;
667689
}
668690

669691
.doc-sidebar {
670692
width: 260px;
671-
background: var(--bg-secondary);
693+
background: #F5F5F5;
672694
border-right: 1px solid var(--border-color);
673695
padding: 24px;
674696
position: sticky;
@@ -748,18 +770,20 @@ html[lang="zh"] .lang-zh.flex-item {
748770
}
749771

750772
.doc-content pre {
751-
background: var(--code-bg);
752-
color: white;
773+
background: #1E1E1E;
753774
padding: 20px;
754775
border-radius: 8px;
755776
overflow-x: auto;
756777
margin: 16px 0;
778+
border: 1px solid #333;
757779
}
758780

759781
.doc-content pre code {
760-
background: none;
782+
background: none !important;
761783
padding: 0;
762-
color: inherit;
784+
font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', monospace;
785+
font-size: 0.9em;
786+
color: #d4d4d4;
763787
}
764788

765789
/* Markdown-rendered content styling */

docs/documentation.html

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,13 @@
1111
<script src="https://cdn.jsdelivr.net/npm/marked@9.1.6/marked.min.js" crossorigin="anonymous"></script>
1212
<!-- DOMPurify for HTML sanitization to prevent XSS -->
1313
<script src="https://cdn.jsdelivr.net/npm/dompurify@3.0.6/dist/purify.min.js" crossorigin="anonymous"></script>
14+
<!-- Highlight.js for syntax highlighting -->
15+
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/vs2015.min.css" crossorigin="anonymous">
16+
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js" crossorigin="anonymous"></script>
17+
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/cpp.min.js" crossorigin="anonymous"></script>
18+
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/bash.min.js" crossorigin="anonymous"></script>
19+
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/shell.min.js" crossorigin="anonymous"></script>
20+
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/cmake.min.js" crossorigin="anonymous"></script>
1421
</head>
1522
<body>
1623
<header>
@@ -97,7 +104,11 @@ <h4 class="lang-zh">许可证</h4>
97104
if (typeof marked !== 'undefined') {
98105
marked.setOptions({
99106
breaks: true,
100-
gfm: true
107+
gfm: true,
108+
highlight: function(code, lang) {
109+
// Don't highlight here, let hljs do it after sanitization
110+
return code;
111+
}
101112
});
102113
}
103114

@@ -123,12 +134,13 @@ <h4 class="lang-zh">许可证</h4>
123134
function sanitizeHtml(html) {
124135
if (typeof DOMPurify !== 'undefined') {
125136
return DOMPurify.sanitize(html, {
126-
USE_PROFILES: { html: true },
127137
ALLOWED_TAGS: ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'p', 'br', 'hr',
128138
'ul', 'ol', 'li', 'pre', 'code', 'blockquote',
129139
'table', 'thead', 'tbody', 'tr', 'th', 'td',
130-
'a', 'strong', 'em', 'del', 'img'],
131-
ALLOWED_ATTR: ['href', 'src', 'alt', 'title', 'class', 'id']
140+
'a', 'strong', 'em', 'del', 'img', 'span', 'div'],
141+
ALLOWED_ATTR: ['href', 'src', 'alt', 'title', 'class', 'id'],
142+
KEEP_CONTENT: true,
143+
ALLOW_DATA_ATTR: false
132144
});
133145
}
134146
// Fallback: return as-is if DOMPurify not available
@@ -161,6 +173,21 @@ <h4 class="lang-zh">许可证</h4>
161173
var safeHtml = sanitizeHtml(rawHtml);
162174
document.getElementById('doc-content').innerHTML = safeHtml;
163175

176+
// Apply syntax highlighting to code blocks
177+
// Use setTimeout to ensure DOM is fully updated
178+
setTimeout(function() {
179+
if (typeof hljs !== 'undefined') {
180+
var codeBlocks = document.querySelectorAll('#doc-content pre code');
181+
console.log('Found ' + codeBlocks.length + ' code blocks to highlight');
182+
codeBlocks.forEach(function(block) {
183+
console.log('Highlighting block with class:', block.className);
184+
hljs.highlightElement(block);
185+
});
186+
} else {
187+
console.error('hljs is not loaded!');
188+
}
189+
}, 0);
190+
164191
// Generate sidebar navigation from headings
165192
generateSidebar();
166193

docs/index.html

Lines changed: 51 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,13 @@
88
<meta name="keywords" content="camera capture, C++, C, cross-platform, Windows, macOS, iOS, Linux, DirectShow, AVFoundation, V4L2">
99
<link rel="canonical" href="https://ccap.work/">
1010
<link rel="stylesheet" href="css/style.css">
11+
<!-- Highlight.js for syntax highlighting -->
12+
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/vs2015.min.css" crossorigin="anonymous">
13+
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js" crossorigin="anonymous"></script>
14+
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/cpp.min.js" crossorigin="anonymous"></script>
15+
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/c.min.js" crossorigin="anonymous"></script>
16+
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/bash.min.js" crossorigin="anonymous"></script>
17+
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/cmake.min.js" crossorigin="anonymous"></script>
1118
</head>
1219
<body>
1320
<header>
@@ -178,59 +185,59 @@ <h2 class="section-title lang-zh">快速开始</h2>
178185

179186
<div class="code-block">
180187
<div id="code-cpp" class="code-content active">
181-
<pre><span class="comment">// C++ Example</span>
182-
<span class="keyword">#include</span> <span class="string">&lt;ccap.h&gt;</span>
188+
<pre><code class="language-cpp">// C++ Example
189+
#include &lt;ccap.h&gt;
183190

184-
<span class="type">int</span> <span class="function">main</span>() {
191+
int main() {
185192
ccap::Provider provider;
186193

187-
<span class="comment">// List available cameras</span>
188-
<span class="keyword">auto</span> devices = provider.<span class="function">findDeviceNames</span>();
189-
<span class="keyword">for</span> (<span class="type">size_t</span> i = <span class="number">0</span>; i &lt; devices.<span class="function">size</span>(); ++i) {
190-
<span class="function">printf</span>(<span class="string">"[%zu] %s\n"</span>, i, devices[i].<span class="function">c_str</span>());
194+
// List available cameras
195+
auto devices = provider.findDeviceNames();
196+
for (size_t i = 0; i &lt; devices.size(); ++i) {
197+
printf("[%zu] %s\n", i, devices[i].c_str());
191198
}
192199

193-
<span class="comment">// Open and start camera</span>
194-
<span class="keyword">if</span> (provider.<span class="function">open</span>(<span class="string">""</span>, <span class="keyword">true</span>)) {
195-
<span class="keyword">auto</span> frame = provider.<span class="function">grab</span>(<span class="number">3000</span>);
196-
<span class="keyword">if</span> (frame) {
197-
<span class="function">printf</span>(<span class="string">"Captured: %dx%d\n"</span>,
200+
// Open and start camera
201+
if (provider.open("", true)) {
202+
auto frame = provider.grab(3000);
203+
if (frame) {
204+
printf("Captured: %dx%d\n",
198205
frame-&gt;width, frame-&gt;height);
199206
}
200207
}
201-
<span class="keyword">return</span> <span class="number">0</span>;
202-
}</pre>
208+
return 0;
209+
}</code></pre>
203210
</div>
204211

205212
<div id="code-c" class="code-content">
206-
<pre><span class="comment">// Pure C Example</span>
207-
<span class="keyword">#include</span> <span class="string">&lt;ccap_c.h&gt;</span>
208-
<span class="keyword">#include</span> <span class="string">&lt;ccap_utils_c.h&gt;</span>
213+
<pre><code class="language-c">// Pure C Example
214+
#include &lt;ccap_c.h&gt;
215+
#include &lt;ccap_utils_c.h&gt;
209216

210-
<span class="type">int</span> <span class="function">main</span>() {
211-
CcapProvider* provider = <span class="function">ccap_provider_create</span>();
212-
<span class="keyword">if</span> (!provider) <span class="keyword">return</span> -<span class="number">1</span>;
217+
int main() {
218+
CcapProvider* provider = ccap_provider_create();
219+
if (!provider) return -1;
213220

214-
<span class="comment">// Find available devices</span>
221+
// Find available devices
215222
CcapDeviceNamesList deviceList;
216-
<span class="keyword">if</span> (<span class="function">ccap_provider_find_device_names_list</span>(provider, &amp;deviceList)) {
217-
<span class="function">printf</span>(<span class="string">"Found %zu camera(s)\n"</span>, deviceList.deviceCount);
223+
if (ccap_provider_find_device_names_list(provider, &amp;deviceList)) {
224+
printf("Found %zu camera(s)\n", deviceList.deviceCount);
218225
}
219226

220-
<span class="comment">// Open and capture</span>
221-
<span class="keyword">if</span> (<span class="function">ccap_provider_open</span>(provider, NULL, <span class="keyword">true</span>)) {
222-
CcapVideoFrame* frame = <span class="function">ccap_provider_grab</span>(provider, <span class="number">3000</span>);
223-
<span class="keyword">if</span> (frame) {
227+
// Open and capture
228+
if (ccap_provider_open(provider, NULL, true)) {
229+
CcapVideoFrame* frame = ccap_provider_grab(provider, 3000);
230+
if (frame) {
224231
CcapVideoFrameInfo info;
225-
<span class="function">ccap_video_frame_get_info</span>(frame, &amp;info);
226-
<span class="function">printf</span>(<span class="string">"Captured: %dx%d\n"</span>, info.width, info.height);
227-
<span class="function">ccap_video_frame_release</span>(frame);
232+
ccap_video_frame_get_info(frame, &amp;info);
233+
printf("Captured: %dx%d\n", info.width, info.height);
234+
ccap_video_frame_release(frame);
228235
}
229236
}
230237

231-
<span class="function">ccap_provider_destroy</span>(provider);
232-
<span class="keyword">return</span> <span class="number">0</span>;
233-
}</pre>
238+
ccap_provider_destroy(provider);
239+
return 0;
240+
}</code></pre>
234241
</div>
235242
</div>
236243
</div>
@@ -245,35 +252,33 @@ <h2 class="section-title lang-zh">安装</h2>
245252
<div class="install-method">
246253
<h3 class="lang-en">Build from Source</h3>
247254
<h3 class="lang-zh">从源码构建</h3>
248-
<pre>git clone https://github.com/wysaid/CameraCapture.git
255+
<pre><code class="language-bash">git clone https://github.com/wysaid/CameraCapture.git
249256
cd CameraCapture
250-
./scripts/build_and_install.sh</pre>
257+
./scripts/build_and_install.sh</code></pre>
251258
</div>
252259

253260
<div class="install-method">
254261
<h3>CMake FetchContent</h3>
255-
<pre>include(FetchContent)
256-
FetchContent_Declare(
257-
ccap
258-
GIT_REPOSITORY https://github.com/wysaid/CameraCapture.git
259-
GIT_TAG main
260-
)
262+
<pre><code class="language-cmake">include(FetchContent)
263+
FetchContent_Declare(ccap
264+
GIT_REPOSITORY https://github.com/wysaid/CameraCapture.git
265+
GIT_TAG main)
261266
FetchContent_MakeAvailable(ccap)
262267

263-
target_link_libraries(your_app PRIVATE ccap::ccap)</pre>
268+
target_link_libraries(your_app PRIVATE ccap::ccap)</code></pre>
264269
</div>
265270

266271
<div class="install-method">
267272
<h3>Homebrew (macOS)</h3>
268-
<pre>brew tap wysaid/ccap
269-
brew install ccap</pre>
273+
<pre><code class="language-bash">brew tap wysaid/ccap
274+
brew install ccap</code></pre>
270275
</div>
271276

272277
<div class="install-method">
273278
<h3 class="lang-en">CMake Integration</h3>
274279
<h3 class="lang-zh">CMake 集成</h3>
275-
<pre>find_package(ccap REQUIRED)
276-
target_link_libraries(your_app ccap::ccap)</pre>
280+
<pre><code class="language-cmake">find_package(ccap REQUIRED)
281+
target_link_libraries(your_app ccap::ccap)</code></pre>
277282
</div>
278283
</div>
279284
</div>

docs/js/main.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,13 +291,24 @@
291291
});
292292
}
293293

294+
// Initialize syntax highlighting
295+
function initSyntaxHighlighting() {
296+
if (typeof hljs !== 'undefined') {
297+
// Highlight all code blocks on the page
298+
document.querySelectorAll('pre code').forEach(function(block) {
299+
hljs.highlightElement(block);
300+
});
301+
}
302+
}
303+
294304
// Initialize everything when DOM is ready
295305
function init() {
296306
initLanguage();
297307
initNavigation();
298308
initMobileMenu();
299309
initSmoothScroll();
300310
updateDownloadSection();
311+
initSyntaxHighlighting();
301312
}
302313

303314
// Expose functions globally

0 commit comments

Comments
 (0)