-
Notifications
You must be signed in to change notification settings - Fork 14
Grep/Highlighting #178
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Grep/Highlighting #178
Changes from all commits
Commits
Show all changes
20 commits
Select commit
Hold shift + click to select a range
251aac8
Grep/Highlighting
UdeshyaDhungana fc5966e
Fix html
UdeshyaDhungana 5803d8a
Apply LLM suggestions
UdeshyaDhungana 0272196
Clarify instructions
UdeshyaDhungana 3e76447
Apply LLM suggestions
UdeshyaDhungana d4c4ff6
Apply LLM suggestions
UdeshyaDhungana 480ace9
Polish test cases and examples
UdeshyaDhungana f3af72b
Update instructions
UdeshyaDhungana bdfe1fb
Add suggested 'multiple matches highlighting' as an extra stage
UdeshyaDhungana ec8cd19
Corrected instructions
UdeshyaDhungana e9f4865
Adjust difficulty for highlighting
UdeshyaDhungana b6278c6
Reorder stages
UdeshyaDhungana 29b00ba
Merge with main and re-order
UdeshyaDhungana 1ee1fe4
Remove last stage for highlighting extension
UdeshyaDhungana df16ad0
Merge branch 'main' into highlighting
UdeshyaDhungana 12bdcfd
Add multiple lines stage for highlighting extension
UdeshyaDhungana ce8f2f8
Merge with main
UdeshyaDhungana 2c78b53
Add note in eq0 stage
UdeshyaDhungana 22b64bc
Correct phrase according to LLM suggestions
UdeshyaDhungana 1a48ecc
Merge branch 'main' into highlighting
UdeshyaDhungana File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -2,4 +2,4 @@ course-definition-tester | |
| .history/ | ||
|
|
||
| # MacOS | ||
| .DS_Store | ||
| .DS_Store | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,81 @@ | ||
| In this stage, you'll add support for highlighting a single match in your grep implementation. | ||
|
|
||
| ### Highlighting the matched text | ||
|
|
||
| When `--color=always` option is used with grep, it always highlights the matched text in its output. | ||
|
|
||
| Example usage: | ||
|
|
||
| <html> | ||
| <pre> | ||
| <code>$ echo -n "I have 1 apple" | grep --color=always -E '\d' | ||
| I have <span style="color: red; font-weight: bold;">1</span> apple</code> | ||
| </pre> | ||
| </html> | ||
|
|
||
| Grep uses [ANSI escape sequences](https://en.wikipedia.org/wiki/ANSI_escape_code) to add color to terminal output. These are special character sequences that terminals interpret as formatting commands rather than regular text. | ||
|
|
||
| The default color used by grep for the matched text is bold red. For example, grep uses the following ANSI escape sequences for wrapping the matched text: | ||
|
|
||
| ``` | ||
| \033[01;31m | ||
| ... | ||
| \033[m | ||
| ``` | ||
|
|
||
| **Exaple Opening Sequence: `\033[01;31m`** | ||
|
|
||
| | Component | Meaning | | ||
| |-----------|---------| | ||
| | `\033` | Escape character that introduces the ANSI control sequence | | ||
| | `[` | Start marker for [Select Graphic Rendition (SGR)](https://vt100.net/docs/vt510-rm/SGR.html) parameters | | ||
| | `01;31` | SGR codes: `01` = bold/bright text, `31` = red foreground color (separated by `;`) | | ||
| | `m` | Terminates the SGR sequence | | ||
|
|
||
| **Example Closing Sequence: `\033[m`** | ||
|
|
||
| | Component | Meaning | | ||
| |-----------|---------| | ||
| | `\033` | Escape character that introduces the ANSI control sequence | | ||
| | `[` | Start marker for SGR parameters | | ||
| | *(empty)* | No parameters = reset all attributes to default | | ||
| | `m` | Terminates the SGR sequence | | ||
|
|
||
| ### Tests | ||
|
|
||
| The tester will execute your program like this: | ||
|
|
||
| <html> | ||
| <pre> | ||
| <code>$ echo -n "I have 3 apples" | grep --color=always -E '\d' | ||
| I have <span style="font-weight:bold; color:red;">3</span> apples</code> | ||
| </pre> | ||
| </html> | ||
|
|
||
| If the input does not match the pattern, your program must: | ||
| - Exit with the code 1 | ||
| - Exit with no printed output | ||
|
|
||
| If the input text matches the pattern, your program must: | ||
| - Exit with the code 0 | ||
| - Print the input text to the standard output | ||
| - Highlight the matched text in the input using the grep's default color. | ||
|
|
||
| ### Notes | ||
|
|
||
| 1. You only need to handle the case of single match. We'll get to highlighting multiple matches in the later stages. | ||
|
|
||
| 2. The matched text should highlighted using the bold (`01`) and red (`31`) attributes. You may use any combination of ANSI codes to achieve this highlighting effect. For example, to produce the following output: | ||
|
|
||
| <html> | ||
| <pre> | ||
| <code>hello<span style="color:red; font-weight:bold" >matched</span>world</code> | ||
| </pre> | ||
| </html> | ||
|
|
||
| Any of the following sequences can be used | ||
|
|
||
| ``` | ||
| hello\033[31;01mmatched\033[mworld | ||
| hello\033[01;31mmatched\033[mworld | ||
| ``` | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,44 @@ | ||
| In this stage, you'll add support for highlighting multiple matches in your grep implementation. | ||
|
|
||
| ### Highlighting multiple matches | ||
|
|
||
| Grep highlights all the matching texts it can find in each line. | ||
|
|
||
| Example usage: | ||
|
|
||
| <html> | ||
| <pre> | ||
| <code>$ echo -n "dogs and cats are pets" | grep --color=always -E '(dogs|cats)' | ||
| <span style="color: red; font-weight: bold;">dogs</span> and <span style="color: red; font-weight: bold;">cats</span> are pets</code> | ||
| </pre> | ||
| </html> | ||
|
|
||
| ### Tests | ||
|
|
||
| The tester will execute your program like this: | ||
|
|
||
| <html> | ||
| <pre> | ||
| <code>$ echo -n "jekyll and hyde" | grep --color=always -E '(jekyll|hyde)' | ||
| <span style="color: red; font-weight: bold;">jekyll</span> and <span style="color: red; font-weight: bold;">hyde</span> | ||
| <br /> | ||
| $ echo -n "2025" | grep --color=always -E '\d' | ||
| <span style="color: red; font-weight: bold;">2025</span></code></pre> | ||
| </html> | ||
|
|
||
| If the input does not match the pattern, your program must: | ||
| - Exit with the code 1 | ||
| - Exit with no printed output | ||
|
|
||
| If the input text matches the pattern, your program must: | ||
| - Exit with the code 0 | ||
| - Print the input text to the standard output | ||
| - Highlight all the matched texts in the input using the grep's default color. | ||
|
|
||
| ### Notes | ||
|
|
||
| - You only need to handle the case of single line. We'll get to highlighting matches in multiple lines in the later stages. | ||
|
|
||
| - The tester accepts multiple valid ANSI-encoded representations of the same highlighted text. To display the bold red text: <span style="color: red; font-weight: bold;">2025</span>, any equivalent combination is acceptable. Example of valid ANSI sequences: | ||
| - `\033[01;31m2025\033[m` | ||
| - `\033[31;01m2025\033[m` |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,46 @@ | ||
| In this stage, you'll add support for highlighting matches in multiple lines. | ||
|
|
||
| ### Highlighting multiple matches | ||
|
|
||
| Grep highlights all the matching texts it can find in each line. | ||
|
|
||
| Example usage: | ||
|
|
||
| <html> | ||
| <pre> | ||
| <code>$ echo -n "dogs and cats are pets\ndogs are nice" | grep --color=always -E '(dogs|cats)' | ||
| <span style="color: red; font-weight: bold;">dogs</span> and <span style="color: red; font-weight: bold;">cats</span> are pets</code> | ||
| <span style="color:red; font-weight: bold;">dogs</span> are nice | ||
| </pre> | ||
| </html> | ||
|
|
||
| ### Tests | ||
|
|
||
| The tester will execute your program like this: | ||
|
|
||
| <html> | ||
| <pre> | ||
| <code>$ echo -n "Tiger in the wild\nBird in the sky" | grep --color=always -E '(Tiger|Bird)' | ||
| <span style="color: red; font-weight: bold;">Tiger</span> in the wild | ||
| <span style="color: red; font-weight: bold;">Bird</span> in the sky | ||
| <br> | ||
| $ echo -n "Now: 2025\nNext: 2026" | grep --color=always -E '\d\d\d\d' | ||
| <span style="color: red; font-weight: bold;">2025</span> | ||
| <span style="color: red; font-weight: bold;">2026</span> | ||
| </code></pre> | ||
| </html> | ||
|
|
||
| If the input does not match the pattern, your program must: | ||
| - Exit with the code 1 | ||
| - Exit with no printed output | ||
|
|
||
| If the input text matches the pattern, your program must: | ||
| - Exit with the code 0 | ||
| - Print each line that contains the match | ||
| - Highlight every match in every printed line | ||
|
|
||
| ### Notes | ||
|
|
||
| - The tester accepts multiple valid ANSI-encoded representations of the same highlighted text. To display the bold red text: <span style="color: red; font-weight: bold;">apple</span>, any equivalent combination is acceptable. Example of valid ANSI sequences: | ||
| - `\033[01;31mapple\033[m` | ||
| - `\033[31;01mapple\033[m` |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,30 @@ | ||
| In this stage, you'll add support for disabling the highlighting in your grep implementation using the `never` coloring option. | ||
|
|
||
| ### The `--color=never` option | ||
|
|
||
| When a line is matched, grep only prints the matched line to the standard output. It does not highlight the matched text. | ||
|
|
||
| Example usage: | ||
|
|
||
| ```bash | ||
| $ echo -n "Sally has 3 parrots" | grep --color=never -E "par+ots?" | ||
| Sally has 3 parrots | ||
| ``` | ||
|
|
||
| ### Tests | ||
|
|
||
| The tester will execute your program like this: | ||
|
|
||
| ```bash | ||
| $ echo -n "I have 5 vegetables" | grep --color=never -E '\d' | ||
| I have 5 vegetables | ||
| ``` | ||
|
|
||
| If the input matches the pattern, your program must: | ||
| - Exit with the code 0 | ||
| - Print the input line to the standard output | ||
| - No highlights should be placed in the output text because `--color=never` option is being used. | ||
|
|
||
| If the input does not match the pattern, your program must: | ||
| - Exit with the code 1 | ||
| - Exit with no printed output |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,82 @@ | ||
| In this stage, you'll add support for `auto` coloring option in the `--color` flag in your grep implementation. | ||
|
|
||
| ### The `auto` color option | ||
|
|
||
| When `--color=auto` option is used with grep, it behaves in the following manner: | ||
|
|
||
| - If the output stream is a [TTY device](https://www.ibm.com/docs/en/aix/7.1.0?topic=communications-tty-terminal-device), like the terminal, highlighting is enabled. | ||
|
|
||
| - If the output stream is not a TTY device, for example, the output is piped to another command, or being redirected to a non-TTY device, highlighting is disabled. | ||
|
|
||
| Example usage: | ||
|
|
||
| <html> | ||
| <pre> | ||
| <code>$ echo -n "I have 3 cows" | grep --color=auto -E 'cows' | ||
| I have <span style="font-weight:bold;color:red">3</span> cows | ||
| $ echo -n "I have 4 cows" | grep --color=auto -E 'cows' >> /dev/tty | ||
| I have <span style="font-weight:bold;color:red">4</span> cows</code> | ||
| </pre> | ||
| </html> | ||
|
|
||
| The output text is highlighted in this case since the output in both cases is a TTY device. | ||
|
|
||
| When the output stream is piped to another command, or redirected to a non-TTY device, the ANSI highlighting sequences are not placed in the output text. | ||
|
|
||
| ```bash | ||
| # Output stream is piped to another command | ||
| $ echo -n "I have 3 apples" | grep --color=auto -E '\d' | hexdump -C | ||
| 00000000 49 20 68 61 76 65 20 33 20 61 70 70 6c 65 73 0a |I have 3 apples.| | ||
| 00000010 | ||
|
|
||
| # Output stream is redirected to a non-TTY device | ||
| $ echo -n "I have 4 apples" | grep --color=auto -E '\d' >> output.txt | ||
|
|
||
| $ hexdump -C output.txt | ||
| 00000000 49 20 68 61 76 65 20 34 20 61 70 70 6c 65 73 0a |I have 4 apples.| | ||
| 00000010 | ||
| ``` | ||
|
|
||
| ### Tests | ||
|
|
||
| The tester will execute your program like this: | ||
|
|
||
| <html> | ||
| <pre> | ||
| <code>$ echo -n "I have 4 cats" | grep --color=auto -E 'cats' | ||
| I have 4 <span style="color:red; font-weight:bold;">cats</span> | ||
| $ echo -n "I have 5 cats" | grep --color=auto -E 'cats' >> /dev/tty | ||
| I have 5 <span style="color:red; font-weight:bold;">cats</span></code> | ||
| </pre> | ||
| </html> | ||
|
|
||
| If the input does not match the pattern, your program must: | ||
| - Exit with the code 1 | ||
|
|
||
| If the input text matches the pattern, your program must: | ||
| - Exit with the code 0 | ||
| - Print the input text to the standard output | ||
| - The matched text in the output should be highlighted | ||
|
|
||
| The tester will also execute your program like this: | ||
|
|
||
| ```bash | ||
| # Redirection to a non-tty device | ||
| $ echo -n "I have 3 horses" | grep --color=auto -E '\d' >> file.txt | ||
|
|
||
| # Piping to another command | ||
| $ echo -n "He has 9 rabbits" | grep --color=auto -E '\d' | another_command | ||
| ``` | ||
|
|
||
| For both of these cases, | ||
| If the input does not match the pattern, your program must: | ||
| - Exit with the code 1 | ||
| - Exit with no printed output | ||
|
|
||
| If the input text matches the pattern, your program must exit with the code 0 and | ||
| - The input text should be written to the file `file.txt`, or be supplied to another command, depending on the case. | ||
| - The ANSI escape sequence for highlighting should not be present inside the file, or supplied to another command, depending on the case. | ||
|
|
||
| ### Notes | ||
|
|
||
| - You might find it helpful to use the equivalent of [`isatty()`](https://man7.org/linux/man-pages/man3/isatty.3.html) function in your programming language to check whether the output stream is a TTY device. |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Now that we have the prerequisites, let's change the ordering here: