/** * Copyright (c) 2012 BMW Car IT and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html */ package org.jnario.doc; import com.google.common.base.Objects; import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.eclipse.xtext.xbase.lib.CollectionLiterals; import org.eclipse.xtext.xbase.lib.Functions.Function1; import org.eclipse.xtext.xbase.lib.Pair; import org.jnario.doc.Filter; import org.jnario.doc.FilteringResult; import org.jnario.doc.LangFilter; import org.jnario.doc.RegexFilter; @SuppressWarnings("all") public class FilterExtractor { private static String TAG = "(^|\\W)@(\\w+)(\\((.*?)\\))"; private static Pattern TAG_PATTERN = Pattern.compile(FilterExtractor.TAG, Pattern.DOTALL); private Map<String, Function1<String, Filter>> filterRegistry = CollectionLiterals.<String, Function1<String, Filter>>newHashMap( Pair.<String, Function1<String, Filter>>of("filter", new Function1<String, Filter>() { public Filter apply(final String s) { return RegexFilter.create(s); } }), Pair.<String, Function1<String, Filter>>of("lang", new Function1<String, Filter>() { public Filter apply(final String s) { return LangFilter.create(s); } })); public FilteringResult apply(final String input) { boolean _equals = Objects.equal(input, null); if (_equals) { return FilteringResult.EMPTY_RESULT; } final StringBuilder resultString = new StringBuilder(); final List<Filter> filters = CollectionLiterals.<Filter>newArrayList(); final Matcher matcher = FilterExtractor.TAG_PATTERN.matcher(input); int offset = 0; while (matcher.find()) { { final String key = matcher.group(2); final Function1<String, Filter> candidate = this.filterRegistry.get(key); boolean _notEquals = (!Objects.equal(candidate, null)); if (_notEquals) { String _group = matcher.group(4); Filter _apply = candidate.apply(_group); filters.add(_apply); } final int nextOffset = matcher.start(); String _substring = input.substring(offset, nextOffset); resultString.append(_substring); int _end = matcher.end(); offset = _end; } } String _substring = input.substring(offset); resultString.append(_substring); String _string = resultString.toString(); return new FilteringResult(_string, filters); } }