Changeset ba1488b


Ignore:
Timestamp:
Oct 16, 2015 7:45:23 PM (5 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
fe26052
Parents:
39b218b
Message:

i2psnark: Add "smart sort" option, set sort based on language (tickets #637, #1303)

Files:
5 edited

Legend:

Unmodified
Added
Removed
  • apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java

    r39b218b rba1488b  
    127127    public static final String PROP_PRIVATETRACKERS = "i2psnark.privatetrackers";
    128128    private static final String PROP_USE_DHT = "i2psnark.enableDHT";
     129    private static final String PROP_SMART_SORT = "i2psnark.smartSort";
    129130
    130131    public static final int MIN_UP_BW = 10;
     
    340341    public boolean shouldAutoStart() {
    341342        return Boolean.parseBoolean(_config.getProperty(PROP_AUTO_START, DEFAULT_AUTO_START));
     343    }
     344   
     345    /**
     346     *  @return default true
     347     *  @since 0.9.23
     348     */
     349    public boolean isSmartSortEnabled() {
     350        String val = _config.getProperty(PROP_SMART_SORT);
     351        if (val == null)
     352            return true;
     353        return Boolean.parseBoolean(val);
    342354    }
    343355
     
    737749     *  all params may be null or need trimming
    738750     */
    739     public void updateConfig(String dataDir, boolean filesPublic, boolean autoStart, String refreshDelay,
     751    public void updateConfig(String dataDir, boolean filesPublic, boolean autoStart, boolean smartSort, String refreshDelay,
    740752                             String startDelay, String pageSize, String seedPct, String eepHost,
    741753                             String eepPort, String i2cpHost, String i2cpPort, String i2cpOpts,
    742754                             String upLimit, String upBW, boolean useOpenTrackers, boolean useDHT, String theme) {
    743755        synchronized(_configLock) {
    744             locked_updateConfig(dataDir, filesPublic, autoStart, refreshDelay,
     756            locked_updateConfig(dataDir, filesPublic, autoStart, smartSort,refreshDelay,
    745757                                startDelay,  pageSize,  seedPct,  eepHost,
    746758                                eepPort,  i2cpHost,  i2cpPort,  i2cpOpts,
     
    749761    }
    750762
    751     private void locked_updateConfig(String dataDir, boolean filesPublic, boolean autoStart, String refreshDelay,
     763    private void locked_updateConfig(String dataDir, boolean filesPublic, boolean autoStart, boolean smartSort, String refreshDelay,
    752764                             String startDelay, String pageSize, String seedPct, String eepHost,
    753765                             String eepPort, String i2cpHost, String i2cpPort, String i2cpOpts,
     
    967979            changed = true;
    968980        }
     981
     982        if (isSmartSortEnabled() != smartSort) {
     983            _config.setProperty(PROP_SMART_SORT, Boolean.toString(smartSort));
     984            if (smartSort)
     985                addMessage(_t("Enabled smart sort"));
     986            else
     987                addMessage(_t("Disabled smart sort"));
     988            changed = true;
     989        }
     990
    969991        if (_util.shouldUseOpenTrackers() != useOpenTrackers) {
    970992            _config.setProperty(PROP_USE_OPENTRACKERS, useOpenTrackers + "");
  • apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java

    r39b218b rba1488b  
    3333import net.i2p.util.Log;
    3434import net.i2p.util.SecureFile;
     35import net.i2p.util.Translate;
    3536
    3637import org.klomp.snark.I2PSnarkUtil;
     
    11191120            boolean filesPublic = req.getParameter("filesPublic") != null;
    11201121            boolean autoStart = req.getParameter("autoStart") != null;
     1122            boolean smartSort = req.getParameter("smartSort") != null;
    11211123            String seedPct = req.getParameter("seedPct");
    11221124            String eepHost = req.getParameter("eepHost");
     
    11341136            //String openTrackers = req.getParameter("openTrackers");
    11351137            String theme = req.getParameter("theme");
    1136             _manager.updateConfig(dataDir, filesPublic, autoStart, refreshDel, startupDel, pageSize,
     1138            _manager.updateConfig(dataDir, filesPublic, autoStart, smartSort, refreshDel, startupDel, pageSize,
    11371139                                  seedPct, eepHost, eepPort, i2cpHost, i2cpPort, i2cpOpts,
    11381140                                  upLimit, upBW, useOpenTrackers, useDHT, theme);
     
    14021404                } catch (NumberFormatException nfe) {}
    14031405            }
     1406            if (_manager.isSmartSortEnabled())
     1407                Sorters.setPattern(Translate.getLanguage(_manager.util().getContext()));
     1408            else
     1409                Sorters.setPattern(null);
    14041410            try {
    14051411                Collections.sort(rv, Sorters.getComparator(sort, this));
     
    21452151        boolean filesPublic = _manager.areFilesPublic();
    21462152        boolean autoStart = _manager.shouldAutoStart();
     2153        boolean smartSort = _manager.isSmartSortEnabled();
    21472154        boolean useOpenTrackers = _manager.util().shouldUseOpenTrackers();
    21482155        //String openTrackers = _manager.util().getOpenTrackerString();
     
    21782185                  + "title=\"");
    21792186        out.write(_t("If checked, automatically start torrents that are added"));
     2187        out.write("\" >" +
     2188
     2189                  "<tr><td>");
     2190        out.write(_t("Smart torrent sorting"));
     2191        out.write(": <td><input type=\"checkbox\" class=\"optbox\" name=\"smartSort\" value=\"true\" "
     2192                  + (smartSort ? "checked " : "")
     2193                  + "title=\"");
     2194        out.write(_t("If checked, ignore words such as 'the' when sorting"));
    21802195        out.write("\" >" +
    21812196
  • apps/i2psnark/java/src/org/klomp/snark/web/Sorters.java

    r39b218b rba1488b  
    77import java.util.Comparator;
    88import java.util.Locale;
     9import java.util.regex.Matcher;
     10import java.util.regex.Pattern;
    911
    1012import org.klomp.snark.MetaInfo;
     
    1820 */
    1921class Sorters {
     22
     23    /**
     24     * See below
     25     */
     26    private static final Pattern PATTERN_DE, PATTERN_EN, PATTERN_ES, PATTERN_FR,
     27                                 PATTERN_IT, PATTERN_NL, PATTERN_PT;
     28    private static Pattern _pattern;
    2029
    2130    /**
     
    114123
    115124    /**
    116      *  Sort alphabetically in current locale, ignore case, ignore leading "the "
    117      *  (I guess this is worth it, a lot of torrents start with "The "
     125     *  Sort alphabetically in current locale, ignore case, ignore leading
     126     *  articles such as "the" if the pattern is set by setPattern()
    118127     *  @since 0.7.14
    119128     */
     
    131140                return 1;
    132141            String ls = l.getBaseName();
    133             String llc = ls.toLowerCase(Locale.US);
    134             if (llc.startsWith("the ") || llc.startsWith("the.") || llc.startsWith("the_"))
    135                 ls = ls.substring(4);
    136142            String rs = r.getBaseName();
    137             String rlc = rs.toLowerCase(Locale.US);
    138             if (rlc.startsWith("the ") || rlc.startsWith("the.") || rlc.startsWith("the_"))
    139                 rs = rs.substring(4);
     143            Pattern p = _pattern;
     144            if (p != null) {
     145                Matcher m = p.matcher(ls);
     146                if (m.matches())
     147                    ls = ls.substring(m.group(1).length());
     148                m = p.matcher(rs);
     149                if (m.matches())
     150                    rs = rs.substring(m.group(1).length());
     151            }
    140152            return Collator.getInstance().compare(ls, rs);
    141153        }
     
    529541        }
    530542    }
     543
     544    /*
     545     *  Match an indefinite or definite article in the language,
     546     *  followed by one or more whitespace, '.', or '_'.
     547     *  Does not match "partitive" articles.
     548     *
     549     *  https://en.wikipedia.org/wiki/Article_%28grammar%29
     550     *  http://www.loc.gov/marc/bibliographic/bdapndxf.html
     551     */
     552    static {
     553        PATTERN_DE = Pattern.compile(
     554            // can't make the non-capturing innner group work
     555            //"^((?:" +
     556            "^((" +
     557            "der|die|das|des|dem|den|ein|eine|einer|eines|einem|einen" +
     558            ")[\\s\\._]+).*",
     559            Pattern.CASE_INSENSITIVE);
     560        PATTERN_EN = Pattern.compile(
     561            "^((" +
     562            "a|an|the" +
     563            ")[\\s\\._]+).*",
     564            Pattern.CASE_INSENSITIVE);
     565        PATTERN_ES = Pattern.compile(
     566            "^((" +
     567            "el|la|lo|los|las|un|una|unos|unas" +
     568            ")[\\s\\._]+).*",
     569            Pattern.CASE_INSENSITIVE);
     570        PATTERN_FR = Pattern.compile(
     571            // note l' doesn't require whitespace after
     572            "^(l'|((" +
     573            "le|la|les|un|une|des" +
     574            ")[\\s\\._]+)).*",
     575            Pattern.CASE_INSENSITIVE);
     576        PATTERN_IT = Pattern.compile(
     577            // note l' and un' don't require whitespace after
     578            "^(l'|un'|((" +
     579            "il|lo|la|i|gli|le|uno|una|un" +
     580            ")[\\s\\._]+)).*",
     581            Pattern.CASE_INSENSITIVE);
     582        PATTERN_NL = Pattern.compile(
     583            "^((" +
     584            "de|het|het'n|een|een'n" +
     585            ")[\\s\\._]+).*",
     586            Pattern.CASE_INSENSITIVE);
     587        PATTERN_PT = Pattern.compile(
     588            "^((" +
     589            "o|a|os|as|um|uma|uns|umas" +
     590            ")[\\s\\._]+).*",
     591            Pattern.CASE_INSENSITIVE);
     592    }
     593
     594    /**
     595     * Sets static field, oh well
     596     * @param lang null for none
     597     * @since 0.9.23
     598     */
     599    public static void setPattern(String lang) {
     600        Pattern p;
     601        if (lang == null)
     602            p = null;
     603        else if (lang.equals("de"))
     604            p = PATTERN_DE;
     605        else if (lang.equals("en"))
     606            p = PATTERN_EN;
     607        else if (lang.equals("es"))
     608            p = PATTERN_ES;
     609        else if (lang.equals("fr"))
     610            p = PATTERN_FR;
     611        else if (lang.equals("it"))
     612            p = PATTERN_IT;
     613        else if (lang.equals("nl"))
     614            p = PATTERN_NL;
     615        else if (lang.equals("pt"))
     616            p = PATTERN_PT;
     617        else
     618            p = null;
     619        _pattern = p;
     620    }
     621
     622/****
     623    public static final void main(String[] args) {
     624        if (args.length != 2) {
     625            System.out.println("Usage: Sorters lang 'string'");
     626            System.exit(1);
     627        }
     628        String lang = args[0];
     629        setPattern(lang);
     630        if (_pattern == null) {
     631            System.out.println("Unsupported " + lang);
     632            System.exit(1);
     633        }
     634        String s = args[1];
     635        Matcher m = _pattern.matcher(s);
     636        if (m.matches()) {
     637            System.out.println("Match is \"" + m.group(1) + '"');
     638        } else {
     639            System.out.println("No match for \"" + s + '"');
     640        }
     641    }
     642****/
    531643}
  • history.txt

    r39b218b rba1488b  
     12015-10-16 zzz
     2 * i2psnark:
     3   - Fix deadlock (ticket #1432)
     4   - Add "smart sort" option, set sort based on language (tickets #637, #1303)
     5
     62015-10-14 zzz
     7 * Update:
     8   - Require Java 7 to download dev builds (ticket #1669)
     9   - Fix persistence of the available dev version
     10
     112015-10-13 zzz
     12 * Startup: Delete our old RI from netDB when rekeying
     13
    1142015-10-11 zzz
    215 * Crypto: Test for broken Gentoo ECDSA support
  • router/java/src/net/i2p/router/RouterVersion.java

    r39b218b rba1488b  
    1919    public final static String ID = "Monotone";
    2020    public final static String VERSION = CoreVersion.VERSION;
    21     public final static long BUILD = 17;
     21    public final static long BUILD = 18;
    2222
    2323    /** for example "-test" */
Note: See TracChangeset for help on using the changeset viewer.