/** * Returns a formatted number. * * @param info input info * @param number number to be formatted * @param picture picture * @return string representation * @throws QueryException query exception */ public byte[] format(final InputInfo info, final ANum number, final byte[] picture) throws QueryException { // find pattern separator and sub-patterns final TokenList tl = new TokenList(); byte[] pic = picture; // "A picture-string consists either of a sub-picture, or of two sub-pictures separated by // a pattern-separator-sign" final int i = indexOf(pic, pattern); if (i == -1) { tl.add(pic); } else { tl.add(substring(pic, 0, i)); pic = substring(pic, i + cl(pic, i)); // "A picture-string must not contain more than one pattern-separator-sign" if (contains(pic, pattern)) throw PICNUM_X.get(info, picture); tl.add(pic); } final byte[][] patterns = tl.finish(); // check and analyze patterns if (!checkSyntax(patterns)) throw PICNUM_X.get(info, picture); final Picture[] pics = analyze(patterns); // return formatted string return format(number, pics, info); }
@Override public B64 item(final QueryContext qc, final InputInfo ii) throws QueryException { checkCreate(qc); final IOFile root = new IOFile(toPath(0, qc).toString()); final ArchOptions opts = toOptions(1, Q_OPTIONS, new ArchOptions(), qc); final Iter entries; if (exprs.length > 2) { entries = qc.iter(exprs[2]); } else { final TokenList tl = new TokenList(); for (final String file : root.descendants()) tl.add(file); entries = StrSeq.get(tl).iter(); } final String format = opts.get(ArchOptions.FORMAT); final int level = level(opts); if (!root.isDir()) throw FILE_NO_DIR_X.get(info, root); try (final ArchiveOut out = ArchiveOut.get(format.toLowerCase(Locale.ENGLISH), info)) { out.level(level); try { while (true) { Item en = entries.next(); if (en == null) break; en = checkElemToken(en); final IOFile file = new IOFile(root, string(en.string(info))); if (!file.exists()) throw FILE_NOT_FOUND_X.get(info, file); if (file.isDir()) throw FILE_IS_DIR_X.get(info, file); add(en, new B64(file.read()), out, level, qc); } } catch (final IOException ex) { throw ARCH_FAIL_X.get(info, ex); } return new B64(out.finish()); } }