public static Settlement parse(String text) {

    Map<String, String> map = InfoboxMap.asMap(text);

    Settlement settlement = new Settlement();
    Coordinate coordinate = new Coordinate();

    for (String key : map.keySet()) {

      switch (key) {
        case NAME:
          settlement.setName(InfoboxParserUtil.removeAllParenthesis(map.get(key)));
          break;
        case STYLE:
          settlement.setType(InfoboxTypeParserUtil.getType(map.get(key)));
          break;
        case OFFICIAL_NAME:
          settlement.setOfficialName(InfoboxParserUtil.removeAllParenthesis(map.get(key)));
          break;
        case NATIVE_NAME:
          settlement.setNativeName(InfoboxParserUtil.removeAllParenthesis(map.get(key)));
          break;
        case NATIVE_NAME_LANG:
          settlement.setNativeNameLang(InfoboxParserUtil.removeAllParenthesis(map.get(key)));
          break;
        case OTHER_NAME:
          settlement.setOtherName(InfoboxParserUtil.removeAllParenthesis(map.get(key)));
          break;
        case SETTLEMENT_TYPE:
          settlement.setSettlementType(InfoboxParserUtil.removeAllParenthesis(map.get(key)));
          break;
        case LATITUDE:
          coordinate.setLatD(map.get(key));
          settlement.setCoordinate(coordinate);

          break;
        case LONGITUDE:
          coordinate.setLongD(map.get(key));
          settlement.setCoordinate(coordinate);
          break;
        case LATD:
          coordinate.setLatD(map.get(key));
          settlement.setCoordinate(coordinate);

          break;
        case LATM:
          coordinate.setLatM(map.get(key));
          settlement.setCoordinate(coordinate);
          break;
        case LATS:
          coordinate.setLatS(map.get(key));
          settlement.setCoordinate(coordinate);
          break;
        case LATDEG:
          coordinate.setLatD(map.get(key));
          settlement.setCoordinate(coordinate);

          break;
        case LATMIN:
          coordinate.setLatM(map.get(key));
          settlement.setCoordinate(coordinate);
          break;
        case LATSEC:
          coordinate.setLatS(map.get(key));
          settlement.setCoordinate(coordinate);
          break;
        case LATNS:
          coordinate.setLatNS(map.get(key));
          settlement.setCoordinate(coordinate);
          break;
        case LONGD:
          coordinate.setLongD(map.get(key));
          settlement.setCoordinate(coordinate);
          break;
        case LONGM:
          coordinate.setLongM(map.get(key));
          settlement.setCoordinate(coordinate);
          break;
        case LONGS:
          coordinate.setLongS(map.get(key));
          settlement.setCoordinate(coordinate);
          break;
        case LONGDEG:
          coordinate.setLongD(map.get(key));
          settlement.setCoordinate(coordinate);
          break;
        case LONGMIN:
          coordinate.setLongM(map.get(key));
          settlement.setCoordinate(coordinate);
          break;
        case LONGSEC:
          coordinate.setLongS(map.get(key));
          settlement.setCoordinate(coordinate);
          break;
        case LONGEW:
          coordinate.setLongEW(map.get(key));
          settlement.setCoordinate(coordinate);
          break;
        case WEB:
          settlement.setWebsite(InfoboxWebsiteParserUtil.getWebsite(map.get(key)));
          break;
        case WEBSITE:
          settlement.setWebsite(InfoboxWebsiteParserUtil.getWebsite(map.get(key)));
          break;
      }
    }

    return settlement;
  }
  public static HistoricSite parse(String text) {
    HistoricSite historicSite = new HistoricSite();
    Coordinate coordinate = new Coordinate();

    Map<String, String> map = InfoboxMap.asMap(text);

    for (String key : map.keySet()) {
      switch (key) {
        case NAME:
          historicSite.setName(InfoboxParserUtil.removeAllParenthesis(map.get(key)));
          break;
        case STYLE:
          historicSite.setType(map.get(key));
          break;
        case CAPTION:
          historicSite.setCaption(map.get(key));
          break;
        case IMAGE:
          historicSite.setImage(InfoboxUrlParser.infoboxUrl(map.get(key)));
          break;
        case LATD:
          coordinate.setLatD(map.get(key));
          break;
        case LATM:
          coordinate.setLatM(map.get(key));
          break;
        case LATS:
          coordinate.setLatS(map.get(key));
          break;
        case LATNS:
          coordinate.setLatNS(map.get(key));
          break;
        case LONGD:
          coordinate.setLongD(map.get(key));
          break;
        case LONGM:
          coordinate.setLongM(map.get(key));
          break;
        case LONGS:
          coordinate.setLongS(map.get(key));
          break;
        case LONGEW:
          coordinate.setLongEW(map.get(key));
          break;
        case LATDL:
          coordinate.setLatD(map.get(key));
          break;
        case LATML:
          coordinate.setLatM(map.get(key));
          break;
        case LATSL:
          coordinate.setLatS(map.get(key));
          break;
        case LATNSL:
          coordinate.setLatNS(map.get(key));
          break;
        case LONGDL:
          coordinate.setLongD(map.get(key));
          break;
        case LONGML:
          coordinate.setLongM(map.get(key));
          break;
        case LONGSL:
          coordinate.setLongS(map.get(key));
          break;
        case LONGEWL:
          coordinate.setLongEW(map.get(key));
          break;
      }

      historicSite.setCoordinate(coordinate);
    }

    return historicSite;
  }