1# Copyright 2018-2023 The Khronos Group Inc. 2# 3# SPDX-License-Identifier: Apache-2.0 4 5require 'nokogiri' 6 7 8renames = {} 9 10extension_name = ARGV[0] 11extension_suffix = /VK_([^_]+)_.+/.match(extension_name)[1] 12 13allowed_dependency_renames = [''] 14 15file = File.open("vk.xml") 16Nokogiri::XML(file).xpath('//extension[@name="' + extension_name + '"]').each do | extension | 17 extension_enum_offset = 1000000000 + ((extension.attribute('number').content.to_i - 1) * 1000) 18 extension.xpath('require').each do |require| 19 20 do_rename = false 21 22 if require.attribute('extension') 23 allowed_dependency_renames.each do |dependency| 24 if require.attribute('extension').content == dependency 25 do_rename = true 26 end 27 end 28 else 29 do_rename = true 30 end 31 32 if do_rename == false 33 puts "Extension interaction with " + require.attribute('extension').content + " needs addressing!" 34 else 35 core_block = "\t"*2 + require.to_s.lines[0].strip + "\n" 36 alias_block = "\t"*3 + require.to_s.lines[0].strip + "\n" 37 38 require.children.each do |element| 39 if element.node_name != 'text' && element.node_name != 'comment' 40 41 # Core Block 42 if /.+_EXTENSION_NAME/.match(element.attribute('name').content) == nil && 43 /.+_SPEC_VERSION/.match(element.attribute('name').content) == nil 44 45 case element.node_name 46 when 'enum' 47 attributes = element.attributes 48 if element.attributes['offset'] 49 attributes['value'] = element.attribute('offset').content.to_i + extension_enum_offset 50 attributes.delete('offset') 51 end 52 53 core_block << "\t"*3 + '<enum' 54 attributes.each_pair do |key, value| 55 core_block << ' ' + key + '="' + value.to_s + '"' 56 end 57 core_block << '/>' + "\n" 58 when 'type', 'command' 59 core_block << "\t"*3 + element.to_s.strip + "\n" 60 else 61 core_block << "Warning: Unknown type found!\n" << element.node_name 62 end 63 end 64 65 # Alias Block + Renames 66 67 if /.+_EXTENSION_NAME/.match(element.attribute('name').content) || 68 /.+_SPEC_VERSION/.match(element.attribute('name').content) 69 alias_block << "\t"*4 + element.to_s.strip + "\n" 70 else 71 old_name = element.attribute('name').content 72 new_name = old_name.sub('_' + extension_suffix,'').sub(extension_suffix,'') 73 alias_block << "\t"*4 + '<alias name="' + old_name + '" value="' + new_name + '"/>' + "\n" 74 renames[old_name] = new_name 75 core_block.gsub!(old_name,new_name) 76 end 77 end 78 end 79 alias_block << "\t"*3 + require.to_s.lines[-1].strip 80 core_block << "\t"*2 + require.to_s.lines[-1].strip 81 82 puts alias_block 83 puts 84 puts core_block 85 puts 86 renames.each_pair do |old, new| 87 puts old + ' -> ' + new 88 end 89 end 90 end 91end 92 93outdata = File.read('vk.xml') 94 95renames.each_pair do |old, new| 96 outdata.gsub!(old,new) 97end 98 99File.open('vk.xml', 'w') do |out| 100 out << outdata 101end 102 103def rename_text_files(dir, renames, extension_name) 104 Dir[dir + '/*.adoc'].each do |name| 105 # Skip renaming in the extension appendix, since this should preserve the old names. 106 if (name != ('../appendices/' + extension_name + '.adoc')) 107 old_file = File.read(name) 108 109 new_file = old_file.clone 110 renames.each_pair do |old, new| 111 new_file.gsub!(old,new) 112 end 113 114 if (old_file != new_file) 115 File.write(name, new_file) 116 end 117 end 118 end 119 Dir[dir + '/*/'].each do |subdir| 120 rename_text_files(subdir, renames, extension_name) 121 end 122end 123 124rename_text_files('../chapters', renames, extension_name) 125rename_text_files('../appendices', renames, extension_name) 126