/**
   * 批量修改图片sel文件名,复制的方式拷贝到同级目录下的sel文件夹中 <br>
   * 修改成功后请再使用batchCreateSelFiles方法生成对应的sel.xml文件
   *
   * @param normalPath normal普通状态图片的文件夹
   * @param specialPath 特殊状态(pressed按下/checked选中)图片的文件夹
   * @param pre 需要添加的前缀
   * @param end 特殊状态(pressed按下/checked选中)后缀名
   */
  public static void batchRenameSelFiles(
      String normalPath, String specialPath, String pre, String end) {
    String savePath = normalPath.substring(0, normalPath.lastIndexOf("\\"));
    File saveDir = new File(savePath, "sel");
    if (!saveDir.exists()) {
      saveDir.mkdirs();
    }

    List<File> files = FileUtils.getAllFiles(normalPath);
    for (File file : files) {
      String fileName = pre + "_" + file.getName();
      fileName = fileName.replace(" ", "_").toLowerCase(Locale.CHINESE);

      File nFile = new File(saveDir, fileName);
      //			file.renameTo(nFile); // rename 直接移动文件,我们希望是复制并重命名
      FileUtils.copyFileByChannel(file, nFile);
    }
    List<File> filePresses = FileUtils.getAllFiles(specialPath);
    for (File file : filePresses) {
      String[] nameMap = FileUtils.getNameMap(file);

      String fileName = pre + "_" + nameMap[0] + "_" + end + nameMap[1];
      fileName = fileName.replace(" ", "_").toLowerCase(Locale.CHINESE);

      File nFile = new File(saveDir, fileName);
      //			file.renameTo(nFile); // rename 直接移动文件,我们希望是复制并重命名
      FileUtils.copyFileByChannel(file, nFile);
    }
  }
 /**
  * 批量生成sel的xml文件 <br>
  * 比如图片名字是ic_img.png和按下的ic_img_pressed.png,那么最终生成的就是封装好的ic_img_sel.xml
  *
  * @param path 包含全部图片的文件路径
  * @param end 特殊状态(pressed按下/checked选中)后缀名
  */
 public static void batchCreateSelFiles(String path, String end) {
   List<File> files = FileUtils.getAllFiles(path);
   for (File file : files) {
     String fileName = FileUtils.getName(file);
     // 用normal状态的图片名生成对应的_sel.xml文件
     if (!fileName.endsWith(end)) {
       Document doc = createSelector(fileName, fileName + "_" + end, end);
       //				fileName + "_" + end
       File nFile = new File(path, fileName + "_sel.xml");
       XmlUtil.write2xml(nFile, doc);
     }
   }
 }
 public static void relaceLayoutViewNames(
     String proPath, List<String> tarList, String replacement) {
   List<File> allFiles = FileUtils.getAllFiles(proPath);
   for (File file : allFiles) {
     // 如果是xml文件,且在layout..目录下,则视为布局文件
     if (file.getName().endsWith(".xml") && file.getParentFile().getName().startsWith("layout")) {
       Document document = XmlUtil.read(file);
       boolean hasReplace = XmlUtil.replaceElementName(document, tarList, replacement);
       if (hasReplace) {
         XmlUtil.write2xml(file, document);
       }
     }
   }
 }
  /**
   * 删除无用的src文件
   *
   * @param rootPath 根目录的绝对路径
   */
  public static void delNoUseSrcFile(String rootPath) {
    List<File> files = FileUtils.getAllFiles(rootPath);
    out:
    for (File file : files) {
      String name = file.getName();
      // 只需要删除src包下的文件
      if (!file.getPath().contains("\\src\\")) {
        continue;
      }

      for (File compareFile : files) {
        String compareName = compareFile.getName();
        if (name.equals(compareName)) {
          // 自己跟自己不匹配
          continue;
        }

        // 只需要对比src包和layout包下的文件
        if (!compareFile.getPath().contains("\\src\\")
            && !compareFile.getPath().contains("\\layout")) {
          continue;
        }

        if (!compareFile.exists()) {
          continue;
        }

        // 如果对比文件的本文内容中包含文件名,则视为有使用
        String fileContent = FileUtils.readToString(compareFile);
        if (fileContent.contains(FileUtils.getName(file))) {
          continue out;
        }
      }

      // 删除没使用过的文件
      String absname = file.getAbsoluteFile().getName();
      boolean delete = file.delete();
      System.out.println(absname + " ... delete=" + delete);
    }
  }
  /**
   * 将参数值抽取到values文件夹下
   *
   * <p>如textColor="#ff00aa",将#ff00aa这样的具体值替换为@color/colorname <br>
   * 并在color.xml文件内创建一个对应颜色item
   *
   * @param proPath 项目绝对路径
   * @param valuesXml values文件名称,如strings.xml dimens.xml等
   * @param type 抽取内容的前缀,如@color/,则type参数就输入"color"
   * @param itemName values文件内item的名称
   * @param itemAttrName values文件内item的参数,一般都是name
   * @param itemAttrValue values文件内item的参数值,也是抽取值后替换的名称
   * @param itemValue values文件内item的值,即替换后的值
   * @param values 被替换的内容,支持模糊替换,只要匹配集合里中其中一个就会被抽取替换,最终抽取成一个值itemValue
   * @param matchAttr 匹配参数名,即只会替换该参数名对应的值
   */
  @SuppressWarnings("unchecked")
  public static void extract2valuesByJsoup(
      String proPath,
      String valuesXml,
      String type,
      String itemName,
      String itemAttrName,
      String itemAttrValue,
      String itemValue,
      List<String> values,
      String matchAttr) {
    List<File> files = FileUtils.getAllFiles(new File(proPath));

    String valuesPath = proPath + "/res/values/" + valuesXml;
    File valuesFile = new File(valuesPath);
    if (!valuesFile.exists()) {
      System.out.println("文件不存在,请确定文件[" + valuesXml + "]位于/res/values/文件夹下,且文件名称正确");
      return;
    }

    int extractFileCount = 0;
    for (File file : files) {
      if (!file.getName().endsWith(".xml")) {
        continue;
      }

      if (file.getName().equals(valuesXml)) {
        continue;
      }

      Document tarDoc = XmlUtil.read(file);

      // 是否有替换操作
      boolean isReplace =
          XmlUtil.replaceAttrValue(tarDoc, values, "@" + type + "/" + itemAttrValue, matchAttr);

      if (!isReplace) {
        continue;
      }

      XmlUtil.write2xml(file, tarDoc);

      Document valuesDoc = XmlUtil.read(valuesFile);
      Element rootElement = valuesDoc.getRootElement();
      List<Element> elements = rootElement.elements();

      // 是否在values/xx.xml对应文件下下已有某个抽取过的值
      boolean hasInValues = false;

      for (Element element : elements) {
        String attrValue = element.attributeValue(itemAttrName);
        if (attrValue.equals(itemAttrValue)) {
          hasInValues = true;
          break;
        }
      }

      if (!hasInValues) {
        Element element = rootElement.addElement(itemName);
        element.addAttribute(itemAttrName, itemAttrValue);
        element.setText(itemValue);

        XmlUtil.write2xml(valuesFile, valuesDoc);
      }

      extractFileCount++;
    }

    System.out.println(
        "将" + values + "抽取为[" + valuesXml + "]文件下的[" + itemAttrValue + "=" + itemValue + "]");
    System.out.println("共抽取了" + extractFileCount + "个文件下的内容");
    System.out.println("-------------------------");
  }