{{- $id := .Get "id" | default (printf "chart-%d" now.UnixNano) -}} {{- $type := .Get "type" | default "line" -}} {{- $title := .Get "title" | default "" -}} {{- $height := .Get "height" | default "400" -}} {{- $csvFile := .Get "csv" -}} {{- $labelCol := .Get "labelColumn" | default "Month" -}} {{- $dataCol := .Get "dataColumn" | default "Questions" -}} {{- $dataColumns := .Get "dataColumns" | default "" -}} {{- $datasetLabels := .Get "datasetLabels" | default "" -}} {{- $yAxisIDs := .Get "yAxisIDs" | default "" -}} {{- $dateFormat := .Get "dateFormat" | default "2006-01" -}} {{- $skipRows := .Get "skipRows" | default 0 | int -}} {{- $maxRows := .Get "maxRows" | default 0 | int -}} {{- $chartData := dict -}} {{- if $csvFile -}} {{/* CSV file mode - supports multiple CSV files */}} {{- $csvFiles := strings.Split $csvFile "," -}} {{- $dataColsList := slice -}} {{- if ne $dataColumns "" -}} {{- $dataColsList = strings.Split $dataColumns "," -}} {{- end -}} {{- $labelsList := slice -}} {{- if ne $datasetLabels "" -}} {{- $labelsList = strings.Split $datasetLabels "," -}} {{- end -}} {{- $yAxisList := slice -}} {{- if ne $yAxisIDs "" -}} {{- $yAxisList = strings.Split $yAxisIDs "," -}} {{- end -}} {{- $labels := slice -}} {{- $datasets := slice -}} {{/* Process each CSV file */}} {{- range $fileIdx, $csvFileName := $csvFiles -}} {{- $csvFileName = strings.TrimSpace $csvFileName -}} {{- $csvResource := $.Page.Resources.GetMatch $csvFileName -}} {{- if not $csvResource -}} {{- errorf "CSV file '%s' not found in page bundle for %s. Make sure the file exists in the same directory as index.md" $csvFileName $.Page.File.Path -}} {{- end -}} {{- $csvData := $csvResource | transform.Unmarshal -}} {{- $data := slice -}} {{/* Determine which data column to use */}} {{- $currentDataCol := $dataCol -}} {{- if ge $fileIdx (len $dataColsList) -}} {{- $currentDataCol = $dataCol -}} {{- else -}} {{- $currentDataCol = strings.TrimSpace (index $dataColsList $fileIdx) -}} {{- end -}} {{/* Determine dataset label */}} {{- $datasetLabel := $currentDataCol -}} {{- if lt $fileIdx (len $labelsList) -}} {{- $datasetLabel = strings.TrimSpace (index $labelsList $fileIdx) -}} {{- end -}} {{/* Determine Y-axis ID */}} {{- $yAxisID := "y" -}} {{- if lt $fileIdx (len $yAxisList) -}} {{- $yAxisID = strings.TrimSpace (index $yAxisList $fileIdx) -}} {{- end -}} {{/* Process CSV rows */}} {{- range $idx, $row := $csvData -}} {{- if gt $idx $skipRows -}} {{- if or (eq $maxRows 0) (le (len $data) $maxRows) -}} {{/* Only set labels once from the first CSV file */}} {{- if eq $fileIdx 0 -}} {{/* Get label value */}} {{- $labelRaw := "" -}} {{- if reflect.IsMap $row -}} {{- $labelRaw = index $row $labelCol -}} {{- else -}} {{/* Handle as slice/array - first column is label */}} {{- $labelRaw = index $row 0 -}} {{- end -}} {{- $label := $labelRaw -}} {{/* Try to parse and format date if it looks like a timestamp */}} {{- $labelStr := printf "%v" $labelRaw -}} {{- if strings.Contains $labelStr " 00:00:00" -}} {{- $parsedTime := time.AsTime $labelStr -}} {{- $label = $parsedTime.Format $dateFormat -}} {{- end -}} {{- $labels = $labels | append $label -}} {{- end -}} {{/* Get data value */}} {{- $dataValue := 0 -}} {{- if reflect.IsMap $row -}} {{- $dataValue = index $row $currentDataCol | int -}} {{- else -}} {{/* Handle as slice/array - second column is data */}} {{- $dataValue = index $row 1 | int -}} {{- end -}} {{- $data = $data | append $dataValue -}} {{- end -}} {{- end -}} {{- end -}} {{/* Add this dataset to the datasets array */}} {{- $datasets = $datasets | append (dict "label" $datasetLabel "data" $data "yAxisID" $yAxisID) -}} {{- end -}} {{- $chartData = dict "labels" $labels "datasets" $datasets -}} {{- else -}} {{/* JSON inline mode */}} {{- if .Inner -}} {{- $chartData = .Inner | transform.Unmarshal -}} {{- else -}} {{- errorf "Graph shortcode requires either CSV file or inline JSON data" -}} {{- end -}} {{- end -}}