Example #1
0
def create_pdf(lang_code, checking_level, version):
    global download_dir, unfoldingWord_dir

    # Create PDF via ConTeXt
    try:
        print_ok('BEGINNING: ', 'PDF generation.')
        out_dir = os.path.join(download_dir, 'make_pdf')
        make_dir(out_dir)

        # generate a tex file
        print('Generating tex file...', end=' ')
        tex_file = os.path.join(out_dir, '{0}.tex'.format(lang_code))

        # make sure it doesn't already exist
        if os.path.isfile(tex_file):
            os.remove(tex_file)

        with OBSTexExport(lang_code, tex_file, 0, '360px',
                          checking_level) as tex:
            tex.run()
        print('finished.')

        # run context
        print_notice('Running context - this may take several minutes.')

        # noinspection PyTypeChecker
        trackers = ','.join([
            'afm.loading', 'fonts.missing', 'fonts.warnings', 'fonts.names',
            'fonts.specifications', 'fonts.scaling', 'system.dump'
        ])

        cmd = 'context --paranoid --batchmode --trackers={0} "{1}"'.format(
            trackers, tex_file)

        try:
            subprocess.check_call(cmd,
                                  shell=True,
                                  stderr=subprocess.STDOUT,
                                  cwd=out_dir)

        except subprocess.CalledProcessError as e:
            if e.message:
                raise e
        print('Finished running context.')

        print('Copying PDF to API...', end=' ')
        version = version.replace('.', '_')
        if version[0:1] != 'v':
            version = 'v' + version

        pdf_file = os.path.join(unfoldingWord_dir, lang_code,
                                'obs-{0}-{1}.pdf'.format(lang_code, version))
        shutil.copyfile(os.path.join(out_dir, '{0}.pdf'.format(lang_code)),
                        pdf_file)
        print('finished.')

    finally:
        print_ok('FINISHED:', 'generating PDF.')
def create_pdf(lang_code, checking_level, version):
    global download_dir, unfoldingWord_dir

    # Create PDF via ConTeXt
    try:
        print_ok('BEGINNING: ', 'PDF generation.')
        out_dir = os.path.join(download_dir, 'make_pdf')
        make_dir(out_dir)

        # generate a tex file
        print('Generating tex file...', end=' ')
        tex_file = os.path.join(out_dir, '{0}.tex'.format(lang_code))

        # make sure it doesn't already exist
        if os.path.isfile(tex_file):
            os.remove(tex_file)

        with OBSTexExport(lang_code, tex_file, 0, '360px', checking_level) as tex:
            tex.run()
        print('finished.')

        # run context
        print_notice('Running context - this may take several minutes.')

        # noinspection PyTypeChecker
        trackers = ','.join(['afm.loading', 'fonts.missing', 'fonts.warnings', 'fonts.names',
                             'fonts.specifications', 'fonts.scaling', 'system.dump'])

        cmd = 'context --paranoid --batchmode --trackers={0} "{1}"'.format(trackers, tex_file)

        try:
            subprocess.check_call(cmd, shell=True, stderr=subprocess.STDOUT, cwd=out_dir)

        except subprocess.CalledProcessError as e:
            if e.message:
                raise e
        print('Finished running context.')

        print('Copying PDF to API...', end=' ')
        version = version.replace('.', '_')
        if version[0:1] != 'v':
            version = 'v' + version

        pdf_file = os.path.join(unfoldingWord_dir, lang_code, 'obs-{0}-{1}.pdf'.format(lang_code, version))
        shutil.copyfile(os.path.join(out_dir, '{0}.pdf'.format(lang_code)), pdf_file)
        print('finished.')

    finally:
        print_ok('FINISHED:', 'generating PDF.')
Example #3
0
if __name__ == '__main__':

    parser = argparse.ArgumentParser(
        description=__doc__,
        formatter_class=argparse.RawDescriptionHelpFormatter)
    parser.add_argument('-r',
                        '--gitrepo',
                        dest='gitrepo',
                        default=False,
                        required=True,
                        help='Git repository where the source can be found.')
    parser.add_argument('-o',
                        '--outdir',
                        dest='outdir',
                        default=False,
                        required=True,
                        help='The output directory for markdown files.')
    parser.add_argument('-q',
                        '--quiet',
                        dest='quiet',
                        action='store_true',
                        help='Minimize console output.')

    args = parser.parse_args(sys.argv[1:])

    # call with closing to be sure the temp files get cleaned up
    with closing(TransformOBS(args.gitrepo, args.outdir, args.quiet)) as tx:
        tx.run()

    print_ok('ALL FINISHED: ', 'Please check the output directory.')
Example #4
0
        'version': str(version)
    }
    for chp in tw_book_dict:
        tw_book_dict[chp].sort(key=lambda x: x['id'])
        entry = {'id': chp, 'frames': tw_book_dict[chp]}
        tw_cat['chapters'].append(entry)
    tw_cat['chapters'].sort(key=lambda x: x['id'])
    write_json(filepath, tw_cat)


if __name__ == '__main__':
    print()
    parser = argparse.ArgumentParser(
        description=__doc__,
        formatter_class=argparse.RawDescriptionHelpFormatter)
    parser.add_argument('-v',
                        '--version',
                        dest='version',
                        default=False,
                        required=True,
                        help='The version number.')

    args = parser.parse_args(sys.argv[1:])

    today = ''.join(str(datetime.date.today()).rsplit('-')[0:3])

    print_ok('STARTING: ', 'publishing tN from Dokuwiki.')
    run_tn(args.version, 'en', today)
    print_ok('ALL FINISHED: ', 'publishing tN from Dokuwiki.')
    print_notice('Don\'t forget to notify the interested parties.')

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description=__doc__,
                                     formatter_class=argparse.RawDescriptionHelpFormatter)
    parser.add_argument('-r', '--gitrepo', dest='gitrepo', default=False,
                        required=True, help='Git repository where the source can be found.')

    parser.add_argument('-t', '--tag', dest='tag', default='master',
                        required=False, help='Branch or tag to use as the source. Default is master.')

    parser.add_argument('-d', '--domain', dest='domain', choices=['udb', 'ulb', 'pdb'],
                        required=True, help='ulb, udb or pdb')

    args = parser.parse_args(sys.argv[1:])

    # prompt user to update meta.json
    print_notice('Check meta.json in the git repository and update the information if needed.')
    prompt('Press Enter to continue when ready...')

    try:
        print_ok('STARTING: ', 'importing USFM repository.')
        main(args.gitrepo, args.tag, args.domain)
        print_ok('ALL FINISHED: ', 'importing USFM repository.')
        print_notice('Don\'t forget to notify the interested parties.')

    finally:
        # delete temp files
        if os.path.isdir(download_dir):
            shutil.rmtree(download_dir, ignore_errors=True)
def import_obs(lang_data, git_repo, door43_url, no_pdf):
    global download_dir, root, api_dir

    lang_code = lang_data['lc']

    # pre-flight checklist
    link_source = '/var/www/vhosts/api.unfoldingword.org/httpdocs/obs/jpg/1/en'
    if not os.path.isdir(link_source):
        print_error('Image source directory not found: {0}.'.format(link_source))
        sys.exit(1)

    if git_repo[-1:] != '/':
        git_repo += '/'

    if no_pdf:
        tools_dir = None
    else:
        tools_dir = '/var/www/vhosts/door43.org/tools'
        if not os.path.isdir(tools_dir):
            tools_dir = os.path.expanduser('~/Projects/tools')

        # prompt if tools not found
        if not os.path.isdir(tools_dir):
            tools_dir = None
            print_notice('The tools directory was not found. The PDF cannot be generated.')
            resp = prompt('Do you want to continue without generating a PDF? [Y|n]: ')
            if resp != '' and resp != 'Y' and resp != 'y':
                sys.exit(0)

    if git_repo:
        if git_repo[-1:] == '/':
            git_repo = git_repo[:-1]

        download_dir = '/tmp/{0}'.format(git_repo.rpartition('/')[2])
        make_dir(download_dir)

        # make sure OBS is initialized on Dokuwiki
        test_dir = root.format(lang_code, '')
        if not os.path.isdir(test_dir):
            print_warning('It seems OBS has not been initialized on Door43.org for {0}'.format(lang_code))
            sys.exit(1)

    elif door43_url:
        print_error('URL not yet implemented.')
        return
    else:
        print_error('Source not provided.')
        return

    # get the source files from the git repository
    if 'github' in git_repo:
        # https://github.com/unfoldingWord/obs-ru
        # https://raw.githubusercontent.com/unfoldingWord/obs-ru/master/obs-ru.json
        raw_url = git_repo.replace('github.com', 'raw.githubusercontent.com')
    elif 'git.door43.org' in git_repo:
        raw_url = join_url_parts(git_repo, 'raw')
    else:
        # this is to keep IntelliJ happy, is should have been caught in sub main
        return

    # download needed files from the repository
    file_suffix = '-{0}.json'.format(lang_code.lower())
    files_to_download = [
        join_url_parts(raw_url, 'master/obs' + file_suffix),
        join_url_parts(raw_url, 'master/status' + file_suffix)
    ]

    for file_to_download in files_to_download:

        downloaded_file = os.path.join(download_dir, file_to_download.rpartition('/')[2])

        try:
            print('Downloading {0}...'.format(file_to_download), end=' ')
            download_file(file_to_download, downloaded_file)
        finally:
            print('finished.')

    # read the files from the git repository
    file_suffix = '-{0}.json'.format(lang_code.lower())
    obs_obj = None
    status_obj = None
    # front_matter_found = False
    # back_matter_found = False

    try:
        print('Examining the files...', end=' ')
        for root_path, dirs, files in os.walk(download_dir):

            if not len(files):
                continue

            for git_file in files:
                if git_file == 'obs' + file_suffix:
                    obs_obj = OBS(os.path.join(root_path, git_file))
                elif git_file == 'status' + file_suffix:
                    status_obj = OBSStatus(os.path.join(root_path, git_file))
                    # elif 'front-matter' in git_file:
                    #     front_matter_found = True
                    # elif 'back-matter' in git_file:
                    #     back_matter_found = True
    finally:
        print('finished.')

    # check data integrity
    if not obs_obj.verify_all():
        sys.exit(1)

    if not status_obj:
        print_error('The file "status{0}" was not found in the git repository.'.format(file_suffix))
        sys.exit(1)

    # create Dokuwiki pages
    print_ok('Begin: ', 'creating Dokuwiki pages.')
    for chapter in obs_obj.chapters:

        chapter_title = '====== {0} ======'.format(chapter['title'])
        chapter_ref = '//{0}//'.format(chapter['ref'])
        chapter_body = ''
        chapter_num = chapter['number'].zfill(2)

        for frame in chapter['frames']:
            chapter_body += '{{{{{0}?direct&}}}}\n\n{1}\n\n'.format(frame['img'], frame['text'])

        file_name = root.format(lang_code, chapter_num + '.txt')
        print('  Writing {0}'.format(file_name))
        with codecs.open(file_name, 'w', 'utf-8-sig') as out_file:
            out_file.write('{0}\n\n{1}{2}\n'.format(chapter_title, chapter_body, chapter_ref))

    print_ok('Finished: ', 'creating Dokuwiki pages.')

    # Create image symlinks on api.unfoldingword.org
    try:
        print('Creating symlink to images directory...', end=' ')
        link_name = '/var/www/vhosts/api.unfoldingword.org/httpdocs/obs/jpg/1/{0}'.format(lang_code.lower())
        if not os.path.isfile(link_name) and not os.path.isdir(link_name) and not os.path.islink(link_name):
            os.symlink(link_source, link_name)
    finally:
        print('finished.')

    # Create PDF via ConTeXt
    if not no_pdf and tools_dir and os.path.isdir(tools_dir):
        try:
            print_ok('Beginning: ', 'PDF generation.')
            script_file = os.path.join(tools_dir, 'obs/book/pdf_export.sh')
            out_dir = api_dir.format(lang_code)
            make_dir(out_dir)
            process = subprocess.Popen([script_file,
                                        '-l', lang_code,
                                        '-c', status_obj.checking_level,
                                        '-v', status_obj.version,
                                        '-o', out_dir],
                                       shell=True,
                                       stdout=subprocess.PIPE,
                                       stderr=subprocess.PIPE)

            # wait for the process to terminate
            out, err = process.communicate()
            exit_code = process.returncode
            out = out.strip().decode('utf-8')
            err = err.strip().decode('utf-8')

            # the error message may be in stdout
            if exit_code != 0:
                if not err:
                    err = out
                    out = None

            if err:
                print_error(err, 2)

            if out:
                print('  ' + out)

            print('  PDF subprocess finished with exit code {0}'.format(exit_code))

        finally:
            print_ok('Finished:', 'generating PDF.')
            'These USFM errors must be corrected before publishing can continue.'
        )
        sys.exit(1)


if __name__ == '__main__':
    parser = argparse.ArgumentParser(
        description=__doc__,
        formatter_class=argparse.RawDescriptionHelpFormatter)
    parser.add_argument('-d',
                        '--directory',
                        dest='directory',
                        default=False,
                        required=True,
                        help='The directory to check.')
    parser.add_argument(
        '-v',
        '--versification',
        dest='versification',
        default='ufw',
        required=False,
        help=
        'Versification system - current options are "ufw" (unfoldingWord) and "rsc" (Russian)'
    )

    args = parser.parse_args(sys.argv[1:])

    print_ok('STARTING: ', 'validating USFM files.')
    main(args.directory, args.versification)
    print_ok('ALL FINISHED: ', 'validating USFM files.')
def main(git_repo, tag, no_pdf):
    global download_dir

    # clean up the git repo url
    if git_repo[-4:] == '.git':
        git_repo = git_repo[:-4]

    if git_repo[-1:] == '/':
        git_repo = git_repo[:-1]

    # initialize some variables
    today = ''.join(str(datetime.date.today()).rsplit('-')[0:3])  # str(datetime.date.today())
    download_dir = '/tmp/{0}'.format(git_repo.rpartition('/')[2])
    make_dir(download_dir)
    downloaded_file = '{0}/{1}.zip'.format(download_dir, git_repo.rpartition('/')[2])
    file_to_download = join_url_parts(git_repo, 'archive/' + tag + '.zip')
    manifest = None
    status = None  # type: OBSStatus
    content_dir = None

    # download the repository
    try:
        print('Downloading {0}...'.format(file_to_download), end=' ')
        if not os.path.isfile(downloaded_file):
            download_file(file_to_download, downloaded_file)
    finally:
        print('finished.')

    try:
        print('Unzipping...'.format(downloaded_file), end=' ')
        unzip(downloaded_file, download_dir)
    finally:
        print('finished.')

    # examine the repository
    for root, dirs, files in os.walk(download_dir):

        if 'manifest.json' in files:
            # read the manifest
            try:
                print('Reading the manifest...', end=' ')
                content_dir = root
                manifest = load_json_object(os.path.join(root, 'manifest.json'))
            finally:
                print('finished.')

        if 'status.json' in files:
            # read the meta data
            try:
                print('Reading the status...', end=' ')
                content_dir = root
                status = OBSStatus(os.path.join(root, 'status.json'))
            finally:
                print('finished.')

        # if we have everything, exit the loop
        if content_dir and manifest and status:
            break

    # check for valid repository structure
    if not manifest:
        print_error('Did not find manifest.json in {}'.format(git_repo))
        sys.exit(1)

    if not status:
        print_error('Did not find status.json in {}'.format(git_repo))
        sys.exit(1)

    print('Initializing OBS object...', end=' ')
    lang = manifest['target_language']['id']
    obs_obj = OBS()
    obs_obj.date_modified = today
    obs_obj.direction = manifest['target_language']['direction']
    obs_obj.language = lang
    print('finished')

    obs_obj.chapters = load_obs_chapters(content_dir)
    obs_obj.chapters.sort(key=lambda c: c['number'])

    if not obs_obj.verify_all():
        print_error('Quality check did not pass.')
        sys.exit(1)

    print('Loading languages...', end=' ')
    lang_dict = OBS.load_lang_strings()
    print('finished.')

    print('Loading the catalog...', end=' ')
    export_dir = '/var/www/vhosts/door43.org/httpdocs/exports'
    # uw_cat_path = os.path.join(unfoldingWord_dir, 'obs-catalog.json')
    # uw_catalog = load_json_object(uw_cat_path, [])
    # uw_cat_langs = [x['language'] for x in uw_catalog]
    cat_path = os.path.join(export_dir, 'obs-catalog.json')
    catalog = load_json_object(cat_path, [])
    print('finished')

    print('Getting already published languages...', end=' ')
    json_lang_file_path = os.path.join(export_dir, lang, 'obs', 'obs-{0}.json'.format(lang))
    # prev_json_lang = load_json_object(json_lang_file_path, {})

    if lang not in lang_dict:
        print("Configuration for language {0} missing.".format(lang))
        sys.exit(1)
    print('finished.')

    updated = update_language_catalog(lang, obs_obj.direction, status, today, lang_dict, catalog)

    print('Writing the OBS file to the exports directory...', end=' ')
    cur_json = json.dumps(obs_obj, sort_keys=True, cls=OBSEncoder)

    if updated:
        ([x for x in catalog if x['language'] == lang][0]['date_modified']) = today
        write_file(json_lang_file_path.replace('.txt', '.json'), cur_json)
    print('finished.')

    export_to_api(lang, status, today, cur_json)

    cat_json = json.dumps(catalog, sort_keys=True, cls=OBSEncoder)
    write_file(cat_path, cat_json)

    # update the catalog
    print_ok('STARTING: ', 'updating the catalogs.')
    update_catalog()
    print_ok('FINISHED: ', 'updating the catalogs.')

    if no_pdf:
        return

    create_pdf(lang, status.checking_level, status.version)
        chunk_url = '{0}/{1}/chunks.json'.format(base_url, book[0])
        chunk_defs = json.loads(get_url(chunk_url))

        for chunk in chunk_defs:

            # is this is a different chapter?
            if chap_num != chunk['chp']:
                chap_num = chunk['chp']
                if current:
                    file_contents.append(current)
                current = {'chapter': int(chunk['chp']), 'first_verses': []}

            current['first_verses'].append(int(chunk['firstvs']))

        if current:
            file_contents.append(current)

        # format the output
        file_contents_str = json.dumps(file_contents, sort_keys=True, indent=2)
        file_contents_str = regex1.sub(r'\1\2', file_contents_str)
        file_contents_str = regex2.sub(r'\1 \2', file_contents_str)
        file_contents_str = regex3.sub(r'\1\2', file_contents_str)
        file_contents_str = regex4.sub(r'\1', file_contents_str)

        write_file(os.path.join(output_dir, '{0}.json'.format(book[0])), file_contents_str)


if __name__ == '__main__':
    import_now()
    print_ok('FINISHED: ', 'Done importing chunk definitions.')
                                     formatter_class=argparse.RawDescriptionHelpFormatter)
    parser.add_argument('-l', '--lang', dest="lang", default=False,
                        required=True, help="Language code of resource.")
    parser.add_argument('-e', '--export', dest="uwexport", default=False,
                        action='store_true', help="Export to unfoldingWord.")
    parser.add_argument('-t', '--testexport', dest="testexport", default=False,
                        action='store_true', help="Test export to unfoldingWord.")
    parser.add_argument('-p', '--nopdf', dest='nopdf', action='store_true', help='Do not produce a PDF.')

    args = parser.parse_args(sys.argv[1:])
    lang = args.lang
    uw_export = args.uwexport
    test_export = args.testexport
    no_pdf = args.nopdf

    print_ok('STARTING: ', 'importing OBS from Dokuwiki')

    # pre-flight checklist
    link_source = '/var/www/vhosts/api.unfoldingword.org/httpdocs/obs/jpg/1/en'
    if not os.path.isdir(link_source):
        print_error('Image source directory not found: {0}.'.format(link_source))
        sys.exit(1)

    if no_pdf:
        tools_dir = None
    else:
        tools_dir = '/var/www/vhosts/door43.org/tools'
        if not os.path.isdir(tools_dir):
            tools_dir = os.path.expanduser('~/Projects/tools')

        # prompt if tools not found
        chunk_defs = json.loads(get_url(chunk_url))

        for chunk in chunk_defs:

            # is this is a different chapter?
            if chap_num != chunk['chp']:
                chap_num = chunk['chp']
                if current:
                    file_contents.append(current)
                current = {'chapter': int(chunk['chp']), 'first_verses': []}

            current['first_verses'].append(int(chunk['firstvs']))

        if current:
            file_contents.append(current)

        # format the output
        file_contents_str = json.dumps(file_contents, sort_keys=True, indent=2)
        file_contents_str = regex1.sub(r'\1\2', file_contents_str)
        file_contents_str = regex2.sub(r'\1 \2', file_contents_str)
        file_contents_str = regex3.sub(r'\1\2', file_contents_str)
        file_contents_str = regex4.sub(r'\1', file_contents_str)

        write_file(os.path.join(output_dir, '{0}.json'.format(book[0])),
                   file_contents_str)


if __name__ == '__main__':
    import_now()
    print_ok('FINISHED: ', 'Done importing chunk definitions.')
    if errors_found:
        print_error(
            'These USFM errors must be corrected before publishing can continue.'
        )
        sys.exit(1)

    # rebuild source for tS
    print()
    print('Publishing to the API...')
    with api_publish(api_directory) as api:
        api.run()
    print('Finished publishing to the API.')

    # update the catalog
    print()
    print('Updating the catalogs...', end=' ')
    update_catalog()
    print('finished.')


if __name__ == '__main__':

    print_ok('STARTING: ', 're-chunking all Bibles.')

    source_directories = get_source_directories()

    for source_directory in source_directories:
        rechunk_this_one(source_directory)

    print_ok('ALL FINISHED: ', 're-chunking all Bibles.')
                        default=False,
                        action='store_true',
                        help="Test export to unfoldingWord.")
    parser.add_argument('-p',
                        '--nopdf',
                        dest='nopdf',
                        action='store_true',
                        help='Do not produce a PDF.')

    args = parser.parse_args(sys.argv[1:])
    lang = args.lang
    uw_export = args.uwexport
    test_export = args.testexport
    no_pdf = args.nopdf

    print_ok('STARTING: ', 'importing OBS from Dokuwiki')

    # pre-flight checklist
    link_source = '/var/www/vhosts/api.unfoldingword.org/httpdocs/obs/jpg/1/en'
    if not os.path.isdir(link_source):
        print_error(
            'Image source directory not found: {0}.'.format(link_source))
        sys.exit(1)

    if no_pdf:
        tools_dir = None
    else:
        tools_dir = '/var/www/vhosts/door43.org/tools'
        if not os.path.isdir(tools_dir):
            tools_dir = os.path.expanduser('~/Projects/tools')
#!/usr/bin/env python2
# -*- coding: utf8 -*-
#
#  Copyright (c) 2016 unfoldingWord
#  http://creativecommons.org/licenses/MIT/
#  See LICENSE file for details.
#
#  Contributors:
#  Phil Hopper <*****@*****.**>
#

from __future__ import print_function, unicode_literals
from general_tools.print_utils import print_ok
from uw.update_catalog import update_catalog

if __name__ == '__main__':
    print()
    print_ok('STARTING: ', 'updating the catalogs.')
    update_catalog()
    print_ok('FINISHED: ', 'updating the catalogs.')
        print('finished.')

    if errors_found:
        print_error('These USFM errors must be corrected before publishing can continue.')
        sys.exit(1)

    # rebuild source for tS
    print()
    print('Publishing to the API...')
    with api_publish(api_directory) as api:
        api.run()
    print('Finished publishing to the API.')

    # update the catalog
    print()
    print('Updating the catalogs...', end=' ')
    update_catalog()
    print('finished.')


if __name__ == '__main__':

    print_ok('STARTING: ', 're-chunking all Bibles.')

    source_directories = get_source_directories()

    for source_directory in source_directories:
        rechunk_this_one(source_directory)

    print_ok('ALL FINISHED: ', 're-chunking all Bibles.')
Example #16
0
def main(git_repo, tag, no_pdf):
    global download_dir

    # clean up the git repo url
    if git_repo[-4:] == '.git':
        git_repo = git_repo[:-4]

    if git_repo[-1:] == '/':
        git_repo = git_repo[:-1]

    # initialize some variables
    today = ''.join(str(datetime.date.today()).rsplit(
        str('-'))[0:3])  # str(datetime.date.today())
    download_dir = '/tmp/{0}'.format(git_repo.rpartition('/')[2])
    make_dir(download_dir)
    downloaded_file = '{0}/{1}.zip'.format(download_dir,
                                           git_repo.rpartition('/')[2])
    file_to_download = join_url_parts(git_repo, 'archive/{0}.zip'.format(tag))
    manifest = None
    status = None  # type: OBSStatus
    content_dir = None

    # download the repository
    try:
        print('Downloading {0}...'.format(file_to_download), end=' ')
        if not os.path.isfile(downloaded_file):
            download_file(file_to_download, downloaded_file)
    finally:
        print('finished.')

    try:
        print('Unzipping...'.format(downloaded_file), end=' ')
        unzip(downloaded_file, download_dir)
    finally:
        print('finished.')

    # examine the repository
    for root, dirs, files in os.walk(download_dir):

        if 'manifest.json' in files:
            # read the manifest
            try:
                print('Reading the manifest...', end=' ')
                content_dir = root
                manifest = load_json_object(os.path.join(
                    root, 'manifest.json'))
                status = OBSStatus.from_manifest(manifest)
            finally:
                print('finished.')

        if 'content' in dirs:
            content_dir = os.path.join(root, 'content')

        # if we have everything, exit the loop
        if content_dir and manifest and status:
            break

    # check for valid repository structure
    if not manifest:
        print_error('Did not find manifest.json in {}'.format(git_repo))
        sys.exit(1)

    print('Initializing OBS object...', end=' ')
    lang = manifest['language']['slug']
    obs_obj = OBS()
    obs_obj.date_modified = today
    obs_obj.direction = manifest['language']['dir']
    obs_obj.language = lang
    print('finished')

    obs_obj.chapters = load_obs_chapters(content_dir)
    obs_obj.chapters.sort(key=lambda c: int(c['number']))

    if not obs_obj.verify_all():
        print_error('Quality check did not pass.')
        sys.exit(1)

    print('Loading languages...', end=' ')
    lang_dict = OBS.load_lang_strings()
    print('finished.')

    print('Loading the catalog...', end=' ')
    export_dir = '/var/www/vhosts/door43.org/httpdocs/exports'

    cat_path = os.path.join(export_dir, 'obs-catalog.json')
    catalog = load_json_object(cat_path, [])
    print('finished')

    print('Getting already published languages...', end=' ')
    json_lang_file_path = os.path.join(export_dir, lang, 'obs',
                                       'obs-{0}.json'.format(lang))

    if lang not in lang_dict:
        print("Configuration for language {0} missing.".format(lang))
        sys.exit(1)
    print('finished.')

    updated = update_language_catalog(lang, obs_obj.direction, status, today,
                                      lang_dict, catalog)

    print('Writing the OBS file to the exports directory...', end=' ')
    cur_json = json.dumps(obs_obj, sort_keys=True, cls=OBSEncoder)

    if updated:
        ([x for x in catalog
          if x['language'] == lang][0]['date_modified']) = today
        # noinspection PyTypeChecker
        write_file(json_lang_file_path.replace('.txt', '.json'), cur_json)
    print('finished.')

    export_to_api(lang, status, today, cur_json)

    cat_json = json.dumps(catalog, sort_keys=True, cls=OBSEncoder)
    write_file(cat_path, cat_json)

    # update the catalog
    print_ok('STARTING: ', 'updating the catalogs.')
    update_catalog()
    print_ok('FINISHED: ', 'updating the catalogs.')

    if no_pdf:
        return

    create_pdf(lang, status.checking_level, status.version)
Example #17
0
                'Currently only github and git.door43.org repositories are supported.'
            )
            sys.exit(0)

        # prompt user to update status.txt
        print_notice(
            'Check status-{0}.json in the git repository and update the information if needed.'
            .format(args.lang))
        prompt('Press Enter to continue when ready...')
        print()

        # do the import
        import_obs(this_lang, args.gitrepo, args.url, args.nopdf)

        # update the catalog
        print_ok('STARTING: ', 'updating the catalogs.')
        update_catalog()
        print_ok('FINISHED: ', 'updating the catalogs.')

        # update OBS in-progress
        print_ok('STARTING: ', 'updating OBS in progress.')
        ObsInProgress.run()
        print_ok('FINISHED: ', 'updating OBS in progress.')

        print_ok('ALL FINISHED: ',
                 'Please check door43.org and api.unfoldingword.org.')
        print_notice('Don\'t forget to notify the interested parties.')

    finally:
        # delete temp files
        if os.path.isdir(download_dir):
    print('finished.')
    return chapters


if __name__ == '__main__':
    print()
    parser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter)
    parser.add_argument('-r', '--gitrepo', dest='gitrepo', default=False,
                        required=True, help='Git repository where the source can be found.')
    parser.add_argument('-t', '--tag', dest='tag', default='master',
                        required=False, help='Branch or tag to use as the source. Default is master.')
    parser.add_argument('-p', '--nopdf', dest='nopdf', action='store_true', help='Do not produce a PDF.')

    args = parser.parse_args(sys.argv[1:])

    # prompt user to update status.json
    print_notice('Check status.json in the git repository and update the information if needed.')
    prompt('Press Enter to continue when ready...')

    try:
        print_ok('STARTING: ', 'publishing OBS repository.')
        main(args.gitrepo, args.tag, args.nopdf)
        print_ok('ALL FINISHED: ', 'publishing OBS repository.')
        print_notice('Don\'t forget to notify the interested parties.')

    finally:
        # delete temp files
        if os.path.isdir(download_dir):
            shutil.rmtree(download_dir, ignore_errors=True)
Example #19
0
def import_obs(lang_data, git_repo, door43_url, no_pdf):
    global download_dir, root, api_dir

    lang_code = lang_data['lc']

    # pre-flight checklist
    link_source = '/var/www/vhosts/api.unfoldingword.org/httpdocs/obs/jpg/1/en'
    if not os.path.isdir(link_source):
        print_error(
            'Image source directory not found: {0}.'.format(link_source))
        sys.exit(1)

    if git_repo[-1:] != '/':
        git_repo += '/'

    if no_pdf:
        tools_dir = None
    else:
        tools_dir = '/var/www/vhosts/door43.org/tools'
        if not os.path.isdir(tools_dir):
            tools_dir = os.path.expanduser('~/Projects/tools')

        # prompt if tools not found
        if not os.path.isdir(tools_dir):
            tools_dir = None
            print_notice(
                'The tools directory was not found. The PDF cannot be generated.'
            )
            resp = prompt(
                'Do you want to continue without generating a PDF? [Y|n]: ')
            if resp != '' and resp != 'Y' and resp != 'y':
                sys.exit(0)

    if git_repo:
        if git_repo[-1:] == '/':
            git_repo = git_repo[:-1]

        download_dir = '/tmp/{0}'.format(git_repo.rpartition('/')[2])
        make_dir(download_dir)

        # make sure OBS is initialized on Dokuwiki
        test_dir = root.format(lang_code, '')
        if not os.path.isdir(test_dir):
            print_warning(
                'It seems OBS has not been initialized on Door43.org for {0}'.
                format(lang_code))
            sys.exit(1)

    elif door43_url:
        print_error('URL not yet implemented.')
        return
    else:
        print_error('Source not provided.')
        return

    # get the source files from the git repository
    if 'github' in git_repo:
        # https://github.com/unfoldingWord/obs-ru
        # https://raw.githubusercontent.com/unfoldingWord/obs-ru/master/obs-ru.json
        raw_url = git_repo.replace('github.com', 'raw.githubusercontent.com')
    elif 'git.door43.org' in git_repo:
        raw_url = join_url_parts(git_repo, 'raw')
    else:
        # this is to keep IntelliJ happy, is should have been caught in sub main
        return

    # download needed files from the repository
    file_suffix = '-{0}.json'.format(lang_code.lower())
    files_to_download = [
        join_url_parts(raw_url, 'master/obs' + file_suffix),
        join_url_parts(raw_url, 'master/status' + file_suffix)
    ]

    for file_to_download in files_to_download:

        downloaded_file = os.path.join(download_dir,
                                       file_to_download.rpartition('/')[2])

        try:
            print('Downloading {0}...'.format(file_to_download), end=' ')
            download_file(file_to_download, downloaded_file)
        finally:
            print('finished.')

    # read the files from the git repository
    file_suffix = '-{0}.json'.format(lang_code.lower())
    obs_obj = None
    status_obj = None
    # front_matter_found = False
    # back_matter_found = False

    try:
        print('Examining the files...', end=' ')
        for root_path, dirs, files in os.walk(download_dir):

            if not len(files):
                continue

            for git_file in files:
                if git_file == 'obs' + file_suffix:
                    obs_obj = OBS(os.path.join(root_path, git_file))
                elif git_file == 'status' + file_suffix:
                    status_obj = OBSStatus(os.path.join(root_path, git_file))
                    # elif 'front-matter' in git_file:
                    #     front_matter_found = True
                    # elif 'back-matter' in git_file:
                    #     back_matter_found = True
    finally:
        print('finished.')

    # check data integrity
    if not obs_obj.verify_all():
        sys.exit(1)

    if not status_obj:
        print_error(
            'The file "status{0}" was not found in the git repository.'.format(
                file_suffix))
        sys.exit(1)

    # create Dokuwiki pages
    print_ok('Begin: ', 'creating Dokuwiki pages.')
    for chapter in obs_obj.chapters:

        chapter_title = '====== {0} ======'.format(chapter['title'])
        chapter_ref = '//{0}//'.format(chapter['ref'])
        chapter_body = ''
        chapter_num = chapter['number'].zfill(2)

        for frame in chapter['frames']:
            chapter_body += '{{{{{0}?direct&}}}}\n\n{1}\n\n'.format(
                frame['img'], frame['text'])

        file_name = root.format(lang_code, chapter_num + '.txt')
        print('  Writing {0}'.format(file_name))
        with codecs.open(file_name, 'w', 'utf-8-sig') as out_file:
            out_file.write('{0}\n\n{1}{2}\n'.format(chapter_title,
                                                    chapter_body, chapter_ref))

    print_ok('Finished: ', 'creating Dokuwiki pages.')

    # Create image symlinks on api.unfoldingword.org
    try:
        print('Creating symlink to images directory...', end=' ')
        link_name = '/var/www/vhosts/api.unfoldingword.org/httpdocs/obs/jpg/1/{0}'.format(
            lang_code.lower())
        if not os.path.isfile(link_name) and not os.path.isdir(
                link_name) and not os.path.islink(link_name):
            os.symlink(link_source, link_name)
    finally:
        print('finished.')

    # Create PDF via ConTeXt
    if not no_pdf and tools_dir and os.path.isdir(tools_dir):
        try:
            print_ok('Beginning: ', 'PDF generation.')
            script_file = os.path.join(tools_dir, 'obs/book/pdf_export.sh')
            out_dir = api_dir.format(lang_code)
            make_dir(out_dir)
            process = subprocess.Popen([
                script_file, '-l', lang_code, '-c', status_obj.checking_level,
                '-v', status_obj.version, '-o', out_dir
            ],
                                       shell=True,
                                       stdout=subprocess.PIPE,
                                       stderr=subprocess.PIPE)

            # wait for the process to terminate
            out, err = process.communicate()
            exit_code = process.returncode
            out = out.strip().decode('utf-8')
            err = err.strip().decode('utf-8')

            # the error message may be in stdout
            if exit_code != 0:
                if not err:
                    err = out
                    out = None

            if err:
                print_error(err, 2)

            if out:
                print('  ' + out)

            print('  PDF subprocess finished with exit code {0}'.format(
                exit_code))

        finally:
            print_ok('Finished:', 'generating PDF.')
Example #20
0
                print_error('{0}: {1}'.format(ioe.strerror, ioe.filename))
                self.errors.append(ioe)

            except Exception as e:
                print_error(e.message)
                self.errors.append(e)

            finally:
                print('finished.')

        except Exception as e:
            print_error(e.message)
            self.errors.append(e)


if __name__ == '__main__':
    print()
    parser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter)
    parser.add_argument('-r', '--gitrepo', dest='gitrepo', default=False,
                        required=True, help='Git repository where the source can be found.')
    parser.add_argument('-o', '--outdir', dest='outdir', default=False,
                        required=True, help='The output directory for markdown files.')

    args = parser.parse_args(sys.argv[1:])

    # call with closing to be sure the temp files get cleaned up
    with closing(TransformOBS(args.gitrepo, args.outdir)) as tx:
        tx.run()

    print_ok('ALL FINISHED: ', 'Please check the output directory.')
        book_text = s5_re.sub('', book_text)

        # get the usfm for the book
        book.set_usfm(book_text)

        # do basic checks
        book.verify_chapters_and_verses(True)
        if book.validation_errors:
            errors_found = True

        print('finished.')

    # stop if errors were found
    if errors_found:
        print_error('These USFM errors must be corrected before publishing can continue.')
        sys.exit(1)

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description=__doc__,
                                     formatter_class=argparse.RawDescriptionHelpFormatter)
    parser.add_argument('-d', '--directory', dest='directory', default=False, required=True,
                        help='The directory to check.')
    parser.add_argument('-v', '--versification', dest='versification', default='ufw', required=False,
                        help='Versification system - current options are "ufw" (unfoldingWord) and "rsc" (Russian)')

    args = parser.parse_args(sys.argv[1:])

    print_ok('STARTING: ', 'validating USFM files.')
    main(args.directory, args.versification)
    print_ok('ALL FINISHED: ', 'validating USFM files.')
Example #22
0
                        dest='gitrepo',
                        default=False,
                        required=True,
                        help='Git repository where the source can be found.')
    parser.add_argument(
        '-t',
        '--tag',
        dest='tag',
        default='master',
        required=False,
        help='Branch or tag to use as the source. Default is master.')

    args = parser.parse_args(sys.argv[1:])

    # prompt user to update meta.json
    print_notice(
        'Check meta.yaml in the git repository and update the information if needed.'
    )
    prompt('Press Enter to continue when ready...')

    try:
        print_ok('STARTING: ', 'publishing TA repository.')
        main(args.gitrepo, args.tag)
        print_ok('ALL FINISHED: ', 'publishing TA repository.')
        print_notice('Don\'t forget to notify the interested parties.')

    finally:
        # delete temp files
        if os.path.isdir(download_dir):
            shutil.rmtree(download_dir, ignore_errors=True)
        if 'github' not in args.gitrepo and 'git.door43.org' not in args.gitrepo:
            print_warning('Currently only github and git.door43.org repositories are supported.')
            sys.exit(0)

        # prompt user to update status.txt
        print_notice(
            'Check status-{0}.json in the git repository and update the information if needed.'.format(args.lang))
        prompt('Press Enter to continue when ready...')
        print()

        # do the import
        import_obs(this_lang, args.gitrepo, args.url, args.nopdf)

        # update the catalog
        print_ok('STARTING: ', 'updating the catalogs.')
        update_catalog()
        print_ok('FINISHED: ', 'updating the catalogs.')

        # update OBS in-progress
        print_ok('STARTING: ', 'updating OBS in progress.')
        ObsInProgress.run()
        print_ok('FINISHED: ', 'updating OBS in progress.')

        print_ok('ALL FINISHED: ', 'Please check door43.org and api.unfoldingword.org.')
        print_notice('Don\'t forget to notify the interested parties.')

    finally:
        # delete temp files
        if os.path.isdir(download_dir):
            shutil.rmtree(download_dir, ignore_errors=True)