| #!/usr/bin/env python |
| # |
| # Copyright 2019 - The Android Open Source Project |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| ############################################################################### |
| # This script adds a HTML snippet to the generated reference docs located at |
| # developer.android.com/reference. The snippet renders HTML that adds links to |
| # toggle between the Java and Kotlin versions of the page. |
| ############################################################################### |
| |
| import getopt |
| import os |
| import sys |
| |
| |
| # GLOBAL FLAGS |
| |
| global stubs |
| global java_stubs, kotlin_stubs |
| global work, verbose, show_solo, max_stubs |
| global java_source_abs_path |
| global kotlin_source_abs_path |
| |
| verbose = False # set True to list all files as they are stubbed (--verbose) |
| work = False # set True to insert stubs, False to do a dry run for stats (--work) |
| show_solo = False # set True to list files that only appear in one language, rather than both (--solo) |
| max_stubs = 0 # set positive to create a limited number of stubs (--max 12) |
| |
| |
| # You must run the script from the refodcs reference/ root directory |
| |
| java_ref_root = os.getcwd() |
| kotlin_ref_root = os.path.join(java_ref_root, "kotlin") |
| root = os.path.split(java_ref_root)[1] |
| if root != "reference": |
| print("You must cd to the refocs reference/ root directory") |
| sys.exit() |
| |
| |
| # This method uses switcher2, which assumes the refdocs stay in their current |
| # asymmetrical dirs (ref/android and ref/kotlin/android) |
| # And just puts the switcher in the existing docs |
| def insert_stub(doc, java, both): |
| global stubs |
| global java_stubs, kotlin_stubs |
| global verbose, work, show_solo |
| global java_source_abs_path |
| global kotlin_source_abs_path |
| |
| stubs = stubs+1 |
| |
| if verbose: |
| # Print everything. |
| print("File: ", stubs, doc) |
| else: |
| # Print just the file name on the current line. |
| fn = os.path.split(doc) |
| print("File: ", stubs, fn[1], end="\r") |
| |
| if (java): |
| java_stubs = java_stubs + 1 |
| else: |
| kotlin_stubs = kotlin_stubs + 1 |
| |
| |
| if (work): |
| if (java): |
| file_path = doc[len(java_ref_root)+1:] |
| stub = doc.replace(java_source_abs_path, kotlin_source_abs_path) |
| # Always add the switcher for java files, switch to the package summary if |
| # the page itself doesn't exist in kotlin |
| slug1 = "sed -i 's/ <div id=\"refdoc-switcher-placeholder\"><\/div>/{}/' {}".format("\\n{% setvar page_path %}_page_path_{% endsetvar %}\\n{% setvar can_switch %}1{% endsetvar %}\\n{% include \"reference\/_java_switcher2.md\" %}",doc) |
| else: |
| file_path = doc[len(kotlin_ref_root)+1:] |
| stub = doc.replace(kotlin_source_abs_path, java_source_abs_path) |
| if (both): |
| slug1 = "sed -i 's/ <div id=\"refdoc-switcher-placeholder\"><\/div>/{}/' {}".format("\\n{% setvar page_path %}_page_path_{% endsetvar %}\\n{% setvar can_switch %}1{% endsetvar %}\\n{% include \"reference\/_kotlin_switcher2.md\" %}",doc) |
| else: |
| slug1 = "sed -i 's/ <div id=\"refdoc-switcher-placeholder\"><\/div>/{}/' {}".format("\\n{% include \"reference\/_kotlin_switcher2.md\" %}",doc) |
| |
| os.system(slug1) |
| if both or java: |
| if both: |
| page_path = file_path |
| else: |
| page_path = os.path.join(os.path.dirname(file_path), "package-summary.html") |
| |
| page_path_slug = "sed -i 's/_page_path_/{}/' {}".format(page_path.replace("/","\/"),doc) |
| os.system(page_path_slug) |
| |
| |
| def scan_files(stem): |
| global work, verbose, show_solo, max_stubs |
| global stubs |
| global java_stubs, kotlin_stubs |
| global java_source_abs_path |
| global kotlin_source_abs_path |
| |
| java_source_abs_path = os.path.join(java_ref_root, stem) |
| kotlin_source_abs_path = os.path.join(kotlin_ref_root, stem) |
| |
| # Pass 1 |
| # Loop over java content, create stubs for java, |
| # and for corresponding Kotlin (when it exsits) |
| |
| # solo is java-only classes |
| # both is java+kotlin |
| stubs = 0 |
| java_stubs = 0 |
| kotlin_stubs = 0 |
| solo = 0 |
| both = 0 |
| |
| print("*** PASS1 (Java) ***") |
| maxed_out = False |
| for root, dirs, files in os.walk(java_source_abs_path): |
| if maxed_out: |
| break; |
| for file_ in files: |
| ext = os.path.splitext(file_) |
| ext = ext[1] |
| if not ext: |
| # this catches package-lists with no extension |
| print("***", os.path.join(root, file_)) |
| elif ext != ".html": |
| # filter out png, yaml, etc |
| continue |
| else: |
| # we have java content |
| doc = os.path.join(root, file_) |
| |
| |
| |
| # look for matching kotlin file |
| kotlinsource = doc.replace(java_source_abs_path, kotlin_source_abs_path) |
| if os.path.isfile(kotlinsource): |
| # corresponding kotlin content exists |
| insert_stub(doc, True, True) |
| insert_stub(kotlinsource, False, True) |
| both = both+1 |
| else: |
| # no kotlin content |
| if (show_solo): |
| print("solo: ", doc) |
| insert_stub(doc, True, False) |
| solo = solo+1 |
| |
| if max_stubs>0 and stubs>=max_stubs: |
| print |
| print("max java stubs: ", max_stubs) |
| maxed_out = True; |
| break |
| print("") |
| print("Java+Kotlin:", both, "Only Java:", solo) |
| print("") |
| |
| |
| # PASS 2 |
| # Loop over kotlin content, create stubs for Kotlin-only APIs |
| print("*** PASS2 (Kotlin) ***") |
| solo = 0 |
| both = 0 |
| maxed_out = False |
| stubs = 0 |
| for root, dirs, files in os.walk(kotlin_source_abs_path): |
| if maxed_out: |
| break; |
| for file_ in files: |
| ext = os.path.splitext (file_) |
| ext = ext[1] |
| if not ext: |
| # this catches package-lists with no extension |
| print("***", os.path.join(root, file_)) |
| elif ext != ".html": |
| # filter out png, yaml, etc |
| continue |
| else: |
| # we have kotlin content |
| doc = os.path.join(root, file_) |
| javadoc = doc.replace(kotlin_source_abs_path, java_source_abs_path) |
| file_name = os.path.splitext(file_)[0] |
| file_path = doc[len(kotlin_source_abs_path)+1:] |
| include_path = os.path.join("/reference/_kotlin", file_path) |
| |
| if os.path.isfile(javadoc): |
| # corresponding java content exists |
| # so we already created the kotlin stub file |
| # nothing to do |
| both = both+1 |
| else: |
| # no java content |
| # create the kotlin stub file |
| if (show_solo): |
| print("solo: ", doc) |
| insert_stub(doc , False, False) |
| solo = solo+1 |
| |
| if (max_stubs>0 and stubs>=max_stubs): |
| print |
| print("max koltin stubs: ", max_stubs) |
| maxed_out = True; |
| break |
| |
| print("") |
| print("Java+Kotlin:", both, "Only Kotlin:", solo) |
| print("Java: ", java_stubs, " Kotlin: ", kotlin_stubs, "Total: ", java_stubs + kotlin_stubs) |
| |
| def main(argv): |
| |
| global work, verbose, show_solo, max_stubs |
| global java_source_abs_path |
| global kotlin_source_abs_path |
| stem = "" |
| |
| try: |
| opts, args = getopt.getopt(argv,"",["work","verbose","solo","max="]) |
| except getopt.GetoptError: |
| print('USAGE: switcher --work --verbose --solo --max=<max_stubs> platform|androidx|support|chrome') |
| sys.exit(2) |
| |
| for opt, arg in opts: |
| if opt == '--work': |
| work = True |
| elif opt == "--verbose": |
| print("verbose") |
| verbose = True |
| elif opt == "--solo": |
| print("verbose") |
| show_solo = True |
| elif opt == "--max": |
| max_stubs = int(arg) |
| print("max ", max_stubs) |
| |
| if len(args)>0: |
| source = args[0] |
| if source == "platform": |
| stem = "android" |
| print |
| print("*** PLATFORM PAGES ***") |
| print("======================") |
| |
| elif source == "androidx": |
| stem = "androidx" |
| print |
| print("*** ANDROIDX SUPPORT LIBRARY PAGES ***") |
| print("======================================") |
| |
| elif source == "support": |
| stem = "android/support/v4/media" |
| print |
| print("*** ANDROIDX SUPPORT LIBRARY PAGES ***") |
| print("======================================") |
| |
| elif source == "chrome": |
| stem = "org/chromium/support_lib_boundary" |
| print |
| print("*** ANDROIDX CHROMIUM PAGES ***") |
| print("===============================") |
| |
| if (len(stem)>0): |
| scan_files(stem) |
| print("") |
| print(" *** DONE ***") |
| else: |
| print('You must specify one of: platform|androidx|support|chrome') |
| |
| |
| |
| if __name__ == "__main__": |
| main(sys.argv[1:]) |
| |