]> git.plutz.net Git - shellwiki/blob - handlers/10_translations.sh
rewrite links to carry language tag, needs improvement
[shellwiki] / handlers / 10_translations.sh
1 #!/bin/sh
2
3 # Set LANGUAGE_DEFAULT to enable Plugin
4 [ ! "$LANGUAGE_DEFAULT" ] && return 1
5
6 export LANGUAGE_DEFAULT="${LANGUAGE_DEFAULT:-en}"
7 export HTTP_REFERER="${HTTP_REFERER:-$(HEADER Referer)}"
8 export LANGUAGE ERROR_MSG
9
10 mdfile(){
11   # Override mdfile Selection from tools.sh
12   local page="$(PATH "$1")"
13   page="${page%/}"
14
15   # Additional part:
16   #   if PAGE Address is LANGUAGE Page, jump to regular processing
17   #   else if LANGUAGE Page exists, add language tag
18   # Also the reason why `mdfile` should not be used in `acl.sh`
19   if   [ "${page%/:${LANGUAGE}}" != "$page" ]; then
20     :
21   elif [ -f "$_DATA/pages/$page/:$LANGUAGE/#page.md"  ]; then
22     printf %s\\n "$_DATA/pages/$page/:$LANGUAGE/#page.md"
23     return 0
24   elif [ -f "$_EXEC/pages/$page/:$LANGUAGE/#page.md"  ]; then
25     printf %s\\n "$_EXEC/pages/$page/:$LANGUAGE/#page.md"
26     return 0
27   fi 2>&-
28
29   # Regular processing, keep in sync with tools.sh
30   if   [ -f "$_DATA/pages/$page/#page.md" ]; then
31     printf %s\\n "$_DATA/pages/$page/#page.md"
32     return 0
33   elif [ -f "$_EXEC/pages/$page/#page.md" ]; then
34     printf %s\\n "$_EXEC/pages/$page/#page.md"
35     return 0
36   else
37     return 1
38   fi 2>&-
39   #  ^^ suppress error messages produced
40   #     by printf when stdout was closed
41 }
42
43 # UGLY! UGLY! UGLY!
44 # Override markdown processor from `tools.sh` to add link suffixes
45 # -> better implement a parser stack, i.e. pipeline markdown + other parser plugins
46 if [ "$(which awk)" ]; then
47   md() {
48     awk -f "$_EXEC/md_macros.awk" -f "$_EXEC/cgilite/markdown.awk" \
49     | sed -E 's;(<[^>]+ )href="((/[^"/]+|[^"/]+[^:/]|)/([^"/]+/)*)"([^>]*>);\1href="\2:'"${LANGUAGE}"'"\5;g'
50   }
51 elif [ "$(which busybox)" ]; then
52   md() {
53     busybox awk -f "$_EXEC/md_macros.awk" -f "$_EXEC/cgilite/markdown.awk" \
54     | sed -E 's;(<[^>]+ )href="((/[^"/]+|[^"/]+[^:/]|)/([^"/]+/)*)"([^>]*>);\1href="\2:'"${LANGUAGE}"'"\5;g'
55   }
56 else
57   md() { cat; }
58 fi
59
60 case ${HTTP_REFERER} in
61   */:*/*):;;
62   */:*)
63    LANGUAGE_REFERRED="${HTTP_REFERER##*/:}"
64    ;;
65 esac
66
67 LANGUAGE="${LANGUAGE_REFERRED:-${LANGUAGE_DEFAULT}}"
68
69 case ${PATH_INFO} in
70   */:?*/\[attachment\]/?*)
71     LANGUAGE="${PATH_INFO#*/:}"
72     LANGUAGE="${LANGUAGE%%/*}"
73     PATH_INFO="${PATH_INFO%%:?*/*}${PATH_INFO#*/:?*/}"
74     ;;
75   */:?*/\[attachment\])
76     LANGUAGE="${PATH_INFO#*/:}"
77     LANGUAGE="${LANGUAGE%%/*}"
78     PATH_INFO="${PATH_INFO%:?*/\[attachment\]}[attachment]"
79     ;;
80   */:?*/\[*\])
81     :;;  # Default handler, considered valid in most cases
82   */:?*/?*)
83     :;;  # Default attachment handler
84   */:?*/)   # Faulty URL build
85     REDIRECT "${_BASE}${PATH_INFO%/}"
86     ;;
87 # */:"${LANGUAGE_DEFAULT}")
88 #   REDIRECT "${_BASE}${PATH_INFO%:*}"
89 #   ;;
90   */:?*)
91     LANGUAGE="${PATH_INFO##*/:}"
92
93     if mdfile "${PATH_INFO}/"; then
94       # Pretend to deliver Language Page, if Language Tag is valid
95       PATH_INFO="${PATH_INFO}/"
96     elif [ "$LANGUAGE" = "$LANGUAGE_DEFAULT" ]; then
97       # Pretend Language Tag was omitted for default Language
98       PATH_INFO="${PATH_INFO%:*}"
99     else
100       # Deliver default Page if Language is not found
101       ERROR_MSG="TRANSLATION NOT FOUND"
102       PATH_INFO="${PATH_INFO%:*}"
103     fi
104     ;;
105   /|*/*/)  # Keep Language from Referer
106     if [ "$LANGUAGE_REFERRED" -a "$LANGUAGE_REFERRED" != "$LANGUAGE_DEFAULT" ]; then
107       REDIRECT "${_BASE}${PATH_INFO}:${LANGUAGE_REFERRED}"
108     fi
109     ;;
110   */\[*\])  # Keep Language from Referer
111     if [ "$LANGUAGE_REFERRED" -a "$LANGUAGE_REFERRED" != "$LANGUAGE_DEFAULT" ]; then
112       REDIRECT "${_BASE}${PATH_INFO%\[*\]}:${LANGUAGE_REFERRED}/[${PATH_INFO##*/\[}"
113     fi
114     ;;
115 esac
116
117 return 1