Skip to end of banner
Go to start of banner

Search and Replace User Macro

Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 6 Current »

## @noparams
#set ( $Integer = 0 )
#set ( $requestedSearch = "" )
#set ( $requestedSearch = $req.getParameter('requestedSearch') )
#set ( $requestedSpaces = "" )
#set ( $requestedSpaces = $req.getParameter('requestedSpaces') )
#set ( $replace = "" )
#set ( $replace = $req.getParameter('replace') )
#set ( $requestedReplace = "" )
#set ( $requestedReplace = $req.getParameter('requestedReplace') )
#set ( $continue = "" )
#set ( $continue = $req.getParameter('continue') )
#set ( $escapedRequestedSearch = $generalUtil.escapeXml($requestedSearch) )
#set ( $escapedRequestedReplace = $generalUtil.escapeXml($requestedReplace) )
#set ( $requestCharacter = "?" )
#if ( $content.getUrlPath().contains("?") )
  #set ( $requestCharacter = "&" )
#end
<script>
  var qs = (function(a) {
    if (a == "") return {};
    var b = {};
    for (var i = 0; i < a.length; ++i) {
      var p=a[i].split('=', 2);
      if (p.length == 1)
        b[p[0]] = "";
      else
        b[p[0]] = decodeURIComponent(p[1].replace(/\+/g, " "));
    }
    return b;
  })(window.location.search.substr(1).split('&'));
  
  function htmlEncode( html ) {
    return document.createElement( 'a' ).appendChild( document.createTextNode( html ) ).parentNode.innerHTML;
  };
</script>
#if ( $requestedSearch == "" )
  <form class="aui top-label" onsubmit="return false;">
    <div class="field-group top-label">
      <label for="requested-search">Enter Search Terms:</label> 
      <input id="requested-search" class="text long-field" type="text" name="requestedSearch">
    </div>
    <div class="field-group">
      <input id="replace" type="checkbox" onclick="jQuery('#requested-replace').val('');jQuery('#replace-fields').toggle();">
      <span>Do Search/Replace</span>
    </div>
    <div class="field-group" id="replace-fields" style="display:none;">
      <label for="requested-replace">Text to replace:</label> 
      <input id="requested-replace" class="text long-field" type="text" name="requestedReplace">
    </div>
    <script> jQuery(function() { if (document.getElementById('replace').checked) { jQuery('#replace-fields').show(); } }); </script> ## show replace field if user hits back button
    <div class="field-group">
      <label for="requestedSpaces">Spaces to search:</label>
      <select class="select" id="requestedSpaces" name="requestedSpaces" multiple>
      #set ( $allSpaces = $spaceManager.getAllSpaces() )
      #foreach ( $space in $allSpaces )
        #if ( $space.isGlobal() )
          <option value="$space.key">$space.name - $space.key</option>
        #end
      #end
    </div>
    <button class="button submit" onclick="window.location = '$content.getUrlPath()' + '${requestCharacter}requestedSearch=' + encodeURIComponent(document.getElementById('requested-search').value) + '&requestedSpaces=' + jQuery('#requestedSpaces').select2('val').join() + '&replace=' + jQuery('#replace').is(':checked') + '&requestedReplace=' + encodeURIComponent(document.getElementById('requested-replace').value);">Search</button>
  </form>
  <script>
    jQuery("#requestedSpaces").auiSelect2();
  </script>
#elseif ( $requestedSearch != "" && $replace == "false" )
  #set ( $searchTerm = $requestedSearch )
  #foreach ( $spaceKey in $requestedSpaces.split(",") )
    #set ( $space = $spaceManager.getSpace($spaceKey) )
    <p> Pages containing &quot;${escapedRequestedSearch}&quot; in $space.name </p>
    #set ( $spacePages = $pageManager.getPages($space, true) )
    <table>
      <thead>
        <tr>
          <th>
            <p>Page</p>
          </th>
          <th>
          </th>
        </tr>
      </thead>
      <tbody>
      #foreach ($page in $spacePages)
        #set ( $pageId = $page.id )
        #set ( $pageMarkup = $page.getBodyAsString() )
        #if ( $permissionHelper.canView($action.remoteUser, $page) && $pageMarkup.contains($searchTerm) )
          #set ( $quoteEscapedPageMarkup = $pageMarkup.replaceAll($generalUtil.urlDecode("%22"), "&quot;") )
          <tr>
            <td>
              <p><a href="$action.getGlobalSettings().getBaseUrl()$page.getUrlPath()" target="_blank">$page.title</a></p>
              <input style="display:none;" class="page-checkbox" type="checkbox" id="page-$pageId" original="$quoteEscapedPageMarkup">
            </td>
            <td>
              <button id="preview${pageId}" class="aui-button">Preview</button>
              <button class="aui-button" onclick="window.open(contextPath + '/pages/editpage.action?pageId=$pageId', '_blank');">Edit</button>
              <script>
                var dialog${pageId} = new AJS.Dialog({
                    width: 840, 
                    height: 640, 
                    id: "dialog${pageId}", 
                    closeOnOutsideClick: true
                });
                dialog${pageId}.addHeader("Preview");
                
                var originalMarkup = jQuery("#page-${pageId}").attr("original");
                var originalMarkupArray = originalMarkup.split(jQuery('<textarea/>').html(qs["requestedSearch"]).text());
                var previewMarkup = jQuery('<pre style="white-space: pre-wrap;white-space: -moz-pre-wrap;white-space: -pre-wrap;white-space: -o-pre-wrap;word-wrap: break-word;"></pre>');
                var replaceElement = '<span style="background-color: #ddfade;">' + htmlEncode(qs["requestedSearch"]) + '</span>';
                jQuery.each( originalMarkupArray, function(i, val) {
                  jQuery(previewMarkup).append(jQuery('<span>' + htmlEncode(val) + '</span>' + replaceElement));
                });
                jQuery('span', previewMarkup).last().remove();
                dialog${pageId}.addPanel("SinglePanel", previewMarkup, "singlePanel");
                
                dialog${pageId}.addButton("Close", function (dialog${pageId}) {
                    dialog${pageId}.hide();
                });
                jQuery("#preview${pageId}").click(function() {
                    dialog${pageId}.gotoPage(0);
                    dialog${pageId}.gotoPanel(0);
                    dialog${pageId}.show();
                });
              </script>
            </td>
          </tr>
        #end
      #end
      </tbody>
    </table>
  #end
  <p> </p>
  <button class="aui-button" onclick="window.location = '$content.getUrlPath()'">New Search</button>
#elseif ( $requestedSearch != "" && $replace == "true" && $continue == "" )
  <button class="aui-button" onclick="jQuery('.page-checkbox').prop('checked', true);">Select All</button>
  <button class="aui-button" onclick="jQuery('.page-checkbox').prop('checked', false);">Select None</button>
  #set ( $searchResultCount = 0 )
  #set ( $searchTerm = $requestedSearch )
  #foreach ( $spaceKey in $requestedSpaces.split(",") )
    #set ( $space = $spaceManager.getSpace($spaceKey) )
    <p> Pages containing &quot;${escapedRequestedSearch}&quot; in $space.name </p>
    #set ( $spacePages = $pageManager.getPages($space, true) )
    <table>
      <thead>
        <colgroup> ## To prevent table from being sortable
        </colgroup>
        <tr>
          <th>
            <p>Page</p>
          </th>
          <th>
            <button class="aui-button" onclick="jQuery('.page-checkbox[space=\'$space.key\']').click();">X</button>
          </th>
          <th>
          </th>
        </tr>
      </thead>
      <tbody>
      #foreach ($page in $spacePages)
        #set ( $pageId = $page.id )
        #set ( $pageMarkup = $page.getBodyAsString() )
        #if ( $permissionHelper.canView($action.remoteUser, $page) && $pageMarkup.contains($searchTerm) )
          #set ( $searchResultCount = $searchResultCount + 1 )
          <tr>
            <td>
              <p><a href="$action.getGlobalSettings().getBaseUrl()$page.getUrlPath()" target="_blank">$page.title</a></p>
            </td>
            <td>
              #if ( $permissionHelper.canEdit($action.remoteUser, $page) )
                #set ( $replacedPageMarkup = $pageMarkup.replaceAll($requestedSearch, $requestedReplace) )
                #set ( $newPageMarkup = $replacedPageMarkup.replaceAll($generalUtil.urlDecode("%22"), "&quot;") ) ## %22 = "
                #set ( $newPageMarkup = $newPageMarkup.replaceAll("&nbsp;", " ") ) ## because of some sort of bug where &nbsp; is replaced with Â
                #set ( $quoteEscapedPageMarkup = $pageMarkup.replaceAll($generalUtil.urlDecode("%22"), "&quot;") )
                <input class="page-checkbox unchanged" type="checkbox" id="page-$pageId" pageid="$pageId" version="$page.version" title="$page.title" parent="$page.parent.id" space="$space.key" content="$newPageMarkup" original="$quoteEscapedPageMarkup" checked="checked">
                <span class="aui-lozenge">unchanged</span>
              #else
                <span class="aui-lozenge aui-lozenge-current">cannot edit</span>
              #end
            </td>
            <td>
              <button id="preview${pageId}" class="aui-button">Preview</button>
              <button class="aui-button" onclick="window.open(contextPath + '/pages/editpage.action?pageId=$pageId', '_blank');">Edit</button>
              <button style="display:none;" id="undo-${pageId}" class="aui-button" onclick="window.open(contextPath + '/pages/revertpagebacktoversion.action?pageId=${pageId}&version=$page.version', '_blank');">Undo</button>
              <script>
                var dialog${pageId} = new AJS.Dialog({
                    width: 840, 
                    height: 640, 
                    id: "dialog${pageId}", 
                    closeOnOutsideClick: true
                });
                dialog${pageId}.addHeader("Preview");
                
                var originalMarkup = jQuery("#page-${pageId}").attr("original");
                var originalMarkupArray = originalMarkup.split(jQuery('<textarea/>').html(qs["requestedSearch"]).text());
                var previewMarkup = jQuery('<pre style="white-space: pre-wrap;white-space: -moz-pre-wrap;white-space: -pre-wrap;white-space: -o-pre-wrap;word-wrap: break-word;"></pre>');
                var replaceElement = '<span style="background-color: #ddfade;">' + htmlEncode(qs["requestedReplace"]) + '</span>';
                if (qs["requestedReplace"] === "") { replaceElement = '<span style="background-color: #ddfade;">[blank]</span>' } ## so there is something to show if replacement field is blank
                jQuery.each( originalMarkupArray, function(i, val) {
                  jQuery(previewMarkup).append(jQuery('<span>' + htmlEncode(val) + '</span>' + replaceElement));
                });
                jQuery('span', previewMarkup).last().remove();
                dialog${pageId}.addPanel("SinglePanel", previewMarkup, "singlePanel");
                
                dialog${pageId}.addButton("Close", function (dialog${pageId}) {
                    dialog${pageId}.hide();
                });
                jQuery("#preview${pageId}").click(function() {
                    dialog${pageId}.gotoPage(0);
                    dialog${pageId}.gotoPanel(0);
                    dialog${pageId}.show();
                });
              </script>
            </td>
          </tr>
        #end
      #end
      </tbody>
    </table>
  #end
  <p> Found $searchResultCount results.  You are about to replace &quot;${escapedRequestedSearch}&quot; with &quot;${escapedRequestedReplace}&quot; on all selected pages.  Continue? </p>
  <p> </p>
  <button class="aui-button" onclick="replaceText()">Continue</button>
  <button class="aui-button" onclick="window.location = '$content.getUrlPath()'">New Search</button>
  <script>
    function replaceText(){searchReplace(jQuery(".page-checkbox.unchanged:checked").first())}
function searchReplace(a){var c=[],b={};b.id=jQuery(a).attr("pageid");b.version=jQuery(a).attr("version");b.title=jQuery(a).attr("title");b.space=jQuery(a).attr("space");b.content=jQuery(a).attr("content");b.parentId=jQuery(a).attr("parent");c.push(b);jQuery.ajax({dataType:"json",contentType:"application/json",type:"POST",url:contextPath+"/rpc/json-rpc/confluenceservice-v2/storePage",data:JSON.stringify(c),success:function(c){c.hasOwnProperty("id")?(jQuery(a).removeClass("unchanged").addClass("changed"),
jQuery(a).next().removeClass("aui-lozenge-current").removeClass("aui-lozenge-error").addClass("aui-lozenge-complete").html("updated"),jQuery("#undo-"+b.id).show(),a=jQuery("input[type='checkbox'].page-checkbox.unchanged:checked").first()):(jQuery(a).removeClass("unchanged").addClass("error"),jQuery(a).next().removeClass("aui-lozenge-complete").removeClass("aui-lozenge-current").addClass("aui-lozenge-error").html("error"),console.log(c),a=jQuery(".page-checkbox.unchanged:checked").first());0<a.length&&
searchReplace(a)}})};
  </script>
#end
  • No labels