Greasy Fork is available in English.

TISWAS

Lists all turn instructions defined within the current map view

このスクリプトの質問や評価の投稿はこちら通報はこちらへお寄せください。
// ==UserScript==
// @name                TISWAS
// @namespace           http://greasemonkey.chizzum.com
// @description         Lists all turn instructions defined within the current map view
// @include             https://*.waze.com/*editor*
// @include             https://editor-beta.waze.com/*
// @include             https://beta.waze.com/*
// @exclude             https://www.waze.com/user/*editor/*
// @exclude             https://www.waze.com/*/user/*editor/*
// @grant               none
// @version             0.5
// ==/UserScript==

/* JSHint Directives */
/* globals W: true */
/* globals trustedTypes: */
/* jshint bitwise: false */
/* jshint eqnull: true */
/* jshint esversion: 11 */

const TISWAS =
{
   graphEntries: [],

   ModifyHTML: function(htmlIn)
   {
      if(typeof trustedTypes === "undefined")
      {
         return htmlIn;
      }
      else
      {
         const escapeHTMLPolicy = trustedTypes.createPolicy("forceInner", {createHTML: (to_escape) => to_escape});
         return escapeHTMLPolicy.createHTML(htmlIn);
      }
   },
   AddEventListener: function(elm,eventType,eventFn,eventBool)
   {
      try
      {
         document.getElementById(elm).addEventListener(eventType, eventFn, eventBool);
      }
      catch(err)
      {
         TISWAS.AddLog('AddEventListener() - '+elm+' not found!');
      }
   },
   AddLog: function(logtext)
   {
      console.log('TISWAS: '+Date()+' '+logtext);
   },
   RegexContains: function(text, contains)
   {
      let retval = false;
      let re = RegExp(contains, 'i');
      if(text.search(re) != -1)
      {
         retval = true;
      }
      return retval;
   },

   GraphEntry: function(segID, es, rs, t, vi)
   {
      this.segID = segID;
      this.es = es;
      this.rs = rs;
      this.t = t;
      this.vi = vi;
   },
   StripShieldIDs: function(textIn)
   {
      let retval = "";

      if(textIn !== null)
      {
         while(textIn.indexOf("$RS") !== -1)
         {
            let start = textIn.indexOf("$RS");
            let end = textIn.indexOf(" ", start);
            if(end === -1)
            {
               textIn = textIn.slice(0, start);
            }
            else
            {
               textIn = textIn.slice(0, start) + textIn.slice(end + 1);
            }
         }
         retval = textIn;
      }

      return retval;
   },
   PushGraphEntry: function(e)
   {
      for(let i in e)
      {
         if(e.hasOwnProperty(i))
         {
            let tg = e[i].turnGuidance;
            if(tg !== null)
            {
               let segID = i;
               segID = segID.replace("f","");
               segID = segID.replace("r","");

               let es = [];
               let rs = [];
               let t = "";
               let vi = "";

               if(tg.exitSigns !== null)
               {
                  for(let j = 0; j < tg.exitSigns.length; ++j)
                  {
                     es.push(TISWAS.StripShieldIDs(tg.exitSigns[j].text));
                  }
               }
               if(tg.roadShields !== null)
               {
                  for(let j in tg.roadShields)
                  {
                     if(tg.roadShields.hasOwnProperty(j))
                     {
                        rs.push(TISWAS.StripShieldIDs(tg.roadShields[j].direction));
                     }
                  }
               }
               if(tg.towards !== "")
               {
                  t = TISWAS.StripShieldIDs(tg.towards);
               }
               if(tg.visualInstruction !== null)
               {
                  vi = TISWAS.StripShieldIDs(tg.visualInstruction);
               }

               let entry = new TISWAS.GraphEntry(segID, es, rs, t, vi);
               TISWAS.graphEntries.push(entry);
            }
         }
      }
   },
   SegSelect: function(e)
   {
      let segID = e.currentTarget.attributes.tag.value;
      let segObj = W.model.segments.objects[segID];
      let segCenter = segObj.attributes.geometry.getBounds().getCenterLonLat();
      W.selectionManager.setSelectedModels(segObj);
      W.map.setCenter(segCenter);
   },
   FormatTI: function(ge, idx, useFilter, contains)
   {
      let showTI;
      if(useFilter === false)
      {
         showTI = true;
      }
      else
      {
         showTI = false;
      }

      let innerHTML = '<b>Seg: ' + ge.segID + '</b><br>';
            
      if(ge.es.length !== 0)
      {
         innerHTML += '&nbsp;ES: ';
         for(let j = 0; j < ge.es.length; ++j)
         {
            innerHTML += ge.es[j] + ' ';
         }
         innerHTML += '<br>';
      }

      if(ge.rs.length !== 0)
      {
         innerHTML += '&nbsp;RS: ';
         for(let j = 0; j < ge.rs.length; ++j)
         {
            innerHTML += ge.rs[j] + ' ';
            if(useFilter === true)
            {
               showTI = showTI || TISWAS.RegexContains(ge.rs[j], contains);
            }
         }
         innerHTML += '<br>';
      }

      if(ge.t !== "")
      {
         innerHTML += '&nbsp;T: ' + ge.t + '<br>';
         if(useFilter === true)
         {
            showTI = showTI || TISWAS.RegexContains(ge.t, contains);
         }
      }

      if(ge.vi !== "")
      {
         innerHTML += '&nbsp;VI: ' + ge.vi + '<br>';
         if(useFilter === true)
         {
            showTI = showTI || TISWAS.RegexContains(ge.vi, contains);
         }
      }

      let resHTML = '<div id="_tdiv-' + idx + '" tag="' + ge.segID + '" style="padding:2px; margin:6px; cursor:pointer;';
      if(showTI === false)
      {
         resHTML += ' display:none;';
      }
      resHTML += '">';
      resHTML += innerHTML;
      resHTML += '</div>';

      return resHTML;
   },
   DisplayTIs: function()
   {
      let resHTML = '';
      let filterEnabled = document.querySelector('#_tisEnableFilter').checked;
      let filterContains = document.querySelector('#_tisContains').value;

      for(let i = 0; i < TISWAS.graphEntries.length; ++i)
      {
         let ge = TISWAS.graphEntries[i];
         resHTML += TISWAS.FormatTI(ge, i, filterEnabled, filterContains);
      }
      return resHTML;
   },
   UpdateList: function()
   {
      let resHTML = '';
      let nEntries = 0;

      if(W.map.getZoom() >= 17)
      {
         nEntries = TISWAS.graphEntries.length;

         if(nEntries > 0)
         {
            resHTML += TISWAS.DisplayTIs();
         }
         else
         {
            resHTML += "No TIs here...";
         }
      }
      else
      {
         resHTML += "TIs only available at zoom 17+";
      }
      document.querySelector('#_tisOutput').innerHTML = TISWAS.ModifyHTML(resHTML);

      if(nEntries > 0)
      {
         for(let i = 0; i < nEntries; ++i)
         {
            let linkID = "_tdiv-" + i;
            TISWAS.AddEventListener(linkID, "click", TISWAS.SegSelect, true);
         }
      }
   },
   SurfaceTIs: function()
   {
      TISWAS.graphEntries = [];

      if(W.map.getZoom() >= 17)
      {
         W.model.turnGraph.reverseAdjacencyList.forEach(TISWAS.PushGraphEntry);
      }

      TISWAS.UpdateList();
   },

   PopulateUI: function()
   {
      var iHTML = '';
      iHTML += '<div id="_tisControl">';
      iHTML += '<input type="checkbox" id="_tisEnableFilter">Filter: </input>';
      iHTML += '<input type="text" style="font-size:14px; line-height:16px; height:22px; margin-bottom:4px;" id="_tisContains">';
      iHTML += '</div>';

      iHTML += '<div id="_tisOutput" />';
   
      return iHTML;
   },
   Initialise: function()
   {
      TISWAS.AddLog("Initialise");
      if(document.getElementsByClassName("sandbox").length > 0)
      {
         TISWAS.AddLog('WME practice mode detected, script is disabled...');
         return;
      }
      if(document.location.href.indexOf('user') !== -1)
      {
         TISWAS.AddLog('User profile page detected, script is disabled...');
         return;
      }
   
      TISWAS.WaitForW();
   },
   WaitForW: function()
   {
      if(window.W === undefined)
      {
         window.setTimeout(TISWAS.WaitForW, 100);
         return;
      }
   
      if (W.userscripts?.state?.isReady)
      {
         TISWAS.AddTab_API();
      } 
      else 
      {
         document.addEventListener("wme-ready", TISWAS.AddTab_API, {once: true});
      }
   },
   AddTab_API: async function()
   {
      TISWAS.AddLog("Registering with sidepanel...");
      let {tabLabel, tabPane} = W.userscripts.registerSidebarTab("TISWAS");
      tabLabel.innerText = "TISWAS";
      tabPane.innerHTML = TISWAS.ModifyHTML(TISWAS.PopulateUI());
      await W.userscripts.waitForElementConnected(tabPane);
      TISWAS.CompleteUISetup();
   },
   CompleteUISetup: function()
   {
      W.map.events.register("moveend", null, TISWAS.SurfaceTIs);
      W.map.events.register("zoomend", null, TISWAS.SurfaceTIs);
      TISWAS.AddEventListener("_tisEnableFilter", "change", TISWAS.UpdateList, true);
      TISWAS.AddEventListener("_tisContains", "keyup", TISWAS.UpdateList, true);
   }
};
TISWAS.Initialise();