File: LangFunction.java

package info (click to toggle)
libxt-java 0.19991105-5
  • links: PTS
  • area: main
  • in suites: woody
  • size: 1,908 kB
  • ctags: 2,762
  • sloc: java: 12,823; makefile: 52; xml: 46
file content (49 lines) | stat: -rw-r--r-- 1,360 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package com.jclark.xsl.expr;

import com.jclark.xsl.om.*;

class LangFunction extends Function1 {
  ConvertibleExpr makeCallExpr(ConvertibleExpr e) throws ParseException {
    final StringExpr se = e.makeStringExpr();
    return new ConvertibleBooleanExpr() {
      public boolean eval(Node node, ExprContext context) throws XSLException {
	return lang(node, se.eval(node, context));
      }
    };
  }

  private static boolean lang(Node node, String lang) {
    Name XML_LANG =
      node.getNamespacePrefixMap().getNameTable().createName("xml:lang",
							     Name.XML_NAMESPACE);
    while (node != null) {
      String nodeLang = node.getAttributeValue(XML_LANG);
      if (nodeLang != null)
	return isSubLanguage(lang, nodeLang);
      node = node.getParent();
    }
    return false;
  }

  private static boolean isSubLanguage(String lang1, String lang2) {
    int len1 = lang1.length();
    int len2 = lang2.length();
    if (len1 > len2)
      return false;
    if (len1 < len2 && lang2.charAt(len1) != '-')
      return false;
    for (int i = 0; i < len1; i++) {
      char c1 = lang1.charAt(i);
      char c2 = lang2.charAt(i);
      switch ((int)c1 - (int)c2) {
      case 0:
      case 'a' - 'A':
      case 'A' - 'a':
	break;
      default:
	return false;
      }
    }
    return true;
  }
}