diff --git a/lib/docs/filters/threejs/clean_html.rb b/lib/docs/filters/threejs/clean_html.rb index b66bc729..ac1cb036 100644 --- a/lib/docs/filters/threejs/clean_html.rb +++ b/lib/docs/filters/threejs/clean_html.rb @@ -4,6 +4,14 @@ module Docs def call # Remove unnecessary elements css('head, script, style').remove + # Wrap code blocks with pre tags and add syntax highlighting + css('code').each do |node| + unless node.parent.name == 'pre' + pre = node.wrap('
') + pre['data-language'] = 'javascript' + pre['class'] = 'language-javascript' + end + end # Handle source links css('h2').each do |node| @@ -202,29 +210,6 @@ module Docs end end - # Clean up code blocks - css('pre').each do |node| - wrapper = doc.document.create_element('div') - wrapper['class'] = 'highlight' - node.replace(wrapper) - - div = doc.document.create_element('div') - div['class'] = 'highlight-javascript notranslate' - wrapper.add_child(div) - - pre = doc.document.create_element('pre') - pre['class'] = '' - div.add_child(pre) - - # Format the code content - code = node.content.strip - - # Add syntax highlighting spans - highlighted_code = highlight_javascript(code) - - pre.inner_html = highlighted_code - end - # Add proper heading IDs and classes css('h1, h2, h3, h4').each do |node| node['id'] ||= node.content.strip.downcase.gsub(/[^\w]+/, '-') @@ -232,9 +217,6 @@ module Docs node['class'] = "#{existing_class} section-header" end - # Remove interactive examples - css('.threejs_example_container').remove - # Add note styling css('p').each do |node| if node.content.start_with?('Note:') @@ -254,35 +236,8 @@ module Docs node.replace(wrapper) end end - - # Remove the navigation arrows and links - css('.nav').remove if at_css('.nav') - # If the arrows are in a different container, adjust the selector accordingly - doc end - - private - - def highlight_javascript(code) - 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/, '\1') # keywords - code = code.gsub(/\b(\d+(\.\d+)?)\b/, '\1') # numbers - code = code.gsub(/'([^']*)'/, '\'\1\'') # single quotes - code = code.gsub(/"([^"]*)"/, '"\1"') # double quotes - code = code.gsub(/`([^`]*)`/, '`\1`') # template literals - code = code.gsub(/\/\/[^\n]*/, '\0') # single line comments - code = code.gsub(/\b(console|document|window|Array|Object|String|Number|Boolean|Function|Symbol|Map|Set|Promise|async|await)\b/, '\1') # built-ins - code = code.gsub(/([a-zA-Z_$][a-zA-Z0-9_$]*)\s*\(/, '\1(') # function calls - code = code.gsub(/\b(addEventListener|querySelector|getElementById|setTimeout|setInterval)\b/, '\1') # common methods - - # Add line numbers - lines = code.split("\n") - numbered_lines = lines.map.with_index(1) do |line, i| - "#{i}#{line}" - end - - numbered_lines.join("\n") - end end end end \ No newline at end of file