code: func gorillaPattern(tpl string, matchHost, prefixMatch, strictSlash bool) (string, error) {
  	// Check if it is well-formed.
  	idxs, err := braceIndices(tpl)
  	if err != nil {
  		return "", err
  	}
  	// Now let's parse it.
  	defaultPattern := "[^/]+"
  	if matchHost {
  		defaultPattern = "[^.]+"
  		prefixMatch, strictSlash = false, false
  	} else {
  		if prefixMatch {
  			strictSlash = false
  		}
  		if strictSlash && strings.HasSuffix(tpl, "/") {
  			tpl = tpl[:len(tpl)-1]
  		}
  	}
  	pattern := bytes.NewBufferString("^")
  	var end int
  	for i := 0; i < len(idxs); i += 2 {
  		// Set all values we are interested in.
  		raw := tpl[end:idxs[i]]
  		end = idxs[i+1]
  		parts := strings.SplitN(tpl[idxs[i]+1:end-1], ":", 2)
  		name := parts[0]
  		patt := defaultPattern
  		if len(parts) == 2 {
  			patt = parts[1]
  		}
  		// Name or pattern can't be empty.
  		if name == "" || patt == "" {
  			return "", fmt.Errorf("missing name or pattern in %q",
  				tpl[idxs[i]:end])
  		}
  		// Build the regexp pattern.
  		fmt.Fprintf(pattern, "%s(?P<%s>%s)", regexp.QuoteMeta(raw), name, patt)
  	}
  	// Add the remaining.
  	raw := tpl[end:]
  	pattern.WriteString(regexp.QuoteMeta(raw))
  	if strictSlash {
  		pattern.WriteString("[/]?")
  	}
  	if !prefixMatch {
  		pattern.WriteByte('$')
  	}
  	return pattern.String(), nil
  }
docs: // Helpers --------------------------------------------------------------------
  // gorillaPattern transforms a gorilla pattern into a regexp pattern.