public void fillBooks(FsModule module, BufferedReader bReader)
      throws FileAccessException, BooksDefinitionException, BookDefinitionException {
    String str, key, value;

    ArrayList<String> fullNames = new ArrayList<String>();
    ArrayList<String> pathNames = new ArrayList<String>();
    ArrayList<String> shortNames = new ArrayList<String>();
    ArrayList<Integer> chapterQty = new ArrayList<Integer>();
    int booksCount = 0;

    int pos;
    try {
      while ((str = bReader.readLine()) != null) {
        pos = str.indexOf("//");
        if (pos >= 0) str = str.substring(0, pos);

        int delimiterPos = str.indexOf("=");
        if (delimiterPos == -1) {
          continue;
        }

        key = str.substring(0, delimiterPos).trim().toLowerCase();
        delimiterPos++;
        value =
            delimiterPos >= str.length() ? "" : str.substring(delimiterPos, str.length()).trim();

        if (key.equals("pathname")) {
          pathNames.add(value);
        } else if (key.equals("fullname")) {
          fullNames.add(value);
        } else if (key.equals("shortname")) {
          shortNames.add(value.replaceAll("\\.", ""));
        } else if (key.equals("chapterqty")) {
          try {
            chapterQty.add(Integer.valueOf(value));
          } catch (NumberFormatException e) {
            chapterQty.add(0);
          }
        } else if (key.equals("bookqty")) {
          try {
            booksCount = Integer.valueOf(value);
          } catch (NumberFormatException e) {
          }
        }
      }

    } catch (IOException e) {
      String message = String.format("fillBooks(%1$s)", module.getDataSourceID(), e);
      Log.e(TAG, message, e);
      throw new FileAccessException(message);
    }

    if (booksCount == 0
        || pathNames.size() < booksCount
        || fullNames.size() < booksCount
        || shortNames.size() < booksCount
        || chapterQty.size() < booksCount) {
      String message =
          String.format(
              "Incorrect books definition in module %1$s: BookQty=%2$s, PathNameCount=%3$s, FullNameCount=%4$s, ShortNameCount=%5$s, ChapterQtyCount=%6$s",
              module.getDataSourceID(),
              booksCount,
              pathNames.size(),
              fullNames.size(),
              shortNames.size(),
              chapterQty.size());
      throw new BooksDefinitionException(
          message,
          module.getDataSourceID(),
          booksCount,
          pathNames.size(),
          fullNames.size(),
          shortNames.size(),
          chapterQty.size());
    }

    for (int i = 0; i < booksCount; i++) {
      if (pathNames.get(i).equals("")
          || fullNames.get(i).equals("")
          || shortNames.get(i).equals("")
          || chapterQty.get(i) == 0) {
        // Имя книги, путь к книге и кол-во глав должны быть обязательно указаны
        String message =
            String.format(
                "Incorrect attributes of book #%1$s in module %2$s: PathName=%3$s, FullName=%4$s, ShortName=%5$s, ChapterQty=%6$s",
                i,
                module.getDataSourceID(),
                pathNames.get(i),
                fullNames.get(i),
                shortNames.get(i),
                chapterQty.get(i));
        throw new BookDefinitionException(
            message,
            module.getDataSourceID(),
            i,
            pathNames.get(i),
            fullNames.get(i),
            shortNames.get(i),
            chapterQty.get(i));
      }
      FsBook book =
          new FsBook(
              module,
              fullNames.get(i),
              pathNames.get(i),
              (shortNames.size() > i ? shortNames.get(i) : ""),
              chapterQty.get(i));
      module.Books.put(book.getID(), book);
    }
  }
  public void fillModule(FsModule module, BufferedReader bReader) throws FileAccessException {
    String str, HTMLFilter = "", key, value;

    int pos;
    try {
      while ((str = bReader.readLine()) != null) {
        pos = str.indexOf("//");
        if (pos >= 0) str = str.substring(0, pos);

        int delimiterPos = str.indexOf("=");
        if (delimiterPos == -1) {
          continue;
        }

        key = str.substring(0, delimiterPos).trim().toLowerCase();
        delimiterPos++;
        value =
            delimiterPos >= str.length() ? "" : str.substring(delimiterPos, str.length()).trim();

        if (key.equals("biblename")) {
          module.setName(value);
        } else if (key.equals("bibleshortname")) {
          module.ShortName = value.replaceAll("\\.", "");
        } else if (key.equals("chaptersign")) {
          module.ChapterSign = value.toLowerCase();
        } else if (key.equals("chapterzero")) {
          module.ChapterZero = value.toLowerCase().contains("y") ? true : false;
        } else if (key.equals("versesign")) {
          module.VerseSign = value.toLowerCase();
        } else if (key.equals("htmlfilter")) {
          HTMLFilter = value;
        } else if (key.equals("bible")) {
          module.isBible = value.toLowerCase().contains("y") ? true : false;
        } else if (key.equals("strongnumbers")) {
          module.containsStrong = value.toLowerCase().contains("y") ? true : false;
        }
      }

    } catch (IOException e) {
      String message = String.format("fillModule(%1$s)", module.getDataSourceID());
      Log.e(TAG, message, e);
      throw new FileAccessException(message);
    }

    String TagFilter[] = {
      "p", "b", "i", "em", "strong", "q", "big", "sub", "sup", "h1", "h2", "h3", "h4"
    };
    ArrayList<String> TagArray = new ArrayList<String>();
    for (String tag : TagFilter) {
      TagArray.add(tag);
    }

    if (!HTMLFilter.equals("")) {
      String[] words = HTMLFilter.replaceAll("\\W", " ").trim().split("\\s+");
      for (String word : words) {
        if (word.equals("") || TagArray.contains(word)) {
          continue;
        }
        TagArray.add(word);
      }
    }

    String separator = "";
    for (String tag : TagArray) {
      module.HtmlFilter +=
          separator
              + "("
              + tag
              + ")|(/"
              + tag
              + ")"
              + "|("
              + tag.toUpperCase()
              + ")|(/"
              + tag.toUpperCase()
              + ")";
      separator = "|";
    }

    module.setIsClosed(false);
  }