package main import ( "fmt" "log" "net/http" "slices" "strings" ) const ( portfolioSelector = "

Language Filter:

" portfolioSelectorOption = "" portfolioTitle = "

%v

" portfolioLink = "

%v: %v

" portfolioDesc = "

%v

" ) func portfolioRequest(w http.ResponseWriter, r *http.Request) { selectedLang := r.URL.Query().Get("lang") proj, err := blogApp.Projects(selectedLang) if err != nil { log.Println("error getting portfolio projects:", err) w.WriteHeader(http.StatusInternalServerError) sendIndexWithContent(w, "Error getting portfolio", "", "") return } aboutMe := "

About Me

" if me, err := blogApp.AboutMe(); err != nil { aboutMe += "Error getting info about me :(" } else { aboutMe += authorSection(me) } aboutMe += "

My Projects

" langs := make(map[string]struct{}) out := "" for _, p := range proj { out += fmt.Sprintf(portfolioTitle, p.Title) out += fmt.Sprintf(portfolioLink, p.Repository, p.Repository) for _, l := range p.Languages { langs[l.Language] = struct{}{} out += fmt.Sprintf(portfolioLanguage, l.Language, l.Dates) } out += fmt.Sprintf(portfolioDesc, p.Description) } langKeys := make([]string, 0, len(langs)) for k := range langs { langKeys = append(langKeys, k) } slices.Sort(langKeys) var tmp string if selectedLang == "" { tmp = fmt.Sprintf(portfolioSelectorOption, "", " selected=true", "All") } else { tmp = fmt.Sprintf(portfolioSelectorOption, "", "", "All") } for _, k := range langKeys { if selectedLang == strings.ToLower(k) { tmp += fmt.Sprintf(portfolioSelectorOption, strings.ToLower(k), " selected=true", k) } else { tmp += fmt.Sprintf(portfolioSelectorOption, strings.ToLower(k), "", k) } } out = aboutMe + fmt.Sprintf(portfolioSelector, tmp) + out sendIndexWithContent(w, out, "Portfolio", "") }