CINXE.COM

<!DOCTYPE HTML> <html><head> <META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW" /> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <link rel="icon" href="favicon.png" type="image/png" /> <title tt="toolname"></title> <link rel="stylesheet" href="https://tools-static.wmflabs.org/cdnjs/ajax/libs/twitter-bootstrap/4.0.0/css/bootstrap.min.css" /> <link rel="stylesheet" href="https://tools-static.wmflabs.org/magnustools/resources/html/wikimedia.css" /> <link href="https://mix-n-match.toolforge.org/api.php?query=rc_atom" type="application/atom+xml" rel="alternate" title="Recent Changes Atom feed" /> <script src="https://tools-static.wmflabs.org/cdnjs/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <script src="https://tools-static.wmflabs.org/cdnjs/ajax/libs/twitter-bootstrap/4.0.0/js/bootstrap.bundle.min.js"></script> <script src="https://tools-static.wmflabs.org/cdnjs/ajax/libs/vue/2.5.13/vue.min.js"></script> <script src="https://tools-static.wmflabs.org/cdnjs/ajax/libs/vue-router/3.0.1/vue-router.min.js"></script> <script src="https://tools-static.wmflabs.org/tooltranslate/tt.js"></script> <script src="https://tools-static.wmflabs.org/magnustools/resources/js/wikidata.js"></script> <script src="https://tools-static.wmflabs.org/magnustools/resources/vue/shared.js"></script> <script src="https://mix-n-match.toolforge.org/ace-builds/src-min-noconflict/ace.js" type="text/javascript" charset="utf-8"></script> <style> /* Wikipedia style guide: https://wikimedia.github.io/WikimediaUI-Style-Guide/visual-style_colors.html */ .entry_cell_desc, .wp_search_result_summary , .autodesc_description { font-family:Charter,Verdana,Times New Roman; } #app { max-width:960px; margin-left:auto; margin-right:auto; } .num { font-family:Courier; text-align:right; white-space:nowrap; } a.page-link { color:#36c;/*Wikipedia style guide color*/ } a.set_user_q { color:#14866d;/*Wikipedia style guide color; was green*/ } a.new_item { color:#b32424;/*Wikipedia style guide color; was red*/ } a.n_a { color:#fc3;/*Wikipedia style guide color; was #DFDF00;*/ } .wikidata_link small { font-size:60%; } .text-info { color:#00af89; } #tooltranslate_wrapper { margin-top:6px; margin-right:10px; } .entry_row { margin-bottom:5px; padding:2px; } .entry_row:nth-child(odd) { background-color:#eaecf0;/*Wikipedia style guide color*/ } .entry_cell_left , .entry_cell_desc , .entry_cell_right , .entry_cell_joined { display:table-cell; vertical-align:top; } .entry_cell_left { width:180px; max-width:180px; line-height:1em; } .entry_cell_desc { width:590px; max-width:590px; font-size:10pt; padding-right:5px; } .entry_cell_right { font-size:10pt; } .entry_cell_joined { width:764px; max-width:764px; } div.link_row { display:inline; margin-right:20px; } div.catalog-list-item { display:table-cell;padding:2px;max-width:20%; } div.inactive { pointer-events: none; opacity: 0.4; } </style> </head> <body> <div id='app'> <nav class="navbar navbar-expand-lg navbar-light bg-light"> <button class="navbar-toggler navbar-toggler-right" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation"> <span class="navbar-toggler-icon"></span> </button> <div class="collapse navbar-collapse" id="navbarSupportedContent"> <ul class="navbar-nav mr-auto"> <li class="nav-item" style='margin-right:10px;'> <div class="btn-group" style='margin-top:9px;'> <a href='#/' class="btn btn-light" tt='toolname'></a> <button type="button" class="btn btn-light btn-sm dropdown-toggle dropdown-toggle-split" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"></button> <div class="dropdown-menu dropdown-menu-right" style="padding:2px"> <router-link to='/rc' class="dropdown-item" style="padding:2px" tt="recent_changes"></router-link> <router-link to='/creation_candidates/human' class="dropdown-item" style="padding:2px" tt="creation_candidates_human"></router-link> <router-link to='/creation_candidates/dates' class="dropdown-item" style="padding:2px" tt="creation_candidates_dates"></router-link> <router-link to='/creation_candidates/birth_year' class="dropdown-item" style="padding:2px" tt="creation_candidates_birth_year"></router-link> <router-link to='/creation_candidates/artwork' class="dropdown-item" style="padding:2px" tt="creation_candidates_artwork"></router-link> <!-- <router-link to='/creation_candidates' class="dropdown-item" style="padding:2px" tt="creation_candidates"></router-link> <router-link to='/creation_candidates/human' class="dropdown-item" style="padding:2px" tt="creation_candidates_human"></router-link> <router-link to='/creation_candidates/taxon' class="dropdown-item" style="padding:2px" tt="creation_candidates_taxon"></router-link> --> <router-link to='/entries' class="dropdown-item" style="padding:2px" tt="entries_page"></router-link> <router-link to='/top_groups' class="dropdown-item" style="padding:2px" tt="top_groups"></router-link> <router-link to='/sparql' class="dropdown-item" style="padding:2px" tt="sparql_list"></router-link> <router-link to='/top_missing' class="dropdown-item" style="padding:2px" tt="top_missing"></router-link> <router-link to='/jobs' class="dropdown-item" style="padding:2px" tt="jobs"></router-link> <router-link to='/issues' class="dropdown-item" style="padding:2px" tt="issues"></router-link> <router-link to='/import' class="dropdown-item" style="padding:2px" tt="import_or_update_catalog"></router-link> <router-link to='/scraper/new' class="dropdown-item" style="padding:2px" tt="new_scraper"></router-link> <router-link to='/missing_properties' class="dropdown-item" style="padding:2px" tt="missing_properties"></router-link> <router-link to='/random' class="dropdown-item" style="padding:2px" tt="random_entry_all_catalogs"></router-link> <a style="padding:2px" class="dropdown-item external" href="https://meta.wikimedia.org/wiki/Mix%27n%27match" target='_blank' tt="about"></a> </div> </div> </li> <li class="nav-item active"> <div id='tooltranslate_wrapper'></div> </li> </ul> <widar></widar> <search-box></search-box> <a style="margin:0px;padding:0px;margin-top:4px;margin-left:10px;" href="/" target='_blank'><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/c/c5/Toolforge_logo.svg/32px-Toolforge_logo.svg.png" tt_title="wmf_powered" border="0" width="32px" /></a> <!-- <form class="form-inline my-2 my-lg-0"> <input class="form-control mr-sm-2" type="search" placeholder="Search" aria-label="Search"> <button class="btn btn-outline-success my-2 my-sm-0" type="submit">Search</button> </form> --> </div> </nav> <!-- <nav class="navbar navbar-toggleable-md navbar-light bg-faded" style='min-height:40px;'> <div class="collapse navbar-collapse" id="navbarSupportedContent"> <ul class="navbar-nav mr-auto"> </ul> </div> </nav> --> <router-view :key="$route.path"><i tt='loading'></i></router-view> </div> </body> <!-- BEGIN TEMPLATES FOR VUE COMPONENTS --> <template id='top-missing-entries-template'> <div> <p tt='top_missing_blurb'></p> <div v-if='loading'><i tt='loading'></i></div> <div v-else> <div v-if='require_catalogs.length>0' style='margin-bottom:10px;'> <span tt='catalogs'></span>: <span v-for='(cid,num) in require_catalogs'> <span v-if='num>0'>; </span> <router-link :to="'/catalog/'+cid">{{get_catalog(cid).name}}</router-link> </span> </div> <div style='margin-bottom:10px;' class='row'> <span class='col-sm-2' tt='required_catalogs'></span> <span class='col-sm-4'> <input type='text' v-model='require_catalogs_string' tt_placeholder='com_sep_id' class='form-control' /> </span> <span class='col-sm-2'> <button class='btn btn-outline-primary' @click.prevent='reloadWithParameters' tt='reload'></button> </span> </div> <div v-if='data.length==0 && has_loaded' tt='no_results'></div> <div v-else> <ol> <li v-for='d in data'> <router-link :to="'/creation_candidates/by_ext_name/?ext_name='+d.ext_name" target='_blank'> {{d.ext_name}} </router-link> ({{d.cnt}} <span tt='distinct_catalogs'></span>) </li> </ol> </div> </div> </div> </template> <template id='creation-candidates-template'> <div> <h2> <div v-if="entries.length>0" style='float:right'> <button class="btn btn-outline-primary" @click.prevent='entries=[];loadData();return false' tt='next_set'></button> </div> <span tt='creation_candidates'></span> </h2> <div v-if="entries.length==0"><i tt='loading'></i></div> <div v-else> <div v-for='(entry_group,num) in grouped_entries' class='card' style='margin-bottom:20px'> <div style="display:table;width:100%"> <entry-list-item v-for="e in entry_group" :entry="e" :show_catalog="1" :show_permalink="1" :twoline="1" :key="e.id" :show_checkbox="1" :radio_name='mode=="by_ext_name"?null:"default_entry"'></entry-list-item> </div> <div><small> [<a href='#' @click.prevent='toggleCheckboxes' tt='toggle_checkboxes'></a>] | [<a href='#' @click.prevent='resetDefaultEntry' tt='reset_default_entry'></a>] </small></div> </div> <div> <button class="btn btn-outline-primary next_cc_set" @click.prevent='entries=[];loadData();return false' tt='next_set'></button> <span v-if='widar.is_logged_in'> <button v-if='edits_todo.length==0' class='btn btn-outline-success' @click.prevent='createNewItem' tt_title='creation_warning'><span tt='create_new_item_for'></span> "{{entries[0].ext_name}}"</button> </span> <a :href='"https://commons.wikimedia.org/w/index.php?title=Special:MediaSearch&type=image&search="+entries[0].ext_name' target='_blank' class='btn btn-outline-success'> <span tt='search_commons'></span> <span v-if='has_commons_search_results'>&nbsp;✓</span> </a> <a :href='"https://www.google.com/search?q="+entries[0].ext_name+ "&tbm=isch&hl=en-US&tbs=il:cl"' target='_blank' class='btn btn-outline-success' tt='search_google_images_cc'></a> </div> </div> <div style='margin-top:20px;'> <!-- Wikidata search results --> <div class="card" style="margin-bottom:1em"> <div class="card-block"> <h4 class="card-title"><span tt='wikidata_search_results'></span><span v-if='loaded_wd'> "{{entries[0].ext_name}}"</span></h4> <div class="card-text"> <div v-if="loaded_wd"> <div v-if="wd_entries.length>0" style="max-height:20em;overflow:auto"> <table class="table table-condensed table-striped"> <tbody> <tr v-for="e in wd_entries"> <td nowrap> <a class='wikidata' target='_blank' :href='e.url'>{{e.id}}</a> <br/><small>{{e.id}}</small> </td> <td style='width:100%'> <div><b>{{e.label}}</b></div> <div style='font-size:10pt;-family:serif;'> <wd-desc autodesc_first='1' :item='e.id.replace(/\D/g,"")' autodesc_fallback='1'></wd-desc> <!--<autodesc :item='e.id.replace(/\D/g,"")' mode='long'></autodesc>--> </div> </td> </tr> </tbody> </table> </div> <div v-else tt='no_matches'></div> </div> <div v-else tt='loading'></div> </div> </div> </div> </div> </div> </template> <template id='recent-changes-template'> <div> <h2 tt='recent_changes'></h2> <div> <a :href='"https://mix-n-match.toolforge.org/api.php?query=rc_atom"+(typeof catalog=="undefined"?"":"&catalog="+catalog)' tt='recent_changes_atom_feed'></a> </div> <div v-if="entries.length==0"><i tt='loading'></i></div> <div v-else> <catalog-header v-if='typeof catalog!="undefined"' :catalog="catalog"></catalog-header><!--Why does this not work??--> <div style="display:table;width:100%"><entry-list-item v-for="e in entries" :entry="e" :rc="1" :show_catalog="0" :show_permalink="1" :key="e.id"></entry-list-item></div> </div> </div> </template> <template id='widar-template'> <div style='margin-left:5px;margin-right:5px;text-align:center' v-if="loaded"> <div v-if='is_logged_in' style='line-height:1.4em'><span tt="welcome"></span><br/><userlink :username="userinfo.name"/></div> <div v-else><i tt="log_into_widar"></i></div> </div> </template> <template id='catalog-slice-template'> <div class='slice' :id='section'> <div style='float:right'> <small> [<router-link :to="getTopMissingURL()" tt='top_missing'></router-link>] </small> </div> <h4>{{title}}</h4> <div style="display:table;width:100%"><catalog-list-item v-for="cid in catalogs" v-bind:cid="cid" :key='cid'></catalog-list-item></div> </div> </template> <template id='main-page-template'> <div> <div class='row'> <div class='col-sm-12' tt='top_message'></div> </div> <div class='row mt-3'> <div class='col-sm-4'> <h4 tt='catalog_groups'></h4> <table class='table table-striped mt-3' style='width:auto;'> <tbody> <thead><tr><th tt='group'></th><th tt='catalogs'></th></tr></thead> <tr v-for='type in types'> <td><router-link :to="'/group/'+type">{{ucFirst(type)}}</router-link></td> <td class='num'>{{type2count[type]}}</td> </tr> </tbody> </table> </div> <!-- Catalog search --> <div class='col-sm-8'> <h4 tt='search_catalogs'></h4> <div> <input id='catalog_search_query_input' style='width:100%' class='form-control' type='text' v-model='search_query' placeholder='Start typing here' autofocus /> </div> <div v-if='catalog_search_results.length>0'> <ul class="list-group"> <li v-for='cid in catalog_search_results' class="list-group-item"> <router-link :to="'/catalog/'+cid">{{get_catalog(cid).name}}</router-link> <small>{{get_catalog(cid).desc}} [<i>{{get_catalog(cid).type}}</i>]</small> </li> </ul> </div> <!-- Latest catalogs --> <div class='mt-3'> <h4 tt='latest_catalogs'></h4> <table class='table table-striped table-sm' style='width:100%;'> <tbody> <tr v-for='catalog in lastest_catalogs'> <td v-if='typeof get_catalog(catalog)!="undefined"'><router-link :to="'/catalog/'+catalog">{{get_catalog(catalog).name}}</router-link> <small> {{get_catalog(catalog).desc}} </small> </td> </tr> </tbody> </table> </div> <div class='mt-3'> <h4 tt='useful_groupings'></h4> <ul> <li> <router-link to='/top_groups' tt="top_groups"></router-link> </li> <li> <router-link to='/creation_candidates/human' tt="creation_candidates_human"></router-link> </li> </ul> </div> <div class='mt-3'> <ul class="nav nav-tabs" id="myTab" role="tablist"> <li class="nav-item"> <a class="nav-link active" id="propclass-tab" data-toggle="tab" href="#propclass" role="tab" aria-controls="propclass" aria-selected="true">Catalogs by property class</a> </li> <li class="nav-item"> <a class="nav-link" id="country-tab" data-toggle="tab" href="#country" role="tab" aria-controls="country" aria-selected="false">Catalogs by country</a> </li> <li class="nav-item"> <a class="nav-link" id="top-groups-tab" data-toggle="tab" href="#top_groups" role="tab" aria-controls="top-groups" aria-selected="false" tt='top_groups'></a> </li> <li class="nav-item"> <a class="nav-link" id="top-groups-tab" data-toggle="tab" href="#maps" role="tab" aria-controls="maps" aria-selected="false">Maps</a> </li> </ul> <div class="tab-content" id="myTabContent"> <div class="tab-pane fade show active" id="propclass" role="tabpanel" aria-labelledby="propclass-tab"> <table class='table table-striped table-sm' style='width:auto;'> <tbody> <thead><tr><th tt='group'></th><th tt='catalogs'></th></tr></thead> <tr v-for='igk in item_groups_list' v-if='igk.substr(0,3)=="ig_"'> <td><router-link :to="'/group/'+igk">{{ucFirst(item2group[igk].label)}}</router-link></td> <td class='num'>{{item2group[igk].catalogs.length}}</td> </tr> </tbody> </table> </div> <div class="tab-pane fade" id="country" role="tabpanel" aria-labelledby="country-tab"> <table class='table table-striped table-sm' style='width:auto;'> <tbody> <thead><tr><th tt='group'></th><th tt='catalogs'></th></tr></thead> <tr v-for='igk in item_groups_list' v-if='igk.substr(0,8)=="country_"'> <td><router-link :to="'/group/'+igk">{{ucFirst(item2group[igk].label)}}</router-link></td> <td class='num'>{{item2group[igk].catalogs.length}}</td> </tr> </tbody> </table> </div> <div class="tab-pane fade" id="top_groups" role="tabpanel" aria-labelledby="top-groups-tab"> <table class='table table-striped table-sm' style='width:auto;'> <tbody> <thead><tr><th tt='group'></th><th tt='catalogs'></th></tr></thead> <tr v-for='g in top_groups'> <td><router-link :to="'/top_missing/'+g.catalogs">{{g.name}}</router-link></td> <td class='num'>{{g.catalogs.split(',').length}}</td> </tr> </tbody> </table> </div> <div class="tab-pane fade" id="maps" role="tabpanel" aria-labelledby="maps-tab"> <table class='table table-striped table-sm' style='width:auto;'> <tbody> <tr v-for='catalog in get_all_catalogs()' v-if='(catalog.has_locations||"")=="yes"'> <td><router-link :to="'/map/'+catalog.id">{{catalog.name}}</router-link></td> <td>{{catalog.desc}}</td> </tr> </tbody> </table> </div> </div> </div> </div> </div> </div> </template> <template id='catalog-entry-multi-match-template'> <span v-if='display' tt_title='multimatch_candidates' style='margin-left:30px;'> <div class="btn-group"> <button type="button" class="btn btn-light btn-sm dropdown-toggle dropdown-toggle-split" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">{{entry.multimatch.length}}</button> <div class="dropdown-menu dropdown-menu-right" style="padding:2px;max-width:500px;overflow:auto;" v-if='loaded'> <div v-for='mq in entry.multimatch' :title='mq' style='white-space:nowrap;line-height:1;margin-bottom:7pt'> <div v-if='typeof ld[mq]!="undefined"'> <div> <a :href='"https://www.wikidata.org/wiki/"+mq' target='_blank' class='wikidata' :style='ld[mq].label.toLowerCase()==entry.ext_name.toLowerCase()?"font-weight:bold":""'>{{ld[mq].label}}</a> <small v-if='mq!=ld[mq].label'>[{{mq}}]</small> <small>[<a href='#' @click.prevent='setUserQ($event,mq)' tt='set_q' class='set_user_q'></a>]</small> </div> <div style='font-size:7pt;max-width:500px;white-space:normal'> <span v-if='ld[mq].description.length==0'><i> <wd-desc :autodesc_first='entry.type=="Q5"' :item='mq.replace(/\D/g,"")' autodesc_fallback='1'></wd-desc> <!--<autodesc :item='mq.replace(/\D/g,"")' mode='long' :key='entry.id+"_"+mq' :highlight='highlight'></autodesc>--> </i></span> <span v-else class='catalog-entry-multi-match-desc'>{{ld[mq].description}}</span> </div> </div> </div> <div style='white-space:nowrap;line-height:1;margin-bottom:7pt'> <a href='#' @click.prevent='noneAreCorrect($event)' tt='none_are_correct'></a> </div> </div> </div> </span> </template> <template id='catalog-actions-dropdown-template'> <div class="dropdown-menu dropdown-menu-right" style="padding:2px" v-if="catalog"> <router-link :to='"/list/"+catalog.id+"/manual"' class="dropdown-item" style="padding:2px" tt="manually_matched"></router-link> <router-link :to='"/list/"+catalog.id+"/auto"' class="dropdown-item" style="padding:2px" tt="auto_matched"></router-link> <router-link :to='"/list/"+catalog.id+"/unmatched"' class="dropdown-item" style="padding:2px" tt="unmatched"></router-link> <router-link :to='"/list/"+catalog.id+"/multi_match"' class="dropdown-item" style="padding:2px" tt="multi_match"></router-link> <!-- <router-link :to='"/list/"+catalog.id+"/nowd"' class="dropdown-item" style="padding:2px" tt="no_wikidata"></router-link> --> <router-link :to='"/list/"+catalog.id+"/na"' class="dropdown-item" style="padding:2px" tt="not_applicable"></router-link> <div class="dropdown-divider"></div> <!--<a v-if="catalog.nowd>0" style="padding:2px" class="alert-danger dropdown-item" href="#" @click.prevent="click('create_missing')" tt="create_missing"></a>--> <router-link :to='"/import/"+catalog.id' class="dropdown-item" style="padding:2px" tt="import_or_update_catalog"></router-link> <router-link :to='"/site_stats/"+catalog.id' class="dropdown-item" style="padding:2px" tt="site_stats"></router-link> <router-link v-if='catalog.has_locations=="yes"' :to='"/map/"+catalog.id' class="dropdown-item" style="padding:2px;font-weight:bold" tt="map"></router-link> <router-link v-if='catalog.has_locations=="yes" || typeof catalog.image_pattern!="undefined"' :to='"/quick_compare/"+catalog.id' class="dropdown-item" style="padding:2px;font-weight:bold" tt="quick_compare"></router-link> <router-link :to='"/download/"+catalog.id' class="dropdown-item" style="padding:2px;font-weight:bold" tt="download"></router-link> <router-link :to='"/random/"+catalog.id' class="dropdown-item" style="padding:2px;font-weight:bold" tt="game_mode"></router-link> <router-link :to='"/rc/"+catalog.id' class="dropdown-item" style="padding:2px" tt="rc_for_catalog"></router-link> <router-link :to='"/aliases/"+catalog.id' class="dropdown-item" style="padding:2px" tt="aliases"></router-link> <!--<a style="padding:2px" class="alert-danger dropdown-item" href="#" @click.prevent="click('disambig')" tt="disambig"></a>--> <router-link v-if='widar.is_logged_in' :to='"/jobs/"+catalog.id' class="dropdown-item" style="padding:2px" tt="jobs"></router-link> <router-link :to='getSearchCatalogPath()' class="dropdown-item" style="padding:2px" tt="search_this_catalog"></router-link> <router-link :to='"/common_names/"+catalog.id' class="dropdown-item" style="padding:2px;font-weight:bold;" tt="common_names"></router-link> <router-link :to='"/issues/ALL/"+catalog.id' class="dropdown-item" style="padding:2px" tt='issues_in_this_catalog'></router-link> <router-link v-if='catalog.wd_prop!=null && catalog.wd_qual==null' :to='"/sync/"+catalog.id' class="dropdown-item" style="padding:2px" tt="sync_catalog"></router-link> <router-link v-if='widar.is_catalog_admin' :to='"/catalog_editor/"+catalog.id' class="dropdown-item" style="padding:2px" tt="catalog_editor"></router-link> <a style="padding:2px" class="dropdown-item external" target='_blank' :href="'./mobile_game.html?catalog='+catalog.id" tt="mobile_game"></a> <a style="padding:2px" class="dropdown-item external" target='_blank' :href="'./visual_match.html#catalog='+catalog.id" tt="visual_tool"></a> <a v-if="catalog.wd_prop!=null && catalog.wd_qual==null" style="padding:2px" target='_blank' class="dropdown-item external" :href="'https://tools.wmflabs.org/fist/wdfist/?depth=3&language=en&project=wikipedia&sparql=SELECT%20?item%20WHERE%20{%20?item%20wdt:P'+catalog.wd_prop+'%20[]}&no_images_only=1&remove_used=1&remove_multiple=1&prefilled=1'" tt="find_images"></a> <a v-if="catalog.wd_prop!=null && catalog.wd_qual==null" style="padding:2px" class="dropdown-item external" target="_blank" :href="'https://tools.wmflabs.org/wikidata-todo/sparql_rc.php?sparql=SELECT+%3Fq+WHERE+%7B+%3Fq+wdt%3AP'+catalog.wd_prop+'+%5B%5D+%7D&start=last+week&end='" tt='changes_last_week'></a> <a style="padding:2px" class="dropdown-item wikidata" target='_blank' :href="'https://www.wikidata.org/wiki/User:Magnus_Manske/Mix%27n%27match_report/'+catalog.id" tt="catalog_report"></a> <a v-if="catalog.wd_prop!=null && catalog.wd_qual==null" style="padding:2px" class="dropdown-item wikidata" target="_blank" :href="'https://www.wikidata.org/wiki/Property:P'+catalog.wd_prop">P{{catalog.wd_prop}}</a> <div v-else class='dropdown-item' style='color:red;font-size:8pt;text-align:left;' tt='no_wd_prop'></div> </div> </template> <template id='catalog-list-item-template'> <div v-if="catalog.active==1" style="display:table-row" v-once> <div class='catalog-list-item' :style="catalog.wd_prop*1>0?'border-left:1px solid white':'border-left:1px solid red'"> <div class="btn-group"> <router-link class="btn btn-light btn-sm" :to='"/catalog/"+catalog.id' style="text-align:left;width:200px;overflow:hidden" :title="catalog.name">{{catalog.name}}</router-link> <button type="button" class="btn btn-light btn-sm dropdown-toggle dropdown-toggle-split" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"></button> <catalog-actions-dropdown :catalog="catalog"></catalog-actions-dropdown> </div> </div> <div style="display:table-cell;padding:2px;max-width:400px;width:400px;font-size:0.8rem" :title="catalog.desc"><div style="overflow:hidden;white-space:nowrap;"> <div v-if="catalog.url"><a :href="catalog.url" class="external" target="_blank">{{catalog.desc}}</a></div> <div v-else>{{catalog.desc}}</div> </div></div> <div style="display:table-cell;padding:2px;width:300px;overflow:none"> <div class="progress"> <div role="progressbar" class="progress-bar bg-success" :style="{'white-space':'nowrap',width:Math.floor(100*catalog.manual/catalog.total)+'%'}">{{renderPercentage(catalog.manual)}}</div> <div role="progressbar" class="progress-bar bg-info" :style="{'white-space':'nowrap',width:Math.floor(100*catalog.autoq/catalog.total)+'%'}">{{renderPercentage(catalog.autoq)}}</div> <div role="progressbar" class="progress-bar bg-warning" :style="{'white-space':'nowrap',width:Math.floor(100*catalog.nowd/catalog.total)+'%'}">{{renderPercentage(catalog.nowd)}}</div> <div role="progressbar" class="progress-bar bg-danger" :style="{'white-space':'nowrap',width:Math.floor(100*catalog.na/catalog.total)+'%'}">{{renderPercentage(catalog.na)}}</div> </div> </div> <div style='display:table-cell;width:24px'> <div v-if='catalog.noq+catalog.autoq+catalog.na==0'><img src='https://upload.wikimedia.org/wikipedia/commons/thumb/f/fb/Yes_check.svg/20px-Yes_check.svg.png' /></div> </div> </div> </template> <template id='catalog-header-template'> <div> <div v-if='catalog.id'> <h1> <div style='float:right'> <div class="btn-group"> <button type="button" class="btn btn-outline-primary dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Action</button> <catalog-actions-dropdown v-bind:catalog="catalog"></catalog-actions-dropdown> </div> <!--btn-group --> </div> <!--float:right--> <span v-if='nolink'>{{catalog.name}}</span> <a v-else :href='"#/catalog/"+catalog.id'>{{catalog.name}}</a> </h1> <p v-if="catalog.url"><a :href="catalog.url" class="external" target="_blank">{{catalog.desc}}</a></p> <p v-else>{{catalog.desc}}</p> </div> <!-- if --> </div> </template> <template id='catalog-details-template'> <div> <!-- wrapper --> <div v-if='typeof catalog!="undefined"'> <catalog-header :catalog="catalog" :nolink="1"></catalog-header> <p v-if='isNaN(catalog.total)'><b> This catalog appears to be empty, maybe the initial scraping is still running </b></p> <p> <span v-if='typeof catalog.username!="undefined"'><span tt='imported_by_user'></span> <a :href='"https://www.wikidata.org/wiki/User:"+encodeURIComponent(catalog.username)' target='_blank' class='wikidata'>{{catalog.username}}</a></span> <span v-if='typeof catalog.scrape_update!="undefined" && catalog.scrape_update'> | <span tt='updated_via_autoscrape'></span> <small>(<tt>{{catalog.last_scrape}}</tt>)</small></span> <span> | <a href="#" tt="update_stats" @click.prevent='updateStats'></a></span> </p> <div class="card" style="margin-bottom:20px;"> <div class="card-block"> <h4 class="card-title" tt='entries'></h4> <div class="card-text"> <table class='table table-condensed table-striped'> <tbody> <tr><td nowrap><router-link :to='"/list/"+catalog.id+"/manual"' tt="manually_matched"></router-link></td> <td class='num'>{{catalog.manual}}</td><td style='width:100%'><div class="progress"><div role="progressbar" class="progress-bar bg-success" :style="{'white-space':'nowrap',width:Math.floor(1000*catalog.manual/catalog.total)/10+'%'}">{{Math.floor(1000*catalog.manual/catalog.total)/10}}%</div></div></td> </tr> <tr><td nowrap><router-link :to='"/list/"+catalog.id+"/auto"' tt="auto_matched"></router-link></td> <td class='num'>{{catalog.autoq}}</td><td><div class="progress"><div role="progressbar" class="progress-bar" :style="{'white-space':'nowrap',width:Math.floor(1000*catalog.autoq/catalog.total)/10+'%'}">{{Math.floor(1000*catalog.autoq/catalog.total/10)}}%</div></div></td> </tr> <!-- <tr><td nowrap><router-link :to='"/list/"+catalog.id+"/nowd"' tt="no_wikidata"></router-link></td> <td class='num'>{{catalog.nowd}}</td><td><div class="progress"><div role="progressbar" class="progress-bar bg-warning" :style="{'white-space':'nowrap',width:Math.floor(1000*catalog.nowd/catalog.total)/10+'%'}">{{Math.floor(1000*catalog.nowd/catalog.total)/10}}%</div></div></td> </tr> --> <tr><td nowrap><router-link :to='"/list/"+catalog.id+"/na"' tt="not_applicable"></router-link></td> <td class='num'>{{catalog.na}}</td><td><div class="progress"><div role="progressbar" class="progress-bar bg-danger" :style="{'white-space':'nowrap',width:Math.floor(1000*catalog.na/catalog.total)/10+'%'}">{{Math.floor(1000*catalog.na/catalog.total)/10}}%</div></div></td> </tr> <tr><td nowrap><router-link :to='"/list/"+catalog.id+"/unmatched"' tt="unmatched"></router-link></td> <td class='num'>{{catalog.unmatched}}</td><td><div class="progress"><div role="progressbar" class="progress-bar bg-info" :style="{'white-space':'nowrap',width:Math.floor(1000*catalog.unmatched/catalog.total)/10+'%'}">{{Math.floor(1000*catalog.unmatched/catalog.total)/10}}%</div></div></td> </tr> <tr><td tt="total"></td><td class='num'><b>{{catalog.total}}</b></td><td class='num'></td></tr> </tbody> </table> </div></div> <div v-else-if='deactivated'>This catalog has been deactivated.</div> <div v-else><i tt="loading"></i></div> </div> </div> <div v-if='loaded'> <div v-if="typeof meta.type != 'undefined'"> <div class="card" style="margin-bottom:20px;"> <div class="card-block"> <h4 class="card-title" tt='entry_types'></h4> <div class="card-text"> <table class='table table-condensed table-striped'> <tbody> <tr v-for="type in meta.type" v-bind:t="type"> <th> <span v-if='type.type.match(/^Q\d+$/)'><wd-link :item='type.type.replace(/^Q/,"")' :key='type.type'/></span> <span v-else>{{type.type}}</span> </th> <td class='num'>{{type.cnt}}</td> </tr> </tbody> </table> </div></div> </div> <div class="card" style="margin-bottom:20px;"> <div class="card-block"> <h4 class="card-title" tt='matches_over_time'></h4> <div class="card-text"> <table class='table table-condensed table-striped'> <tbody> <tr v-for="ym in meta.ym" v-bind:ym="ym"> <th nowrap>{{ym.ym.substr(0,4)+'-'+ym.ym.substr(4,2)}}</th> <td style='width:100%'> <div class="progress" v-if="catalog.manual>0"> <div role="progressbar" class="progress-bar bg-success" :style="{'white-space':'nowrap',width:Math.floor(100*ym.cnt/(catalog.manual+catalog.na))+'%'}">{{Math.floor(100*ym.cnt/(catalog.manual+catalog.na))}}%</div> </div> </td> <td nowrap class='num'>{{ym.cnt}}</td> </tr> </tbody> </table> </div></div></div> <div class="card" style="margin-bottom:20px;"> <div class="card-block"> <h4 class="card-title" tt='users'></h4> <div class="card-text"> <table class='table table-condensed table-striped'> <tbody> <tr v-for="u in meta.user" v-bind:u="u"> <td><userlink :username='u.username'/></td> <td class='num'>{{u.cnt}}</td> </tr> </tbody> </table> </div></div></div> </div> <div v-if='ext_url_pattern!=""' style='border-top:1px dotted black'> <small> External URL pattern: <tt>{{ext_url_pattern}}</tt> </small> </div> </div> <div v-else><i tt="loading"></i></div> </div> <!-- wrapper --> </template> <template id='entry-template'> <div> <div v-if='loaded'> <catalog-header :catalog="catalog"></catalog-header> <entry-details :entry='entry'></entry-details> <match-entry :entry='entry'></match-entry> </div> <div v-else> <i tt="loading"></i> </div> </div> </template> <template id='catalog-list-nav-template'> <nav v-if="show.length>1"> <ul class="pagination justify-content-center"> <li v-for="v in show" :class="v.class"> <a v-if="typeof mode!='undefined'" class="page-link" :href="'#'+v.url">{{v.label}}</a> <a v-else class="page-link" href='#' @click.prevent='jumpTo(v.p)'>{{v.label}}</a> </li> <li v-if='/\|/.test(get_catalog(id).types)'> <select v-model='type_key' @change='changeType' class='form-control' style='padding-left:20px;'> <option value='|' :selected='typeof type=="undefined"' tt='all_types'></option> <option v-for='t in get_catalog(id).types.split("|")' :value='t'> {{getOptionLabel(t)}} </option> </select> </li> </ul> </nav> </template> <template id='sparql-list-template'> <div> <div style='margin-bottom:20px;'> <p tt='sparql_list_intro'></p> <textarea v-model='sparql_query' style='width:100%' rows=5 tt_placeholder='sparql_placeholder'></textarea> <button class='btn btn-outline-primary' @click.prevent='onRun' tt='run'></button> <router-link class='btn btn-outline-secondary' to="/sparql/SELECT DISTINCT %3Fitem %3FitemLabel WHERE { %3Fpainting wdt%3AP195 wd%3AQ82941 %3B wdt%3AP31 wd%3AQ3305213 %3B wdt%3AP170 %3Fitem SERVICE wikibase%3Alabel { bd%3AserviceParam wikibase%3Alanguage 'en' }}" tt='example'></router-link> </div> <div v-if='loaded && number_of_entries>0'> <catalog-list-nav :id="0" :base="'list'" v-on:navlink-clicked='setPage($event)' :max="number_of_entries" :start="start" :batch="per_page"></catalog-list-nav> <div><entry-list-item v-for="e in entries_subset" :show_catalog=1 :entry="e" :hide_remove_on_automatch="1" :show_permalink="1" :key="e.id"></entry-list-item></div> <catalog-list-nav :id="0" :base="'list'" v-on:navlink-clicked='setPage($event)' :max="number_of_entries" :start="start" :batch="per_page"></catalog-list-nav> </div> <div v-else-if='loaded'> <i tt='no_results'></i> </div> <div v-if='loading'> <i tt="loading"></i> </div> </div> </template> <template id='catalog-list-template'> <div> <catalog-header :catalog="catalog"></catalog-header> <div v-if='loaded'> <!--<div>{{mode+': '+catalog[mode]}}</div>--> <catalog-list-nav :id="id" :base="'list'" :mode="mode" :max="catalog[mode2prop[mode]]" :start="start" :batch="per_page" :type='type' :title_match='title_match'></catalog-list-nav> <div> <entry-list-item v-for="e in entries" :entry="e" :show_permalink="1" :key="e.id"></entry-list-item> </div> <catalog-list-nav :id="id" :base="'list'" :mode="mode" :max="catalog[mode2prop[mode]]" :start="start" :batch="per_page" :type='type' :title_match='title_match'></catalog-list-nav> </div> <div v-else> <i tt="loading"></i> </div> </div> </template> <template id='timestamp-template'> <span v-if='typeof ts != "undefined" && ts!=null'> {{ts.substr(0,4)+"-"+ts.substr(4,2)+"-"+ts.substr(6,2)+"&nbsp;"+ts.substr(8,2)+":"+ts.substr(10,2)+":"+ts.substr(12,2)}} </span> </template> <template id='entry-link-template'> <span> <span v-if='entry.ext_url.length>0'><a :href="entry.ext_url" class="external" target="_blank">{{entry.ext_name|decodeEntities|removeTags|miscFixes}}</a></span> <span v-else>{{entry.ext_name|decodeEntities|removeTags|miscFixes}}</span> </span> </template> <template id='entry-list-item-template'> <div v-if='typeof entry != "undefined"' :class='"entry_row"+(editing?" inactive":"")' :entry='entry.id'> <div v-if='rc' style='display:table-cell'> <!-- RECENT CHANGES --> <div class='entry_cell_left'> <timestamp :ts="entry.timestamp" /> </div> <div style='display:table-cell;width:250px;vertical-align:top;'> <span v-if='show_permalink'><router-link :to='"/entry/"+entry.id'>#</router-link> </span> <span v-if='show_catalog && typeof get_catalog(entry.catalog)!="undefined"'><router-link :to='"/catalog/"+entry.catalog'><small>{{get_catalog(entry.catalog).name}}</small></router-link>:</span> <entry-link :entry='entry'></entry_link> <small>({{entry.ext_id|decodeEntities}})</small> </div> <div style='display:table-cell;width:350px;vertical-align:top;'> <div v-if="entry.event_type=='match'"> <span v-if='entry.q==0' tt='not_applicable' style='color:#DFDF00'></span> <span v-else><span tt='matched_to'></span> <wd-link :item='entry.q' :key='entry.q'/></span> </div> <div v-if="entry.event_type=='remove_q'"><span style='color:red' tt='wikidata_was_unlinked'></span></div> </div> <div class='entry_cell_right'> By <userlink :username='entry.username'/> </div> </div> <div v-else :key='entry.id'> <!-- non-RC--> <div> <!-- begin sub-row --> <div v-if='show_checkbox || radio_name' style='display:table-cell;vertical-align:top;width:30px'> <div v-if='show_checkbox'> <input v-if='entry.q==null || entry.user==0' type='checkbox' class='entry-list-item-checkbox' :entry='entry.id' /> </div> <div v-if='radio_name'> <input v-if='entry.q==null || entry.user==0' type='radio' class='entry-list-item-default-entry' :value='entry.id' :name='radio_name' /> </div> </div> <!--left--> <div class='entry_cell_left' @mouseover='showing_permalink=true' @mouseout='showing_permalink=false'> <span v-if='show_permalink && showing_permalink'><router-link :to='"/entry/"+entry.id'>#</router-link> </span> <span v-if='show_catalog && typeof get_catalog(entry.catalog)!="undefined"'><router-link :to='"/catalog/"+entry.catalog'><small>{{get_catalog(entry.catalog).name}}</small></router-link>:</span> <br v-if='twoline'/> <entry-link :entry='entry'></entry_link> </div> <!--middle--> <div class='entry_cell_desc'> {{entry.ext_desc|decodeEntities|removeTags|miscFixes}} <translator :text="entry.ext_desc" :from="wikipediaLanguage()" :to="tt.language"></translator> </div> <!--right--> <div class='entry_cell_right'> <div v-if='entry.q==null'><i tt="not_matched"></i> <catalog-entry-multi-match :entry='entry'></catalog-entry-multi-match> </div> <div v-else-if='entry.user==0'><i tt="auto_matched"></i> <catalog-entry-multi-match :entry='entry'></catalog-entry-multi-match> </div> <div v-else-if='entry.user==3'><i tt="name_date_matcher"></i></div> <div v-else-if='entry.user==4'><i tt="aux_data_matcher"></i></div> <div v-else>By <userlink :username='entry.username'/></div> </div> </div> <!-- new sub-row --> <div style='border-top:1px dotted #DDD'> <div v-if='entry.q===null'> <div v-if='show_checkbox' style='display:table-cell;vertical-align:top;width:30px'></div> <div class='entry_cell_joined' style='font-size:11pt;'> <a target='_blank' class='wikidata' :href='wikidataSearch()' tt='search_wd'></a> | <a v-if='typeof get_catalog(entry.catalog)!="undefined"' target='_blank' class='external' :href='wikipediaSearch()' tt='search_wikipedia' :tt1='get_catalog(entry.catalog).search_wp'></a> | <a target='_blank' class='external' :href='"https://www.google.com/search?q="+getSearchString()+"+site%3Awikipedia.org"' tt='google_wikipedia'></a> | <a target='_blank' class='external' :href='"https://www.google.com/search?q="+getSearchString()+"+site%3Awikidata.org"' tt='google_wikidata'></a> </div> <div class='entry_cell_right'> <div v-if='widar.is_logged_in'> <a href='#' @click.prevent='setUserQ' tt='set_q' class='set_user_q'></a> | <span v-if="canCreateNewWikidataItem()"><a href='#' @click.prevent='newItem' tt='new_item' class='new_item'></a> |</span> <a href='#' @click.prevent='setNA' tt='n_a' class='n_a'></a> </div> </div> </div> <div v-if='entry.q==0'> <div class='entry_cell_joined'><i tt="not_applicable"></i></div> <div class='entry_cell_right'><a href='#' @click.prevent='removeQ' style='color:red' tt="remove"></a></div> </div> <div v-if='entry.q<0'> <div class='entry_cell_joined'><i tt="no_wd"></i></div> <div class='entry_cell_right'><a href='#' @click.prevent='removeQ' style='color:red' tt="remove"></a></div> </div> <div v-if='entry.q>0' :key='entry.q'> <div v-if='show_checkbox' style='display:table-cell;vertical-align:top;width:30px'></div> <div class='entry_cell_left'> <wd-link :item='entry.q' :key='entry.q' smallq=1></wd-link> <small v-if='setq==1' style='white-space: nowrap;'>[<a href='#' @click.prevent='onSetQevent'>↑</a>]</small> </div> <div class='entry_cell_desc'> <wd-desc :autodesc_first='entry.type=="Q5"' :item='entry.q' autodesc_fallback='1'></wd-desc> <span v-if='typeof distance!="undefined"' :style="'color:'+(distance.includes('km')?'#c0392b':'#58d68d')" :tt_title='"distance"'> [{{distance}}]</span> </div> <div class='entry_cell_right'> <span v-if='entry.user==0'> <a href='#' @click.prevent='confirmQ' style='color:green' tt="confirm"></a> </span> <span v-if='entry.user==0 && !hide_remove_on_automatch'> | </span> <span v-if="!hide_remove_on_automatch || entry.user!=0"> <a href='#' @click.prevent='removeQ' style='color:red' tt="remove"></a> </span> <span v-if="!hide_remove_on_automatch && entry.user==0"> [<a href='#' @click.prevent='removeAllQ' style='color:red' tt="remove_all" tt_title='t_remove_all' ></a>] </span> </div> </div> </div> <!-- end sub-row--> </div> <!-- end non-RC--> </div> <!-- end entry_row --> </template> <template id='site-stats-template'> <div style='margin-top:20px'> <catalog-header :catalog="catalog"></catalog-header> <h2 tt='site_stats'></h2> <div v-if="loaded"> <table class='table table-condensed table-striped'> <tbody> <tr v-for='s in sites'> <td><router-link :to="'/missing_articles/'+id+'/'+s.site">{{s.site}}</router-link></td> <td class='num'>{{s.articles}}</td> </tr> </tbody> </table> </div> <div v-else><i tt='loading'></i></div> </div> </template> <template id='missing-articles-template'> <div> <catalog-header :catalog="catalog"></catalog-header> <h2><span tt='missing_articles_on'></span> {{site}}</h2> <div v-if='loaded'> <catalog-list-nav :base="'missing_articles'" :id="id" :mode="site" :max="total" :start="page" :batch="50"></catalog-list-nav> <div><entry-list-item v-for="e in entry_groups[page]" :entry="e" :show_permalink="1" :key="e.id"></entry-list-item></div> <catalog-list-nav :base="'missing_articles'" :id="id" :mode="site" :max="total" :start="page" :batch="50"></catalog-list-nav> </div> <div v-else> <i tt="loading"></i> </div> </div> </template> <template id='entry-details-template'> <div> <div class="card" style="margin-bottom:1em"> <div class="card-block"> <div v-if='random' style='float:right;margin-bottom:5px'> <button class='btn btn-outline-primary load-random-entry' @click.prevent='loadRandomData' tt='next_entry'></button> </div> <h4 class="card-title"> <div style='float:right'><catalog-entry-multi-match :entry='entry'></catalog-entry-multi-match></div> {{entry.ext_name|decodeEntities|removeTags|miscFixes}} <router-link style='font-size:12pt;' :to='"/search/"+filteredName()' tt_title='search'>🔎</router-link> </h4> <div class="card-text"> <table class='table table-striped'> <tbody> <tr v-if='show_catalog'><th nowrap tt='catalog_name'></th><td style='width:100%'> <router-link :to='"/catalog/"+entry.catalog'> {{get_catalog(entry.catalog).name|decodeEntities|removeTags|miscFixes}} </router-link> </td></tr> <tr><th nowrap tt='entry'></th><td style='width:100%'><router-link :to='"/entry/"+entry.id'>{{entry.id}}</router-link></td></tr> <tr><th nowrap tt='catalog_id'></th><td style='width:100%'> <span v-if='entry.ext_url.length>0'><a :href="entry.ext_url" class="external" target="_blank">{{entry.ext_id}}</a></span> <span v-else>{{entry.ext_id}}</span> </td></tr> <tr v-if='typeof entry.aliases!="undefined"'> <th nowrap tt='aliases'></th> <td style='width:100%'> <table class='table table-condensed' style='width:auto'> <tr v-for='a in entry.aliases'> <td> {{a.language}} </td> <td> {{a.label}} </td> </tr> </table> </td> </tr> <tr><th nowrap tt='catalog_desc'></th><td style='width:100%'> {{entry.ext_desc|decodeEntities|removeTags|miscFixes}} <translator :text="entry.ext_desc" :from="catalog.search_wp" :to="tt.language"></translator> </td></tr> <tr v-if='typeof entry.descriptions!="undefined"'> <th tt='descriptions'></th> <td style='width:100%'> <table class='table table-condensed' style='width:auto'> <tr v-for='a in entry.descriptions'> <td> {{a.language}} </td> <td> {{a.label}} </td> </tr> </table> </td> </tr> <tr v-if='entry.type!="" && entry.type!="unknown"'><th nowrap tt='type'></th><td style='width:100%'> <span v-if='(entry.type||"").match(/^Q\d+$/)'> <wd-link :item='entry.type.substr(1)' :key='entry.type' smallq=1/> </span> <span v-else>{{entry.type|decodeEntities|removeTags|miscFixes}}</span> </td></tr> <tr v-if='typeof entry.born!="undefined" || typeof entry.died!="undefined"'> <th nowrap tt='person_dates'></th> <td style='width:100%'> <span v-if='typeof entry.born!="undefined"'>{{entry.born}}</span> &nbsp;&ndash;&nbsp; <span v-if='typeof entry.died!="undefined"'>{{entry.died}}</span> </td> </tr> <tr v-if='typeof entry.lat!="undefined"'> <th nowrap tt='location'></th> <td style='width:100%'> <a :href='"https://tools.wmflabs.org/wikishootme/#lat="+entry.lat+"&lng="+entry.lon+"&zoom=16&layers=commons,mixnmatch,wikidata_image,wikidata_no_image,wikipedia"' target='_blank' class="external"> {{entry.lat}}/{{entry.lon}} </a> </td> </tr> <!-- <tr v-if='typeof entry.image_url!="undefined" && entry.image_url!=""'> <th nowrap tt='external_image'></th> <td style='width:100%'> <img :src='entry.image_url[0]' width='300px' style='max-height:250px;object-fit: contain;' /> </td> </tr> --> <tr v-if='typeof entry.aux!="undefined"'> <th nowrap tt='aux_data'></th> <td style='width:100%'> <div v-for='a in entry.aux' v-if='a.aux_p==18' style='float:right;clear: right'> <commons-thumbnail :filename='a.aux_name' width='300'></commons-thumbnail> </div> <table class='table table-condensed' style='width:auto'> <tr v-for='a in entry.aux'> <td> <wd-link :item='"P"+a.aux_p' :key='"P"+a.aux_p'></wd-link> </td> <td> <span v-if='/^Q\d+$/.test(a.aux_name)'> <wd-link :item='a.aux_name' smallq=1></wd-link> </span> <span v-else> {{a.aux_name}} </span> </td> </tr> </table> </td> </tr> <tr v-if='typeof entry.relation!="undefined"'> <th nowrap tt='relation_data'></th> <td style='width:100%'> <table class='table table-condensed' style='width:auto'> <tr v-for='r in entry.relation'> <td> <wd-link :item='"P"+r.property' :key='"P"+r.property'></wd-link> </td> <td> <router-link :to='"/entry/"+r.id' >{{r.ext_name|decodeEntities|removeTags|miscFixes}}</router-link> <small>{{r.ext_desc|decodeEntities|removeTags|miscFixes}}</small> </td> </tr> </table> </td> </tr> <tr v-if="entry.q!=null"><th tt='matched_to'></th><td> <div style='float:right;text-align:center'> <div v-if='entry.user==0' style='margin-bottom:5px;'><button class='btn btn-outline-success' style='margin-left:20px;' @click.prevent='confirmEntryQ(entry)' tt='confirm'></button></div> <button class='btn btn-outline-danger' style='margin-left:20px;' @click.prevent='removeEntryQ(entry)' tt='remove'></button> </div> <div><wd-link :item='entry.q' :key='entry.q' smallq=1></wd-link></div> <div> <wd-desc :autodesc_first='entry.type=="Q5"' :item='entry.q' autodesc_fallback='1'></wd-desc> <!--<autodesc :item='entry.q' :key='entry.q'/>--> </div> </td></tr> <tr v-if="entry.username!=null && typeof entry.username != 'undefined'"><th tt='matched_by'></th><td><userlink :username="entry.username"/></td></tr> <tr v-if="entry.q!=null"><th tt='timestamp'></th><td><timestamp :ts='entry.timestamp' /></td></tr> </tbody> </table> </div> </div> </div> </div> </template> <template id='random-entry-template'> <div> <div v-if="loaded"> <catalog-header :catalog="get_catalog(entry.catalog)"></catalog-header> <entry-details :entry='entry' :random="1" v-on:random_entry_button_clicked="loadData" :show_catalog='typeof id=="undefined"' ></entry-details> <match-entry :entry='entry'></match-entry> </div> <div v-else> <i tt="loading"></i> </div> </div> </template> <template id='match-entry-template'> <div> <div v-if="entry.q==null"> <div> <!-- Actions --> <div class="card" style="margin-bottom:1em" v-if='widar.is_logged_in'> <div class="card-block"> <h4 class="card-title" tt='enter_q_number'></h4> <div class="card-text"> <input type='text' id='q_input' @keyup.enter="setUserQ" /> <button class='btn btn-outline-primary' @click.prevent='setUserQ' tt='set_q'></button> <button class='btn btn-outline-success' @click.prevent='setUserNew' tt='new_item'></button> <!--<button class='btn btn-outline-warning' @click.prevent='setUserNoWD' tt='no_wikidata_entry'></button>--> <button class='btn btn-outline-danger' @click.prevent='setUserNA' tt='n_a'></button> </div> </div> </div> </div> <div> <!-- Search links --> <div class="card" style="margin-bottom:1em"> <div class="card-block"> <h4 class="card-title" tt='search'></h4> <div class="card-text"> <a target='_blank' class='wikidata' :href='"https://www.wikidata.org/w/index.php?button=&title=Special%3ASearch&search="+encodeURIComponent(entry.ext_name)' tt='search_wd'></a> | <a target='_blank' class='external' :href='wikipediaSearch()' tt='search_wikipedia' :tt1='catalog.search_wp'></a> | <a target='_blank' class='external' :href='"https://www.google.com/search?q="+getSearchString()+"+site%3Awikipedia.org"' tt='google_wikipedia'></a> | <a target='_blank' class='external' :href='"https://www.google.com/search?q="+getSearchString()+"+site%3Awikisource.org"' tt='google_wikisource'></a> | <a target='_blank' class='external' :href='"https://www.google.com/search?q="+getSearchString()+"+site%3Awikidata.org"' tt='google_wikidata'></a> </div> </div> </div> </div> <!-- SPARQL --> <div v-if="loaded_sparql"> <div class="card" style="margin-bottom:1em"> <div class="card-block"> <h4 class="card-title">SPARQL results</h4> <div class="card-text"> <div v-if="wd_entries.length>0" style="max-height:20em;overflow:auto"> <table class="table table-condensed table-striped"> <tbody> <tr v-for="e in sparql_entries"> <td nowrap> <a class='wikidata' target='_blank' :href='e.url'>{{e.id}}</a> [<a href='#' @click.prevent="$event.preventDefault();setEntryQ(entry,e.id);qWasSet();return false" tt_title='manually_set_q'>&uarr;</a>] </td> <td style='width:100%'> <div><b>{{e.label}}</b></div> <div style='font-size:10pt;-family:serif;'> <wd-desc :item='e.id' autodesc_fallback='1'></wd-desc> <!--<autodesc :item='e.id' mode='long'></autodesc>--> </div> </td> </tr> </tbody> </table> </div> </div> </div> </div> </div> <div> <!-- Wikidata search results --> <div class="card" style="margin-bottom:1em"> <div class="card-block"> <h4 class="card-title" tt='wikidata_search_results'></h4> <div class="card-text"> <div v-if="loaded_wd"> <div v-if="wd_entries.length>0" style="max-height:20em;overflow:auto"> <table class="table table-condensed table-striped"> <tbody> <tr v-for="e in wd_entries"> <td nowrap> <a class='wikidata' target='_blank' :href='e.url'>{{e.id}}</a> [<a href='#' @click.prevent="$event.preventDefault();setEntryQ(entry,e.id);qWasSet();return false" tt_title='manually_set_q'>&uarr;</a>] </td> <td style='width:100%'> <div><b>{{e.label}}</b></div> <div style='font-size:10pt;-family:serif;'> <wd-desc :item='e.id.replace(/\D/g,"")' autodesc_fallback='1'></wd-desc> <!--<autodesc :item='e.id.replace(/\D/g,"")' mode='long'></autodesc>--> </div> </td> </tr> </tbody> </table> </div> <div v-else tt='no_matches'></div> </div> <div v-else tt='loading'></div> </div> </div> </div> </div> <div> <!-- Wikipedia search results --> <div class="card" style="margin-bottom:1em"> <div class="card-block"> <h4 class="card-title" tt='wikipedia_search_results' :tt1='catalog.search_wp'></h4> <div class="card-text"> <div v-if="loaded_wp"> <div v-if="wp_entries.length>0" style="max-height:20em;overflow:auto"> <table class="table table-condensed table-striped"> <tbody> <tr v-for="e in wp_entries"> <td><a target="_blank" class="external" :href="'https://'+catalog.search_wp+'.wikipedia.org/wiki/'+encodeURIComponent(e.title.replace(/ /g,'_'))">{{e.title|decodeEntities|removeTags|miscFixes}}</a></td> <td class='wp_search_result_summary'>{{e.snippet|decodeEntities|removeTags|miscFixes}}</td> <td nowrap class="wd_loading" :wp_title="normaliseTitle(e.title)"><i tt='loading'></i></td> </tr> </tbody> </table> </div> <div v-else tt='no_matches'></div> </div> <div v-else tt='loading'></div> </div> </div> </div> </div> <div> <!-- Mix'n'match search results --> <div class="card" style="margin-bottom:1em"> <div class="card-block"> <h4 class="card-title"> <span tt='results_other_catalogs'></span> <span style='font-size:9pt'> [<router-link :to='"/creation_candidates/by_ext_name/?ext_name="+entry.ext_name' tt='creation_candidates'></router-link>] </span> </h4> <div class="card-text"></div> <div v-if='loaded_mnm'> <div v-if="mnm_entries.length>0" style="max-height:20em;overflow:auto"> <entry-list-item v-for="e in mnm_entries" :entry="e" :show_catalog="1" :show_permalink="1" :twoline="1" :key="e.id" setq='1' @onsetq='setEntryQ(entry,$event)'></entry-list-item> </div> <div v-else tt='no_matches'></div> </div> <div v-else tt='loading'></div> </div> </div> </div> </div> <!-- v-if q==null --> </div> </template> <template id='sync-catalog-template'> <div> <catalog-header :catalog="catalog"></catalog-header> <div v-if='loaded'> <div v-if='data.wd_no_mm.length>0'> <div class="card" style="margin-bottom:1em"> <div class="card-block"> <h4 class="card-title" tt='wikidata_connections' :tt1='data.wd_no_mm.length'></h4> <div class="card-text"> <div v-if='update_mnm_status==""'><button class='btn btn-outline-primary' tt='update_mnm' @click.prevent='updateMNM'></button></div> <div v-else-if='update_mnm_status=="updating"'><i tt='updating'></i></div> <div v-else> <div v-if='update_mnm_status=="done"' tt='done'></div> <div v-else>{{update_mnm_status}}</div> <div v-if='update_mnm_result.not_found>0'> {{update_mnm_result.not_found}} IDs from Wikidata not found in Mix'n'match. <div>External IDs not found in MnM (max 100):<br/> <span v-for="id in update_mnm_result.not_found_list" style="margin-right: 1rem;"> <a target="_blank" class="wikidata" :href='"https://www.wikidata.org/w/index.php?search=haswbstatement:\"P"+catalog.wd_prop+"="+id+"\""'>{{id}}</a> </span> </div> </div> <div v-if='update_mnm_result.no_changes_written.length>0'> <h5>{{update_mnm_result.no_changes_written.length}} mismatches between Wikidata and Mix'n'match</h5> <div v-for='d in update_mnm_result.no_changes_written'> <router-link :to='"/entry/"+d.entry.id' >Entry #{{d.entry.id}}</router-link>: Wikidata says <wd-link :item='d.new_q'></wd-link>, Mix'n'match says <wd-link :item='d.entry.q'></wd-link> </div> </div> </div> </div></div></div> </div> <div v-if='mnm2wd.length>0'> <div class="card" style="margin-bottom:1em"> <div class="card-block"> <h4 class="card-title" tt='connections_only_here' :tt1='data.mm_no_wd.length'></h4> <div class="card-text"> <form action="//tools.wmflabs.org/quickstatements/api.php" method="post" target="_blank"> <input type='hidden' name='action' value='import' /> <input type='hidden' name='format' value='v1' /> <input type='hidden' name='temporary' value='1' /> <input type='hidden' name='openpage' value='1' /> <input type="hidden" id="mm_no_wd_list" name="data" :value='mnm2wd'/> <button class='btn btn-outline-primary' tt='update_wikidata' name='yup'></button> </form> </div></div></div> </div> <div v-if='wd_duplicates.length>0'> <div class="card" style="margin-bottom:1em"> <div class="card-block"> <h4 class="card-title" tt='double_on_wd'></h4> <div class="card-text"> <table class='table table-condensed'><tbody> <tr v-for='x in wd_duplicates' v-if="typeof entries[x.id]!='undefined'"> <td> <div style="display:table;width:100%;margin-bottom:10px"><entry-list-item :entry="entries[x.id]" :show_permalink="1"></entry-list-item></div> <div v-for='q in x.qs'> <wd-link :item='q.replace(/\D/g,"")'></wd-link> <span style='font-size:10pt;-family:serif;'> <!--<autodesc v-if='Object.keys(wd_duplicates).length<500' :item='q.replace(/\D/g,"")' mode='long'></autodesc>--> <wd-desc :autodesc_first='entries[x.id].type=="Q5"' v-if='Object.keys(wd_duplicates).length<500' :item='q.replace(/\D/g,"")' autodesc_fallback='1'></wd-desc> <span v-else><i tt='too_many_results_no_autodesc'></i></span> </span> </div> </td> </tr> </tbody></table> </div></div></div> </div> <div v-if='$(data.mm_double).length>0'> <div class="card" style="margin-bottom:1em"> <div class="card-block"> <h4 class="card-title" tt='double_q'></h4> <div class="card-text"> <div v-for='(d,q) in data.mm_double' style='margin-bottom:1em'> <h5><wd-link :item='q'/></h5> <div style="display:table;width:100%"> <span v-if='Object.keys(data.mm_double).length<500'> <entry-list-item v-for="e in d" :entry="entries[e]" :show_permalink="1" :key="entries[e].id"></entry-list-item> </span> <span v-else> <span v-for="(e,idx) in d"> <span v-if='idx>0'>; </span> <wd-link :item='"Q"+e' :key='e'/> </span> <i tt='too_many_results_no_autodesc'></i> </span> </div> </div> </div></div></div> </div> </div> <div v-else><i tt='loading'></i></div> </div> </template> <template id='scraper-template'> <div> <p>This page helps to create an automated web page scraper, to generate and update Mix'n'match catalogs.<br/> The goal is to create a list of URLs, iterate through them, and scrape the respective pages to generate Mix'n'match entries.<br/> <span>[<a href='#' @click.prevent='loadExample()'>See example</a>]</span> </p> <div class="card mb-2"> <div class="card-body"> <h4 class="card-title">Catalog</h4> <h6 class="card-subtitle mb-2 text-muted">Add a scraper to an existing catalog (give ID), or create a new catalog (leave ID empty).<br/> <i>Note: only the original catalog creator can save to an existing catalog, but everyone can add a new one.</i><br/> <i>Note: if you enter the property first and then click another field, some information will be filled in automatically.</i> </h6> <div class="card-text"> <form> <div class="form-group row align-items-center"> <label class="col-sm-2 col-form-label">Catalog ID</label> <div class="col-sm-2"><input type="number" class="form-control" v-model="meta.catalog_id"></div> <div class="col-sm"><small>Leave empty to create a new catalog. If given, other data in this section will be ignored.</small></div> </div> <div class="form-group row align-items-center"> <label class="col-sm-2 col-form-label">Catalog name</label> <div class="col-sm-10"><input type="text" class="form-control" v-model="meta.name"></div> </div> <div class="form-group row align-items-center"> <label class="col-sm-2 col-form-label">Description</label> <div class="col-sm-10"><input type="text" class="form-control" v-model="meta.desc"></div> </div> <div class="form-group row align-items-center"> <label class="col-sm-2 col-form-label">URL</label> <div class="col-sm-8"><input type="text" class="form-control" v-model="meta.url"></div> <div class="col-sm-2"><small>optional</small></div> </div> <div class="form-group row align-items-center"> <label class="col-sm-2 col-form-label">WD property</label> <div class="col-sm-2"><input type="text" class="form-control" v-model="meta.property" @blur="onPropertyChanged"></div> <div class="col-sm-2"><small>optional</small></div> <div class="col-sm-2" tt='type'></div> <div class="col-sm-2"> <select class="custom-select" v-model='meta.type'> <option v-for='group in types' :value='group' :selected='group==meta.type' >{{ucFirst(group)}}</option> </select> </div> <div class="col-sm text-info" v-if='doesCatalogWithPropertyExist()'>A catalog with this property already exists</div> </div> <div class="form-group row align-items-center"> <label class="col-sm-2 col-form-label">Primary language</label> <div class="col-sm-2"><input type="text" class="form-control" v-model="meta.lang"></div> </div> </form> </div> </div> </div> <div class="card mb-2"> <div class="card-body"> <h4 class="card-title">Levels</h4> <div class="card-text"> <p>A URL can be constructed from a static part, and one or more variables, here called <i>levels</i>. Each level can be a defined list of keys (e.g., letters), a range (numeric from-to, plus step size), or follow (get URLs listed on a page and follow them). The last level with be run through, before the level above it (next lower level) ticks ahead, and the higher level resets.<br/> So, if the first level is keys A-Z, and the second is range 1-100 (step size 1), URLs will use A/1, A/2,... A/100, B/1, B/2,... Z/100. </p> <div> <div v-for='(l,level_id) in levels' class='row'> <div class='col-2' style='text-align:right;font-family:Lato,Arial,Courier'>Level {{level_id+1}}<br/>{{l.mode}}</div> <div v-if='l.mode=="keys"' class='col'> <div><textarea style='width:100%' rows='5' @keyup='keysChanged' :level='level_id' placeholder='Keys (e.g., A-Z, one per row)'>{{l.keys.join("\n")}}</textarea></div> <div> Set keys to: <a href='#' @click.prevent='setUcAZ'>A-Z</a> | <a href='#' @click.prevent='setLcAZ'>a-z</a> </div> </div> <div v-if='l.mode=="range"' class='col'> <form> <div class="form-group row"> <label class="col-sm-2 col-form-label">Start</label> <div class="col-sm-10"><input type="number" class="form-control" v-model="l.start"></div> </div> <div class="form-group row"> <label class="col-sm-2 col-form-label">End</label> <div class="col-sm-10"><input type="number" class="form-control" v-model="l.end"></div> </div> <div class="form-group row"> <label class="col-sm-2 col-form-label">Step</label> <div class="col-sm-10"><input type="number" class="form-control" v-model="l.step"></div> </div> </form> </div> <div v-if='l.mode=="follow"' class='col'> <form> <div class="form-group row"> <label class="col-sm-2 col-form-label">URL</label> <div class="col-sm-10 input-with-note"><input type="text" class="form-control" v-model="l.url"><small>A URL pattern with $1 as a placeholder for a partial URL match from the RegEx</small></div> </div> <div class="form-group row"> <label class="col-sm-2 col-form-label">Regex</label> <div class="col-sm-10 input-with-note"><input type="text" class="form-control" v-model="l.rx"><small>Regular expression matching (partial) URLs on a page from the lower levels, as first parameter</small></div> </div> </form> </div> <div v-if='l.mode=="mediawiki"' class='col'> <form> <div class="form-group row"> <label class="col-sm-2 col-form-label">URL</label> <div class="col-sm-10 input-with-note"><input type="text" class="form-control" v-model="l.url"><small>The URL of the API of the MediaWiki installation. Will scrape all entries in article namespace. $1 will have the article title.</small></div> </div> </form> </div> <div class='col-4'> <button class='btn btn-outline-danger' @click='deleteLevel(level_id)'>Delete level</button> <button v-if='level_id>0' class='btn btn-light' @click='moveLevelUp(level_id)'>&uArr;</button> <button v-if='level_id+1<levels.length' class='btn btn-light' @click='moveLevelDown(level_id)'>&dArr;</button> </div> </div> </div> <div> <button class='btn btn-outline-success' @click='addLevel("keys")'>Add keys level</button> <button class='btn btn-outline-success' @click='addLevel("range")'>Add range level</button> <button class='btn btn-outline-success' @click='addLevel("follow")'>Add follow level</button> <button class='btn btn-outline-success' @click='addLevel("mediawiki")'>Add MediaWiki level</button> </div> <div>{{getURLestimate()}}</div> <div v-if='levels.length==0' class='text-danger'>At least one level is required</div> </div> </div> </div> <div v-if='levels.length>0'> <div class="card mb-2"> <div class="card-body"> <h4 class="card-title">Scraper</h4> <h6 class="card-subtitle mb-2 text-muted">Now use the level values to construct the URLs to be scraped, then define block/entry-level regular expressions to get the data</h6> <div class='card-text'> <form> <div class="form-group row"> <label class="col-sm-2 col-form-label">URL pattern</label> <div class="col-sm-10 input-with-note"><input type="text" class="form-control" v-model="scraper.url"><small>A URL pattern, with $1 for the value of level 1, $2 for level 2 etc.</small></div> </div> <div class="form-group row"> <label class="col-sm-2 col-form-label">RegEx block</label> <div class="col-sm-10 input-with-note"> <input type="text" class="form-control" v-model="scraper.rx_block"> <small>Regular expression for blocks of entries, useful for scraping large pages; every part $1 will be used for the entry RegEx below. Optional</small> <div class='text-info' v-if='test_results.status=="OK" && scraper.rx_block!=""'>This regular expression matches {{block_matches}} blocks in the HTML below</div> </div> </div> <div class="form-group row"> <label class="col-sm-2 col-form-label">RegEx entry</label> <div class="col-sm-10 input-with-note"> <input type="text" class="form-control" v-model="scraper.rx_entry"> <small>Regular expression to match one single entry. You can use the matching parts () as $1, $2,... to resolve the Mix'n'match values</small> <div class='text-info' v-if='test_results.status=="OK" && scraper.rx_entry!=""'>This regular expression matches {{internal_results.length}} entries in the HTML below</div> </div> </div> </form> </div> </div> </div> <div class="card mb-2"> <div class="card-body"> <h4 class="card-title">Resolve</h4> <h6 class="card-subtitle mb-2 text-muted">Use $1, $2,... for the parts of RegEx entry, and $L1, $L2,... for the current values of the levels</h6> <div class='card-text'> <div v-for='(r,rid) in scraper.resolve'> <form> <div class="form-group"> <div class="row"> <label class="col-sm-2 col-form-label">{{rid}}</label> <div class="col-sm-10 input-with-note"><input type="text" class="form-control" v-model="r.use"><small>{{note[rid]}}</small></div> </div> <div v-if='typeof r.rx!="undefined"' class='row'> <div class='col-sm-2'></div> <div class='col-sm-10'> <div><small class='text-muted'>Optional: Use one or more regular expressions to "fix up" values; match => replace with</small></div> <div v-for='(rx,rxid) in r.rx' class='row align-items-center'> <div class='col-sm-1' style='text-align:right;font-family:Courier;'>{{rxid+1}}</div> <div class='col-sm-4'><input type='text' class='form-control' v-model='rx[0]' placeholder='The matching pattern' /></div> <div class='col-sm-4'><input type='text' class='form-control' v-model='rx[1]' placeholder='The replacement' /></div> <div class='col-sm-2'> <button class='btn btn-outline-danger' @click.prevent='removeRegex' :rid='rid' :rxid='rxid'>Delete</button> </div> </div> <div><button class='btn btn-outline-success' @click.prevent='addRegex' :rid='rid'>Add regular expression replacement</button></div> </div> </div> </div> </form> </div> </div> </div> </div> <div class="card mb-2"> <div class="card-body"> <h4 class="card-title">Options</h4> <div class="card-text"> <div class="form-check"><label class="form-check-label"><input class="form-check-input" type="checkbox" v-model="options.simple_space">Compress whitespace (spaces, tabs, newlines) to single space before processing <i>(recommended, makes for easier regex)</i></label></div> <div class="form-check"><label class="form-check-label"><input class="form-check-input" type="checkbox" v-model="options.utf8_encode">UTF8-encode <i>(usually not needed)</i></label></div> <!-- <div class="form-check"><label class="form-check-label"><input class="form-check-input" type="checkbox" v-model="options.skip_failed">Ignore pages that don't load, instead of declaring that level done <i>(good for slow/problematic servers)</i></label></div> --> <input class="form-check-input" type="hidden" v-model="options.skip_failed" /> </div> </div> </div> <div class="card mb-2"> <div class="card-body"> <h4 class="card-title">Testing and saving</h4> <div class="card-text"> <div class='mb-2'> <button class='btn btn-outline-success' @click.prevent='testScraper'>Test this scraper</button> <span v-if='can_save_message=="OK"'><button id='save_scraper_button' class='btn btn-outline-primary' @click.prevent='saveScraper'>Save scraper/catalog</button></span> <span v-else>{{can_save_message}}</span> </div> <div v-if='test_results.status==""'></div> <div v-else-if='test_results.status=="RUNNING"'><i>Test is running...</i></div> <div v-else-if='test_results.status=="OK"'> <div v-if='catalog_from_save!=0'> The scraper for <a :href='"https://mix-n-match.toolforge.org/#/catalog/"+catalog_from_save'>this catalog</a> was successfully saved, run can take minutes/hours (days in rare cases). </div> <div> <h6 class="card-title">Test results</h6> <div v-if='typeof test_results.last_url!="undefined"'> <h7>URL used</h7> <a :href='test_results.last_url' class='external' target='_blank'>{{test_results.last_url}}</a> </div> <div> <h7>HTML of page</h7> <textarea style='width:100%;font-family:Courier;font-size:8pt;' rows=5 readonly>{{test_results.html}}</textarea> </div> <div> <h7>Scraped entries</h7> <div>{{test_results.results.length}} entries found on page</div> <div v-if='test_results.results.length>0'> <table class='table table-condensed table-sm table-striped'> <thead><tr><th>ID</th><th>Name</th><th>Description</th><th>Type</th></tr></thead> <tbody> <tr v-for='(r,rid) in test_results.results'> <td> <span v-if='r.url==""'>{{r.id}}</span> <span v-else><a :href='r.url' target='_blank' class='external'>{{r.id}}</a></span> </td> <td>{{r.name}}</td> <td>{{r.desc}}</td> <td>{{r.type}}</td> </tr> </tbody> </table> </div> </div> </div> </div> <div v-else style='color:red'>ERROR: {{test_results.status}}</div> </div> </div> </div> <!-- <div> <h4>JSON [debugging info]</h4> <textarea rows='10' style='width:100%'>{{generateJSON()}}</textarea> </div> </div> --> </div> </template> <template id='download-page-template'> <div> <h2 tt='download_page'></h2> <form> <div class="form-group row"> <label class="col-sm-2 col-form-label" tt="catalogs"></label> <div class="col-sm-10"> <input type='text' class='form-control' v-model='catalogs' tt_placeholder='ph_catalogs' /> </div> </div> <div class="form-group row"> <label class="col-sm-2 col-form-label" tt="columns"></label> <div class="col-sm-10"> <div v-for='(value,colname) in columns' class='row'> <label> <input type='checkbox' v-model='columns[colname]' value='1' /> <span :tt='"col_"+colname'></span> </label> </div> </div> </div> <div class="form-group row"> <label class="col-sm-2 col-form-label" tt="hide_rows"></label> <div class="col-sm-10"> <div v-for='(value,name) in hidden' class='row'> <label> <input type='checkbox' v-model='hidden[name]' value='1' /> <span :tt='"hide_row_"+name'></span> </label> </div> </div> </div> <div class="form-group row"> <label class="col-sm-2 col-form-label" tt="format"></label> <div class="col-sm-10"> <div class='row'> <label v-for='(format_option) in ["tab","json"]' style='margin-right:20px;'> <input type='radio' v-model='format' :value='format_option' /> <span :tt='"download_as_"+format_option'></span> </label> </div> <div class='row'> <label> <input type='checkbox' v-model='as_file' value='1' /> <span tt='download_as_file'></span> </label> </div> </div> </div> </form> <a class='btn btn-outline-primary' target='_blank' :href='generateDownloadURL()' tt='download'></a> </div> </template> <template id="catalog-group-template"> <div> <div> <div style='float:right'> <form class='form'> <select id='select_catalog_group' class="custom-select" v-on:change="setGroupFromSelect"> <option v-for='group in types' :value='group' :selected='group==key'>{{ucFirst(group)}}</option> </select> </form> </div> <span v-if="order=='order_id'" tt='by_id'></span><router-link v-else :to="'/group/'+key+'/order_id'" tt='by_id'></router-link> | <span v-if="order=='order_easy'||typeof order=='undefined'" tt='by_easy'></span><router-link v-else :to="'/group/'+key+'/order_easy'" tt='by_easy'></router-link> | <span v-if="order=='order_alpha'" tt='by_alpha'></span><router-link v-else :to="'/group/'+key+'/order_alpha'" tt='by_alpha'></router-link> <hr/> </div> <div id='slices' v-if=''><catalog-slice v-for="slice in slices" :catalogs="slice.catalogs" :title="slice.title" :section='slice.section' :key="slice.key"></catalog-slice></div> <div v-else><i tt='loading'></i></div> </div> </template> <!-- END TEMPLATES FOR VUE COMPONENTS --> <script src="import_scraper.js"></script> <script src="index_vue.js"></script> </html>

Pages: 1 2 3 4 5 6 7 8 9 10