WME Change RUS NameStreet for Belarus

Замена ул на улица и т.д при вставке в поле ввода.

// ==UserScript==
// @name         WME Change RUS NameStreet for Belarus
// @version      0.17
// @description  Замена ул на улица и т.д при вставке в поле ввода.
// @author       ixxvivxxi
// @include      https://*.waze.com/editor*
// @include      https://*.waze.com/*/editor*
// @include      https://*.waze.com/map-editor*
// @include      https://*.waze.com/beta_editor*
// @grant        none
// @namespace    https://greasyfork.org/ru/scripts/10613-wme-change-rus-namestreet-for-belarus
// ==/UserScript==



function replace_status(streetname) {

  streetname = streetname.replace('ул.', 'улица ')
                .replace(/^ул[ ]/, 'улица ')
                .replace(/[ ]ул$/, ' улица')
                .replace('пер.', 'переулок ')
                .replace(/^пер[ ]/, 'переулок ')
                .replace(/[ ]пер$/, ' переулок')
                .replace('просп.', 'проспект')
                .replace(/^просп[ ]/, 'проспект ')
                .replace(/[ ]просп$/, ' проспект')
                .replace('пр-т.', 'проспект')
                .replace(/^пр-т[ ]/, 'проспект ')
                .replace(/[ ]пр-т$/, ' проспект')
                .replace('пр-д.', 'проезд')
                .replace(/^пр-д[ ]/, 'проезд ')
                .replace(/[ ]пр-д/, ' проезд')
                .replace('пл.', 'площадь')
                .replace(/^пл[ ]/, 'площадь ')
                .replace(/[ ]пл$/, ' площадь')
                .replace('ш.', 'шоссе')
                .replace(/^б-р[ ]/, 'бульвар ')
                .replace(/[ ]б-р$/, ' бульвар')
                .replace(/^тр-т[ ]/, 'тракт ')
                .replace(/[ ]тр-т$/, ' тракт')
                .replace('вул.', 'вуліца')
                .replace(/^вул[ ]/, 'вуліца ')
                .replace(/[ ]вул$/, ' вуліца')
                .replace(/^зав[ ]/, 'завулак ')
                .replace(/[ ]зав$/, ' завулак')
                .replace(/^прасп[ ]/, 'праспект ')
                .replace(/[ ]прасп$/, ' праспект')
                .replace('туп.', 'тупик ')
                .replace('м-н.', 'микрорайон ')
                .replace('сп.', 'спуск ')
                .replace(/^На[ ]/, 'на ');

  streetname = streetname.replace(/^[ ](?=[0-9а-яА-Я])/, '').replace(/[ ]+/g, ' ');

  streetname = streetname.replace(/-ая/, '-я')
                .replace(/-ой/, '-й');

  streetname = streetname.replace('Я.Коласа', 'Якуба Коласа')
                .replace('Я. Коласа', 'Якуба Коласа')
                .replace('Я.Купалы', 'Янки Купалы')
                .replace('Я. Купалы', 'Янки Купалы')
                .replace('Ф.Скорины', 'Франциска Скорины')
                .replace('Ф. Скорины', 'Франциска Скорины')
                .replace('Б.Хмельницкого', 'Богдана Хмельницкого')
                .replace('Б. Хмельницкого', 'Богдана Хмельницкого');

  return streetname;
}

function changeName(streetname) {
  var reg = /^[РрНнМмPpHM]-?([0-9])*$/;
    if (reg.test(streetname)) {
        return correctName(streetname);
    } else {
        return replaceParts(streetname);
    }
}

function correctName(streetname) {
    streetname = streetname.replace('р', 'Р').replace('н', 'Н').replace('м', 'М').replace('P', 'Р').replace('p', 'Р').replace('H', 'Н').replace('M', 'М');

    if (streetname.search('-') == -1) {
        streetname = streetname.substring(0, 1) + '-' + streetname.substring(1, streetname.lenth);
    }
    return streetname;
}

function replaceParts(streetname) {
  var arr = streetname.split(' '),
      finalarr = [],
      status = -1,
      number = -1,
      i2 = 0,
      pseudoStatus = false;

  //var withStatus = false;
  for (var i = 0; i < arr.length; i++) {

     if (isStatus(arr[i])) {
       if (arr[i] == 'шоссе' || arr[i] === 'тракт' || arr[i] === 'площадь' || arr[i] === 'шаша'  || arr[i] === 'плошча' || arr[i] === 'спуск' || arr[i] === 'въезд') {
         pseudoStatus = true;
         finalarr[i2]=arr[i];
         i2++;
       } else {
         status = i;
       }
     } else if (isNumber(arr[i])) {
       if (i>0 && arr[i-1].toLowerCase() === 'героев') {
          finalarr[i2]=arr[i];
          i2++;
       } else {
          number = i;
       }

       // console.log("Номер", i);
     } else {
       finalarr[i2]=arr[i];
       i2++;
     }
  }

  if (status !== -1) {
    finalarr.splice(0,0,arr[status]);
  } else if (streetname !== '' && streetname !== 'Железная дорога' && !pseudoStatus && !streetname.startsWith('на')) {
    $('#sidebar .primary-street').append('<div class="bel_message" style="color:red;font-weight:bold">Необходимо добавить статусную часть!</div>');
  }

  if (number != -1) {
    finalarr[finalarr.length] = arr[number];
  }

  streetname = finalarr.join(' ');
  return streetname;
}

function isStatus(partName) {
  switch (partName) {
    case 'улица':
      return true;
    case 'переулок':
      return true;
    case 'проспект':
      return true;
    case 'проезд':
      return true;
    case 'площадь':
      return true;
    case 'шоссе':
      return true;
    case 'бульвар':
      return true;
    case 'тракт':
      return true;
    case 'тупик':
      return true;
    case 'спуск':
      return true;
    case 'въезд':
      return true
    case 'вуліца':
      return true;
    case 'завулак':
      return true;
    case 'праспект':
      return true;
    case 'праезд':
      return true;
    case 'плошча':
      return true;
    case 'шаша':
      return true;
    default:
      return false;
  }
}

function isNumber(number) {
  var reg = /([0-9])-[іыйя]/;
  switch (true) {
    case reg.test(number):
      return true;
    default:
      return false;
  }
}

$('#sidebar').on('input', '.street-name', function() {
  $('.bel_message').remove();
  var newstr = replace_status($(this).val());
  if ($(this).val() != newstr) {
    $(this).val(newstr);
  }
});

$('#sidebar').on('change', '.street-name', function() {
  $('.bel_message').remove();
  var newstr = replace_status($(this).val());
  if ($(this).val() != newstr) {
    $(this).val(newstr);
  }
});

$('#sidebar').on('focus', '.street-name', function() {
  $('.bel_message').remove();
  var newstr = replace_status($(this).val());
  newstr = changeName(newstr);
  $(this).val(newstr);
});

$('#sidebar').on('focusout', '.street-name', function() {
  $('.bel_message').remove();
  var newstr = replace_status($(this).val());
  newstr = changeName(newstr).trim();
  $(this).val(newstr);
});