@@ -4,6 +4,14 @@ class CleanHtmlFilter < Filter
4
4
def call
5
5
# Remove unnecessary elements
6
6
css ( 'head, script, style' ) . remove
7
+ # Wrap code blocks with pre tags and add syntax highlighting
8
+ css ( 'code' ) . each do |node |
9
+ unless node . parent . name == 'pre'
10
+ pre = node . wrap ( '<pre>' )
11
+ pre [ 'data-language' ] = 'javascript'
12
+ pre [ 'class' ] = 'language-javascript'
13
+ end
14
+ end
7
15
8
16
# Handle source links
9
17
css ( 'h2' ) . each do |node |
@@ -202,39 +210,13 @@ def call
202
210
end
203
211
end
204
212
205
- # Clean up code blocks
206
- css ( 'pre' ) . each do |node |
207
- wrapper = doc . document . create_element ( 'div' )
208
- wrapper [ 'class' ] = 'highlight'
209
- node . replace ( wrapper )
210
-
211
- div = doc . document . create_element ( 'div' )
212
- div [ 'class' ] = 'highlight-javascript notranslate'
213
- wrapper . add_child ( div )
214
-
215
- pre = doc . document . create_element ( 'pre' )
216
- pre [ 'class' ] = ''
217
- div . add_child ( pre )
218
-
219
- # Format the code content
220
- code = node . content . strip
221
-
222
- # Add syntax highlighting spans
223
- highlighted_code = highlight_javascript ( code )
224
-
225
- pre . inner_html = highlighted_code
226
- end
227
-
228
213
# Add proper heading IDs and classes
229
214
css ( 'h1, h2, h3, h4' ) . each do |node |
230
215
node [ 'id' ] ||= node . content . strip . downcase . gsub ( /[^\w ]+/ , '-' )
231
216
existing_class = node [ 'class' ] . to_s
232
217
node [ 'class' ] = "#{ existing_class } section-header"
233
218
end
234
219
235
- # Remove interactive examples
236
- css ( '.threejs_example_container' ) . remove
237
-
238
220
# Add note styling
239
221
css ( 'p' ) . each do |node |
240
222
if node . content . start_with? ( 'Note:' )
@@ -254,35 +236,8 @@ def call
254
236
node . replace ( wrapper )
255
237
end
256
238
end
257
-
258
- # Remove the navigation arrows and links
259
- css ( '.nav' ) . remove if at_css ( '.nav' )
260
- # If the arrows are in a different container, adjust the selector accordingly
261
-
262
239
doc
263
240
end
264
-
265
- private
266
-
267
- def highlight_javascript ( code )
268
- code = code . gsub ( /\b (function|return|var|let|const|if|else|for|while|do|switch|case|break|continue|new|try|catch|throw|this|typeof|instanceof|in|of|class|extends|super|import|export|default|null|undefined|true|false)\b / , '<span class="k">\1</span>' ) # keywords
269
- code = code . gsub ( /\b (\d +(\. \d +)?)\b / , '<span class="mi">\1</span>' ) # numbers
270
- code = code . gsub ( /'([^']*)'/ , '<span class="s1">\'\1\'</span>' ) # single quotes
271
- code = code . gsub ( /"([^"]*)"/ , '<span class="s2">"\1"</span>' ) # double quotes
272
- code = code . gsub ( /`([^`]*)`/ , '<span class="s2">`\1`</span>' ) # template literals
273
- code = code . gsub ( /\/ \/ [^\n ]*/ , '<span class="c1">\0</span>' ) # single line comments
274
- code = code . gsub ( /\b (console|document|window|Array|Object|String|Number|Boolean|Function|Symbol|Map|Set|Promise|async|await)\b / , '<span class="nb">\1</span>' ) # built-ins
275
- code = code . gsub ( /([a-zA-Z_$][a-zA-Z0-9_$]*)\s *\( / , '<span class="nx">\1</span>(' ) # function calls
276
- code = code . gsub ( /\b (addEventListener|querySelector|getElementById|setTimeout|setInterval)\b / , '<span class="nx">\1</span>' ) # common methods
277
-
278
- # Add line numbers
279
- lines = code . split ( "\n " )
280
- numbered_lines = lines . map . with_index ( 1 ) do |line , i |
281
- "<span class=\" lineno\" >#{ i } </span>#{ line } "
282
- end
283
-
284
- numbered_lines . join ( "\n " )
285
- end
286
241
end
287
242
end
288
243
end
0 commit comments