Html-react-parser: рдЯреАрдПрд╕ рддреНрд░реБрдЯрд┐: рдЙрджрд╛рд╣рд░рдг рдХреЗ рддрддреНрд╡ рд╣рдореЗрд╢рд╛ Next.js рдХреЗ рд╕рд╛рде рдЭреВрдареА рд╡рд╛рдкрд╕реА рдХрд░рддреЗ рд╣реИрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 29 рдЬрдире░ 2021  ┬╖  15рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: remarkablemark/html-react-parser

рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдбреЗрдореЛ

https://codesandbox.io/s/quizzical-lake-16q4o?file=/pages/index.tsx

рдХрд╕реНрдЯрдо рдШрдЯрдХ рдХреА рдЬрдЧрд╣ рд▓реЗрддреЗ рд╕рдордп, рдЕрд╕рддреНрдп рд╣рдореЗрд╢рд╛ рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХреНрдпрд╛ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреЛрдИ рдЕрдиреНрдп рд╕рдорд╛рдзрд╛рди рд╣реИ?

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдпрд╣ рдирд┐рд░реНрджреЗрд╢ рд╣реИ, рдФрд░ рдореИрдВ рднреА рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ, рдореИрдВ рд╕рдВрдкрддреНрддрд┐ рдирд╣реАрдВ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ attribs рд╕реЗ domNode ред

рдХреНрдпреЛрдВрдХрд┐ рдЯрд╛рдЗрдкрдкреНрд░рддрд┐ рдЬрд╛рдБрдЪ domNode рдХрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИ DOMNode , рдирд╣реАрдВ Element , рдкреНрд░рдХрд╛рд░ рддреЛ рддреНрд░реБрдЯрд┐ рддрдм рд╣реЛрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣ DOMNode рдирд╣реАрдВ рд╣реИ attribs рд╕рдВрдкрддреНрддрд┐ред

рдФрд░ рдпрджрд┐ рдЖрдк рдЗрд╕ рд╢рд░реНрдд рдХреЗ рд╕рд╛рде рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рддреЛ console.log(domNode instanceof Element) рд░рд┐рдЯрд░реНрди рд╣рдореЗрд╢рд╛ рдЭреВрдард╛ рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдбреЛрдордиреЛрдб рдХрд╛ рдЙрджрд╛рд╣рд░рдг DOMNode ред

рдореЗрд░реЗ рдкрд╛рд╕ рдЗрд╕рдХрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИ, рд╢рд╛рдпрдж рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдореИрдВрдиреЗ рдкреИрд░рд╛рдореАрдЯрд░ domNode рдкрд░ Element рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИред

import parse, { HTMLReactParserOptions } from "html-react-parser";
import { Element } from "domhandler/lib/node";

export function contentHandler(postContent: string) {
  const options: HTMLReactParserOptions = {
    replace: (domNode: Element) => {
      if (domNode.attribs) {
        if (domNode.attribs.id === 'shortcode') {
          return <div className="leadform">Shortcode</div>;
        }
      }
    },
  };

  return parse(postContent, options);
}

рд╕рднреА 15 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдореБрджреНрджрд╛ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж @purp1eeeee

рдЖрдкрдХреЗ рдХреЛрдбрд╕реИрдВрдбрдмреЙрдХреНрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдЖрдк рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рддрддреНрд╡ рдирд╣реАрдВ рд▓реМрдЯрд╛ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рд░реАрдбрдореА рджреЗрдЦреЗрдВред

рддреЛ рдХреНрдпрд╛ рдЖрдк рд▓реЙрдЧ рдХреЛ рдЕрдкрдиреЗ рдХрд╕реНрдЯрдо рддрддреНрд╡ рдХреА рд╡рд╛рдкрд╕реА рд╕реЗ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ?

export default function IndexPage() {
   const html = "<h1>hoge</h1>";
   const options: HTMLReactParserOptions = {
     replace: (domNode) => {
-      console.log(domNode);
-      console.log(domNode instanceof Element);
+      if (domNode.name === "h1") {
+        return <h1>replaced</h1>;
+      }
     }
   };
   return <div>{parse(html, options)}</div>;
 }

рдЕрджреНрдпрддрди рдХреЛрдбрд╕реИрдВрдбрдмреЙрдХреНрд╕ рджреЗрдЦреЗрдВред

рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдпрд╣ рдирд┐рд░реНрджреЗрд╢ рд╣реИ, рдФрд░ рдореИрдВ рднреА рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ, рдореИрдВ рд╕рдВрдкрддреНрддрд┐ рдирд╣реАрдВ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ attribs рд╕реЗ domNode ред

рдХреНрдпреЛрдВрдХрд┐ рдЯрд╛рдЗрдкрдкреНрд░рддрд┐ рдЬрд╛рдБрдЪ domNode рдХрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИ DOMNode , рдирд╣реАрдВ Element , рдкреНрд░рдХрд╛рд░ рддреЛ рддреНрд░реБрдЯрд┐ рддрдм рд╣реЛрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣ DOMNode рдирд╣реАрдВ рд╣реИ attribs рд╕рдВрдкрддреНрддрд┐ред

рдФрд░ рдпрджрд┐ рдЖрдк рдЗрд╕ рд╢рд░реНрдд рдХреЗ рд╕рд╛рде рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рддреЛ console.log(domNode instanceof Element) рд░рд┐рдЯрд░реНрди рд╣рдореЗрд╢рд╛ рдЭреВрдард╛ рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдбреЛрдордиреЛрдб рдХрд╛ рдЙрджрд╛рд╣рд░рдг DOMNode ред

рдореЗрд░реЗ рдкрд╛рд╕ рдЗрд╕рдХрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИ, рд╢рд╛рдпрдж рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдореИрдВрдиреЗ рдкреИрд░рд╛рдореАрдЯрд░ domNode рдкрд░ Element рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИред

import parse, { HTMLReactParserOptions } from "html-react-parser";
import { Element } from "domhandler/lib/node";

export function contentHandler(postContent: string) {
  const options: HTMLReactParserOptions = {
    replace: (domNode: Element) => {
      if (domNode.attribs) {
        if (domNode.attribs.id === 'shortcode') {
          return <div className="leadform">Shortcode</div>;
        }
      }
    },
  };

  return parse(postContent, options);
}

рдореИрдВ рдкреБрд╖реНрдЯрд┐ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдореБрдЭреЗ Next.js рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд░рд╣реА рд╣реИ; рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЯрд╛рдЗрдк-рдХрд╛рд╕реНрдЯрд┐рдВрдЧ domNode рдПрдЪрдЯреАрдПрдордПрд▓-рд░рд┐рдПрдХреНрд╢рди-рдкрд╛рд░реНрд╕рд░ рдХреЛ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдПрдХрдорд╛рддреНрд░ рдХрд╛рдо рд╣реИред

@kakaeriel
рдХрд┐рддрдирд╛ рдЕрдЪреНрдЫрд╛! рдзрдиреНрдпрд╡рд╛рдж

рдЯрд╛рдЗрдкрдкреНрд░рддрд┐ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╕рд╛рде рдЗрди рдореБрджреНрджреЛрдВ рдХрд╛ рд╣реЛрдирд╛ред @kakaeriel рдХреА рддрд░рд╣ рдореИрдВ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд░ рдЕрдиреБрднрд╛рдЧ рд╕рд╣рд┐рдд рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЗрд╕ рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдкрд╛рд▓рди рдХрд░ рд░рд╣рд╛ рд╣реВрдВ

@kakaeriel рдХрд╛ рд╕рдорд╛рдзрд╛рди рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред instanceof рдСрдкрд░реЗрдЯрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ (рддрддреНрд╡ рдПрдХ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИ) рдФрд░ рдШрдВрдЯреЛрдВ рдХреЗ рдмрд╛рдж node_modules рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рдмреНрд░рд╛рдЙрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ рд╕рдорд╛рдзрд╛рди рдЦреЛрдЬрдирд╛ рдПрдХ рдЬреАрд╡рди рд░рдХреНрд╖рдХ рд╣реИред

рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕рдорд╛рдзрд╛рди @kakaeriel рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдХреНрдпрд╛ рдЖрдк README.md рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреАрдЖрд░ рдмрдирд╛рдиреЗ рдореЗрдВ рд░реБрдЪрд┐ рд▓реЗрдВрдЧреЗ?

@remarkablemark рд╣рд╛рдБ рдЬрд╝рд░реВрд░! рдореИрдВ рдПрдХ рдкреАрдЖрд░, ASAP рдмрдирд╛рдКрдВрдЧрд╛ред

рд╡рд╛рд╣ рд╡рд╛рд╣ред рдореБрдЭреЗ NextJS рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИред

рдХреНрдпреЛрдВрдХрд┐ рдЯрд╛рдЗрдкрдкреНрд░рддрд┐ рдЬрд╛рдБрдЪ domNode рдХрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИ DOMNode , рдирд╣реАрдВ Element , рдкреНрд░рдХрд╛рд░ рддреЛ рддреНрд░реБрдЯрд┐ рддрдм рд╣реЛрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣ DOMNode рдирд╣реАрдВ рд╣реИ attribs рд╕рдВрдкрддреНрддрд┐ред

```

рддреЛ рдпрд╣ рдХреЗрд╡рд▓ рдиреЗрдХреНрд╕реНрдЯрдЬреЗрдПрд╕ рдРрдк рдореЗрдВ рд╣реА рдХреНрдпреЛрдВ рд╣реЛрддрд╛ рд╣реИред
рдореИрдВ рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдРрдк рд╕реЗрдЯрдЕрдк рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рд╡рд╣рд╛рдВ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
https://codesandbox.io/s/html-parsing-and-replaceing-elements-yjtv7?file=/src/index.tsx

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ @ Naxos84ред рдореИрдВ рд╢рд░реНрдд рд▓рдЧрд╛рддрд╛ рд╣реВрдВ рдХрд┐ Next.js рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╣реИред рдХреГрдкрдпрд╛ @kakaeriel рдХреЗ рдмрд╛рд╣рд░ рдХреА рдЬрд╛рдБрдЪ рд╕рдорд╛рдзрд╛рди рдПрдХ рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдПред

@kakaeriel рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдк рдЕрдкрдиреЗ рдХрд╛рдордХрд╛рдЬ рдХреЗ рд╕рд╛рде README.md рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреАрдЖрд░ рдЦреЛрд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВред рдпрджрд┐ рдЖрдк рдпрд╣ рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде рд╣реИрдВ, рддреЛ рдореИрдВ рдпрд╣ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдзрдиреНрдпрд╡рд╛рдж!

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдиреЗрдХреНрд╕реНрдЯрдЬреЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред
рдореИрдВрдиреЗ рдереЛрдбрд╝реА рдФрд░ рдХреЛрд╢рд┐рд╢ рдХреА рдФрд░ рд╡реЛрдЗрд▓рд╛ рдиреЗ рдХрд┐рд╕реА рддрд░рд╣ рдХрд╛рдо рдХрд┐рдпрд╛ред
рдореИрдВрдиреЗ @remarkablemark codesandbox рдмрджрд▓ рджрд┐рдпрд╛ рдФрд░ console.log(domElement.constructor) рдЬреЛрдбрд╝рд╛ рдЬреИрд╕рд╛ рдХрд┐ рд╕реНрдЯреИрдХ рдУрд╡рд░рдлрд╝реНрд▓реЛ рдкрд░ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдкрд░рд┐рдгрд╛рдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рджрд┐рдЦрддрд╛ рд╣реИ:
grafik

рддреЛ рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рдХрд┐ рдпрд╣ рдЕрдЪрд╛рдирдХ рдХреНрдпреЛрдВ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ !?

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ "my" nextjs рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред
рдЕрджреНрдпрддрди: рдФрд░ рдЕрдм рдпрд╣ рдлрд┐рд░ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ ....

рдореИрдВ рдПрдХ рдХрд╕реНрдЯрдо рдЯрд╛рдЗрдкрдЧрд╛рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВред

const isElement = (domNode: DOMNode): domNode is Element => {
    const isTag = domNode.type === "tag";
    const hasAttributes = (domNode as Element).attribs !== undefined;

    return isTag && hasAttributes;
};
const parserOptions: HTMLReactParserOptions = {
    replace: domNode => {
        if (isElement(domNode)) {
            return <p>It's an element.</p>;
        } else {
            return <p>It's something else</p>;
        }
    },
};

рд╣реЗ рд╕рдм рд▓реЛрдЧ, рдореИрдВ рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде Next.js 10.x рдореЗрдВ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред рдпрд╣ рдПрдХ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕рд╛рд░ рд╣реИ рдЬрд╣рд╛рдВ рдЖрдк рдореЗрд░реЗ рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореЗрд░реЗ рд╕реЗрдЯрдЕрдк рдореЗрдВ рд╕рдорд╛рдзрд╛рди рдореЗрдВ рд╢реВрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реИрдВред

@natterstefan рдЕрдкрдирд╛ рд╕рдорд╛рдзрд╛рди рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

рдореБрдЭреЗ NextJS рдХреЗ рд╕рд╛рде рднреА рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИред рддрддреНрд╡ рд╣рдореЗрд╢рд╛ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реЛрддрд╛ рд╣реИред рдореИрдВрдиреЗ рдбреЛрдордиреЛрдб рдХреЛ рдХрд┐рд╕реА рдХреЗ рд░реВрдк рдореЗрдВ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдФрд░ рд╡рд┐рдХрд▓реНрдк рдкреНрд░рдХрд╛рд░ рдХреЛ HTMLReactParserOptions рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ред рдбреЛрдорд╣реИрдВрдбрд▓рд░ рд╕реЗ рддрддреНрд╡ рдПрд╕рдПрд╕рдЖрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ?

const options = {
  replace: (domNode: any) => {
      // ...
  }
} as HTMLReactParserOptions;

рдореИрдВ рдЗрд╕реЗ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХреЛрдб рдХреЗ рд╕рд╛рде рдареАрдХ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛, рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдорджрдж рдХрд░реЗрдЧрд╛

Screen Shot 2021-06-12 at 20 32 31

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

dave-stevens-net picture dave-stevens-net  ┬╖  9рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

ollie-o picture ollie-o  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

rscott78 picture rscott78  ┬╖  11рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

linkelvin11 picture linkelvin11  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

poacher2k picture poacher2k  ┬╖  14рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ